aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--INFO.yaml80
-rw-r--r--cmso-database/etc/config/liquibase.properties13
-rw-r--r--cmso-database/src/main/resources/cmso-dbchangelog/onap-cmso-v1.1-add-uuid.sql2
-rw-r--r--cmso-database/src/main/resources/cmso-liquibase-changeLog.xml9
-rw-r--r--cmso-database/src/main/resources/optimizer-dbchanges/onap-optimizer-v1-schema.sql (renamed from cmso-database/src/main/resources/optimizer-dbchanges/onap-cmso-v1-schema.sql)6
-rw-r--r--cmso-database/src/main/resources/optimizer-liquibase-changeLog.xml48
-rw-r--r--cmso-optimizer/data/policies/EveryDay_00_06.json47
-rw-r--r--cmso-optimizer/data/policies/Weekday_00_06.json38
-rw-r--r--cmso-optimizer/data/policies/Weekend_00_06.json38
-rw-r--r--cmso-optimizer/etc/config/README.txt3
-rw-r--r--cmso-optimizer/etc/config/cadi.properties21
-rw-r--r--cmso-optimizer/etc/config/optimizer.properties54
-rw-r--r--cmso-optimizer/pom.xml531
-rw-r--r--cmso-optimizer/scripts/minizinc/generic_attributes.mzn199
-rw-r--r--cmso-optimizer/src/main/docker/Dockerfile33
-rw-r--r--cmso-optimizer/src/main/docker/assembly/cmso-files.xml63
-rw-r--r--cmso-optimizer/src/main/docker/extra-files/startService.sh7
-rw-r--r--cmso-optimizer/src/main/java/org/onap/observations/Mdc.java279
-rw-r--r--cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java155
-rw-r--r--cmso-optimizer/src/main/java/org/onap/observations/Observation.java129
-rw-r--r--cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java49
-rw-r--r--cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java198
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java65
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java89
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java81
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java137
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java56
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java176
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java133
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java42
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java45
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java111
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java103
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java135
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java99
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/Application.java94
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/ApplicationPropertiesFiles.java37
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/AuthProvider.java58
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/CmsoEnvironmentPostProcessor.java56
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/JerseyConfiguration.java106
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SecurityConfig.java59
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SpringProfiles.java37
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManager.java113
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/AllowedPeriodicTime.java72
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/Policy.java155
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/PolicyScope.java69
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeLimitAndVerticalTopology.java127
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeRange.java50
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeSchedule.java51
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindows.java227
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/common/models/ElementCriteria.java63
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementAvailability.java197
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementWindowMapping.java148
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerClient.java279
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerRequestManager.java185
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ElementSlot.java106
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerEngineResponse.java65
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutResults.java46
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutSchedule.java60
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutYaml.java65
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerParameters.java225
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResponseUtility.java82
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResults.java46
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerSchedule.java63
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/Results.java46
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtClient.java231
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtRequestManager.java93
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsRequest.java114
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsResponse.java110
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/Availability.java35
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/TicketData.java129
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java193
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java99
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ConstraintElements.java127
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementCriteria.java63
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementLocation.java92
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckComponent.java93
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckMessage.java109
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ReferencedElementInfo.java101
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyElementInfo.java113
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyPolicyInfo.java89
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyRequest.java115
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyResponse.java130
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/Availability.java32
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/LogMessages.java283
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/core/OptimizerManager.java296
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoClientFilters.java79
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoContainerFilters.java134
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Optimizer.java109
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Request.java118
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Response.java75
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Ticket.java110
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Topology.java108
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/OptimizerDao.java38
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/RequestDao.java38
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/ResponseDao.java38
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TicketDao.java38
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TopologyDao.java38
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminTool.java63
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminToolImpl.java60
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheck.java62
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheckImpl.java106
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterface.java115
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterfaceImpl.java172
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindow.java182
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ConstraintElements.java127
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementInfo.java90
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementLocation.java92
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckComponent.java93
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckMessage.java109
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/NameValue.java94
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerRequest.java160
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerResponse.java119
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerScheduleInfo.java82
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/PolicyInfo.java88
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ReferencedElementInfo.java100
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ScheduledElement.java127
-rw-r--r--cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/UnScheduledElement.java103
-rw-r--r--cmso-optimizer/src/main/resources/META-INF/spring.factories1
-rw-r--r--cmso-optimizer/src/main/resources/aaf/AAFUserRoles.properties1
-rw-r--r--cmso-optimizer/src/main/resources/aaf/org.onap.oof.cred.props11
-rw-r--r--cmso-optimizer/src/main/resources/aaf/org.onap.oof.keyfile27
-rw-r--r--cmso-optimizer/src/main/resources/aaf/org.onap.oof.location.props8
-rw-r--r--cmso-optimizer/src/main/resources/aaf/org.onap.oof.props14
-rw-r--r--cmso-optimizer/src/main/resources/aaf/permissions.properties2
-rw-r--r--cmso-optimizer/src/main/resources/application.properties49
-rw-r--r--cmso-optimizer/src/main/resources/banner.txt10
-rw-r--r--cmso-optimizer/src/main/resources/logback.xml377
-rw-r--r--cmso-optimizer/src/main/resources/logmessages.properties28
-rw-r--r--cmso-optimizer/src/main/script/TagVersion.groovy40
-rw-r--r--cmso-optimizer/src/test/data/resultsTest001.yaml28
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/AuthProviderTest.java68
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/JtestHelper.java57
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManagerTest.java69
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindowsTest.java79
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ResultsTest.java40
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindowTest.java53
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java37
-rw-r--r--cmso-optimizer/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java48
-rw-r--r--cmso-robot/docker/Dockerfile35
-rw-r--r--cmso-service/etc/config/cmso.properties4
-rw-r--r--cmso-service/etc/config/optimizer.properties10
-rw-r--r--cmso-service/pom.xml4
-rw-r--r--cmso-service/src/main/java/org/onap/observations/Mdc.java483
-rw-r--r--cmso-service/src/main/java/org/onap/observations/Observation.java231
-rw-r--r--cmso-service/src/main/java/org/onap/observations/ObservationInterface.java79
-rw-r--r--cmso-service/src/main/java/org/onap/observations/ObservationObject.java281
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/Application.java45
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java48
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java46
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java12
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java101
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java52
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java193
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java27
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java286
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java191
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java41
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java37
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalStatusEnum.java60
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalTypesEnum.java52
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java49
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/common/CMSStatusEnum.java137
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/common/CmHelpers.java33
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/common/LogMessages.java520
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CMSOClient.java35
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CmJob.java11
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/DispatchJob.java13
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispacherService.java8
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispatcherServiceImpl.java42
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/eventq/CMSQueueJob.java25
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/eventq/CmQuartzJob.java15
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/eventq/DispatchedEventList.java16
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/filters/CmsoClientFilters.java (renamed from cmso-service/src/main/java/org/onap/optf/cmso/filters/CMSOClientFilters.java)174
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/filters/CmsoContainerFilters.java (renamed from cmso-service/src/main/java/org/onap/optf/cmso/filters/CMSOContainerFilters.java)282
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ApprovalType.java113
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementChangeWindow.java169
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementDetail.java370
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementGroup.java260
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementSchedule.java367
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/Domain.java37
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/DomainData.java60
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ElementData.java99
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/Schedule.java65
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleApproval.java93
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleEvent.java163
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleQuery.java51
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ApprovalTypeDAO.java10
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementChangeWindowDAO.java18
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementDetailDAOImpl.java42
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementGroupDAO.java18
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementScheduleDAO.java50
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/DomainDataDAO.java10
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ElementDataDAO.java (renamed from cmso-service/src/main/java/org/onap/optf/cmso/model/HelloWorld.java)107
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleApprovalDAO.java10
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleDAO.java15
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleEventDAO.java53
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleQueryDAOImpl.java18
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CmsoOptimizerClient.java (renamed from cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CMSOptimizerClient.java)796
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CmsoOptimizerHandler.java262
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/OptimizerQuartzJob.java68
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerElementInfo.java91
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerRequest.java163
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerResponse.java105
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerScheduleInfo.java82
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/ScheduledElement.java127
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/UnScheduledElement.java103
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminTool.java11
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminToolImpl.java29
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/BaseSchedulerServiceImpl.java184
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOServiceImpl.java674
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmQueryParameters.java146
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleService.java72
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleServiceImpl.java81
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizerCallback.java (renamed from cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOptimizerCallback.java)130
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizerCallbackImpl.java (renamed from cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOOptimizerCallbackImpl.java)104
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoService.java (renamed from cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOService.java)412
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java462
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CommonServiceImpl.java423
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheck.java12
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheckImpl.java65
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ApprovalMessage.java74
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSInfo.java28
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSMessage.java24
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ChangeWindowMessage.java24
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDetailsMessage.java6
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDomainDataEnum.java35
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoInfo.java176
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoMessage.java73
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckComponent.java69
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckMessage.java88
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ScheduleMessage.java92
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/VnfDetailsMessage.java64
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ChangeWindow.java96
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ElementInfo.java122
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/NameValue.java138
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/OptimizedScheduleMessage.java189
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/PolicyInfo.java78
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/SchedulingData.java193
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/so/bean/MsoOrchestrationQueryResponse.java6
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusClient.java134
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusJob.java71
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/sostatus/ScheduleStatusJob.java70
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackService.java92
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackServiceImpl.java274
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackService.java65
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackServiceImpl.java61
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmClient.java259
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmEndpoints.java53
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmStatusClient.java165
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/bean/BuildCreateRequest.java95
-rw-r--r--cmso-service/src/main/resources/logmessages.properties1
-rw-r--r--cmso-service/src/test/java/org/onap/optf/cmso/AuthProviderTest.java12
-rw-r--r--cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java109
-rw-r--r--cmso-service/src/test/java/org/onap/optf/cmso/JtestHelper.java116
-rw-r--r--cmso-service/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java85
-rw-r--r--cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java60
-rw-r--r--cmso-ticketmgt/data/a.json1
-rw-r--r--cmso-ticketmgt/pom.xml10
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/observations/Mdc.java314
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/observations/MessageHeaders.java25
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/observations/Observation.java166
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/observations/ObservationInterface.java30
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/observations/ObservationObject.java156
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java6
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java12
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/CMSRequestError.java27
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java6
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/exceptions/CMSException.java7
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/Application.java13
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/ApplicationPropertiesFiles.java9
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/AuthProvider.java22
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/CMSEnvironmentPostProcessor.java7
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/JerseyConfiguration.java13
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SecurityConfig.java14
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SpringProfiles.java9
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafAuthorizationFilter.java24
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafFilter.java16
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/FilterPriority.java9
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/ResponseFormatter.java8
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/Availability.java2
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/LogMessages.java336
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOClientFilters.java45
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOContainerFilters.java30
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminTool.java23
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminToolImpl.java16
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterface.java85
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterfaceImpl.java124
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheck.java20
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheckImpl.java16
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagement.java79
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagementImpl.java166
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsRequest.java64
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsResponse.java96
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ChangeWindow.java16
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ElementCriteria.java29
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckComponent.java4
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckMessage.java8
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/NameValue.java36
-rw-r--r--cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/TicketData.java86
-rw-r--r--cmso-ticketmgt/src/test/java/org/onap/optf/cmso/JtestHelper.java61
-rw-r--r--cmso-ticketmgt/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java49
-rw-r--r--cmso-ticketmgt/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java52
-rw-r--r--cmso-topology/data/vnf1.json1
-rw-r--r--cmso-topology/etc/config/README.txt3
-rw-r--r--cmso-topology/etc/config/cadi.properties4
-rw-r--r--cmso-topology/etc/config/topology.properties30
-rw-r--r--cmso-topology/pom.xml516
-rw-r--r--cmso-topology/src/main/docker/Dockerfile33
-rw-r--r--cmso-topology/src/main/docker/assembly/cmso-files.xml64
-rw-r--r--cmso-topology/src/main/docker/extra-files/startService.sh7
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/Mdc.java278
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java155
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/Observation.java129
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java49
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/ObservationObject.java198
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java56
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java89
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java82
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java137
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java56
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java176
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java133
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java42
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java45
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java102
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java79
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java129
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java76
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java96
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java37
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java58
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java56
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java106
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java59
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java35
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java32
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java221
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java79
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java134
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java63
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java60
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java62
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheckImpl.java106
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterface.java121
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterfaceImpl.java148
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ConstraintElements.java127
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementCriteria.java62
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementInfo.java112
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementLocation.java92
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckComponent.java93
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckMessage.java109
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/NameValue.java94
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/PolicyInfo.java88
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ReferencedElementInfo.java100
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyRequest.java113
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyResponse.java131
-rw-r--r--cmso-topology/src/main/resources/META-INF/spring.factories1
-rw-r--r--cmso-topology/src/main/resources/aaf/AAFUserRoles.properties1
-rw-r--r--cmso-topology/src/main/resources/aaf/org.onap.oof.cred.props11
-rw-r--r--cmso-topology/src/main/resources/aaf/org.onap.oof.keyfile27
-rw-r--r--cmso-topology/src/main/resources/aaf/org.onap.oof.location.props8
-rw-r--r--cmso-topology/src/main/resources/aaf/org.onap.oof.props14
-rw-r--r--cmso-topology/src/main/resources/aaf/permissions.properties2
-rw-r--r--cmso-topology/src/main/resources/application.properties61
-rw-r--r--cmso-topology/src/main/resources/banner.txt10
-rw-r--r--cmso-topology/src/main/resources/logback.xml377
-rw-r--r--cmso-topology/src/main/resources/logmessages.properties25
-rw-r--r--cmso-topology/src/main/script/TagVersion.groovy40
-rw-r--r--cmso-topology/src/test/java/org/onap/optf/cmso/AuthProviderTest.java (renamed from cmso-ticketmgt/src/test/java/org/onap/optf/cmso/AuthProviderTest.java)13
-rw-r--r--cmso-topology/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java38
-rw-r--r--cmso-topology/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java48
-rw-r--r--pom.xml4
373 files changed, 28668 insertions, 6419 deletions
diff --git a/INFO.yaml b/INFO.yaml
new file mode 100644
index 0000000..0b79111
--- /dev/null
+++ b/INFO.yaml
@@ -0,0 +1,80 @@
+---
+project: 'optf-cmso'
+project_creation_date: '2017-07-06'
+lifecycle_state: 'Incubation'
+project_lead: &onap_releng_ptl
+ name: 'Shankaranarayanan Puzhavakath Narayanan'
+ email: 'snarayanan@research.att.com'
+ id: 'snarayanan'
+ company: 'ATT'
+ timezone: 'America/Bedminster'
+project_category: ''
+primary_contact: *onap_releng_ptl
+issue_tracking:
+ type: 'jira'
+ url: 'https://jira.onap.org/projects/OPTFRA'
+ key: 'OPTFRA'
+mailing_list:
+ type: 'groups.io'
+ url: 'lists.onap.org'
+ tag: '<[sub-project_name]>'
+realtime_discussion: ''
+meetings:
+ - type: 'zoom'
+ agenda: 'https://wiki.onap.org/display/DW/Project+Resources+for+OOF'
+ url: 'https://wiki.onap.org/display/DW/Optimization+Framework+Project'
+ server: 'n/a'
+ channel: 'n/a'
+ repeats: 'weekly'
+ time: '15:00 UTC'
+repositories:
+ - 'optf-cmso'
+ - 'optf-fgps'
+ - 'optf-has'
+ - 'optf-osdf'
+committers:
+ - <<: *onap_releng_ptl
+ - name: 'Sarat Puthenpura'
+ email: 'sarat@research.att.com'
+ company: 'ATT'
+ id: 'sarat'
+ timezone: 'America/Bedminster'
+ - name: 'ramki krishnan'
+ email: 'ramkri123@gmail.com'
+ company: 'VMWare'
+ id: 'ramkri123'
+ timezone: 'America/Los_Angeles'
+ - name: 'Dileep Ranganathan'
+ email: 'dileep.ranganathan@intel.com'
+ company: 'Intel'
+ id: 'dileep.ranganathan'
+ timezone: 'America/Los_Angeles'
+ - name: 'Vikas Varma'
+ email: 'vikas.varma@att.com'
+ company: 'ATT'
+ id: 'vrvarma'
+ timezone: 'America/New_York'
+tsc:
+ approval: 'https://lists.onap.org/pipermail/onap-tsc'
+ changes:
+ - type: 'Addition'
+ name: 'Ankitkumar Patel'
+ link: 'https://lists.onap.org/pipermail/onap-tsc/2018-April/004657.html'
+ - type: 'Removal'
+ name: 'maopeng zhang'
+ name: 'Sastry Isukapalli'
+ name: 'Yoram Zini'
+ link: 'https://lists.onap.org/pipermail/onap-tsc/2018-June/004975.html'
+ - type: 'Addition'
+ name: 'ramki krishnan'
+ name: 'Dileep Ranganathan'
+ link: 'https://lists.onap.org/g/ONAP-TSC/message/3205'
+ - type: 'Removal'
+ name: 'Ankitkumar Patel'
+ link: 'https://lists.onap.org/g/ONAP-TSC/message/3550'
+ - type: 'Addition'
+ name: 'Vikas Varma'
+ link: 'http://ircbot.wl.linuxfoundation.org/meetings/onap-meeting/2018/onap-meeting.2018-08-30-13.57.log.txt'
+ - type: 'Addition'
+ name: 'Shankaranarayanan Puzhavakath Narayanan'
+ link: 'https://civs.cs.cornell.edu/cgi-bin/results.pl?id=E_2696d1c15c2fdd16' \ No newline at end of file
diff --git a/cmso-database/etc/config/liquibase.properties b/cmso-database/etc/config/liquibase.properties
index 2454070..e755bf2 100644
--- a/cmso-database/etc/config/liquibase.properties
+++ b/cmso-database/etc/config/liquibase.properties
@@ -1,5 +1,5 @@
###
-# Copyright &#194; 2017-2018 AT&T Intellectual Property.
+# Copyright 2017-2019 AT&T Intellectual Property.
# Modifications Copyright &#194; 2018 IBM.
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -39,16 +39,5 @@ spring.datasource.tomcat.initialSize=5
spring.datasource.tomcat.max-active=25
spring.datasource.tomcat.test-on-borrow=true
-
-#changeLogFile=calendar-liquibase-changeLog.xml
changeLogFile=cmso-liquibase-changeLog.xml
-
-#spring.main.web-environment=false
-#outputChangeLogFile=src/main/resources/cmso-output-changelog.xml
-#url=jdbc:mariadb://localhost:3306/calendar
-#url=jdbc:mysql://localhost:3306/cmso
-#username=root
-#password=root
-#driver=org.mariadb.jdbc.Driver
-#driver=com.mysql.jdbc.Driver
diff --git a/cmso-database/src/main/resources/cmso-dbchangelog/onap-cmso-v1.1-add-uuid.sql b/cmso-database/src/main/resources/cmso-dbchangelog/onap-cmso-v1.1-add-uuid.sql
index b11ea0a..2f6aafb 100644
--- a/cmso-database/src/main/resources/cmso-dbchangelog/onap-cmso-v1.1-add-uuid.sql
+++ b/cmso-database/src/main/resources/cmso-dbchangelog/onap-cmso-v1.1-add-uuid.sql
@@ -91,3 +91,5 @@ update SCHEDULE_APPROVALS set approval_types_uuid =
(select distinct s.uuid from SCHEDULE_APPROVALS t, APPROVAL_TYPES s where t.approval_type_id = s.id);
SET SQL_SAFE_UPDATES = 1;
+
+ALTER TABLE CHANGE_MANAGEMENT_SCHEDULES ADD COLUMN request LONGTEXT NULL DEFAULT NULL;
diff --git a/cmso-database/src/main/resources/cmso-liquibase-changeLog.xml b/cmso-database/src/main/resources/cmso-liquibase-changeLog.xml
index 0bc23c1..bf45ff9 100644
--- a/cmso-database/src/main/resources/cmso-liquibase-changeLog.xml
+++ b/cmso-database/src/main/resources/cmso-liquibase-changeLog.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--
- Copyright © 2017-2018 AT&T Intellectual Property.
+ Copyright © 2017-2019 AT&T Intellectual Property.
Modifications Copyright © 2018 IBM.
Licensed under the Apache License, Version 2.0 (the "License");
@@ -45,4 +45,11 @@
<sqlFile path="cmso-dbchangelog/onap-cmso-v1-schema.sql" />
</changeSet>
+ <changeSet author="ONAP" id="cmso-v1.1-schema1">
+ <sqlFile path="cmso-dbchangelog/onap-cmso-v1.1-drop-indices.sql" />
+ <sqlFile path="cmso-dbchangelog/onap-cmso-v1.1-add-uuid.sql" />
+ <sqlFile path="cmso-dbchangelog/onap-cmso-v1.1-restore-indices.sql" />
+ <sqlFile path="cmso-dbchangelog/onap-cmso-v1.1-drop-ids.sql" />
+ </changeSet>
+
</databaseChangeLog>
diff --git a/cmso-database/src/main/resources/optimizer-dbchanges/onap-cmso-v1-schema.sql b/cmso-database/src/main/resources/optimizer-dbchanges/onap-optimizer-v1-schema.sql
index d6e225b..d91a17e 100644
--- a/cmso-database/src/main/resources/optimizer-dbchanges/onap-cmso-v1-schema.sql
+++ b/cmso-database/src/main/resources/optimizer-dbchanges/onap-optimizer-v1-schema.sql
@@ -7,13 +7,14 @@ CREATE TABLE IF NOT EXISTS `optimizer`.`request` (
request_start BIGINT(20) NULL DEFAULT NULL,
request_end BIGINT(20) NULL DEFAULT NULL,
status VARCHAR(45) NULL DEFAULT NULL,
+ message MEDIUMTEXT NULL DEFAULT NULL,
PRIMARY KEY (`uuid`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
CREATE TABLE IF NOT EXISTS `optimizer`.`response` (
uuid BINARY(16) NOT NULL,
- repsonse LONGTEXT NULL DEFAULT NULL,
+ response LONGTEXT NULL DEFAULT NULL,
delivered_time BIGINT(20) NULL DEFAULT NULL,
PRIMARY KEY (`uuid`))
ENGINE = InnoDB
@@ -26,6 +27,7 @@ CREATE TABLE IF NOT EXISTS `optimizer`.`topology` (
topology_start BIGINT(20) NULL DEFAULT NULL,
topology_end BIGINT(20) NULL DEFAULT NULL,
topology_retries INT NULL DEFAULT NULL,
+ topology_polling_interval INT NULL DEFAULT NULL,
PRIMARY KEY (`uuid`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
@@ -36,6 +38,7 @@ CREATE TABLE IF NOT EXISTS `optimizer`.`tickets` (
tickets_start BIGINT(20) NULL DEFAULT NULL,
tickets_end BIGINT(20) NULL DEFAULT NULL,
tickets_retries INT NULL DEFAULT NULL,
+ topology_polling_interval INT NULL DEFAULT NULL,
PRIMARY KEY (`uuid`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
@@ -46,6 +49,7 @@ CREATE TABLE IF NOT EXISTS `optimizer`.`optimizer` (
optimize_start BIGINT(20) NULL DEFAULT NULL,
optimize_end BIGINT(20) NULL DEFAULT NULL,
optimize_retries INT NULL DEFAULT NULL,
+ optimize_polling_interval INT NULL DEFAULT NULL,
PRIMARY KEY (`uuid`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
diff --git a/cmso-database/src/main/resources/optimizer-liquibase-changeLog.xml b/cmso-database/src/main/resources/optimizer-liquibase-changeLog.xml
new file mode 100644
index 0000000..e735975
--- /dev/null
+++ b/cmso-database/src/main/resources/optimizer-liquibase-changeLog.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+ Copyright © 2017-2019 AT&T Intellectual Property.
+ Modifications Copyright © 2018 IBM.
+
+ Licensed 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.
+
+
+ Unless otherwise specified, all documentation contained herein is licensed
+ under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ you may not use this documentation except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://creativecommons.org/licenses/by/4.0/
+
+ Unless required by applicable law or agreed to in writing, documentation
+ 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.
+-->
+
+<databaseChangeLog
+ xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+ xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
+
+ <changeSet author="ONAP" id="optimizer-v1-schema1">
+ <preConditions onFail="MARK_RAN">
+ <not>
+ <tableExists schemaName="optimizer" tableName="request" />
+ </not>
+ </preConditions>
+ <sqlFile path="optimizer-dbchanges/onap-optimizer-v1-schema.sql" />
+ </changeSet>
+
+</databaseChangeLog>
diff --git a/cmso-optimizer/data/policies/EveryDay_00_06.json b/cmso-optimizer/data/policies/EveryDay_00_06.json
new file mode 100644
index 0000000..53350ff
--- /dev/null
+++ b/cmso-optimizer/data/policies/EveryDay_00_06.json
@@ -0,0 +1,47 @@
+{
+ "service": "TimeLimitAndVerticalTopology",
+ "policyName": "CMSO.Weekday_00_06",
+ "description": "dev instance",
+ "templateVersion": "Dublin",
+ "version": "0001",
+ "priority": "4",
+ "riskType": "test",
+ "riskLevel": "3",
+ "guard": "False",
+ "content": {
+ "serviceType": "networkOnDemand",
+ "identity": "vnf_upgrade_policy",
+ "policyScope": {
+ "serviceType": ["networkOnDemand"],
+ "aicZone": [
+ " "
+ ],
+ "entityType": ["vnf"]
+ },
+ "timeSchedule": {
+ "allowedPeriodicTime": [
+ {
+ "day": "weekday",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+ },
+ {
+ "day": "weekend",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+ }
+ ]
+ },
+ "nodeType": ["vnf"],
+ "type": "timeLimitAndVerticalTopology",
+ "conflictScope": "vnf_pserver"
+ }
+} \ No newline at end of file
diff --git a/cmso-optimizer/data/policies/Weekday_00_06.json b/cmso-optimizer/data/policies/Weekday_00_06.json
new file mode 100644
index 0000000..4a14581
--- /dev/null
+++ b/cmso-optimizer/data/policies/Weekday_00_06.json
@@ -0,0 +1,38 @@
+{
+ "service": "TimeLimitAndVerticalTopology",
+ "policyName": "CMSO.Weekday_00_06",
+ "description": "dev instance",
+ "templateVersion": "Dublin",
+ "version": "0001",
+ "priority": "4",
+ "riskType": "test",
+ "riskLevel": "3",
+ "guard": "False",
+ "content": {
+ "serviceType": "networkOnDemand",
+ "identity": "vnf_upgrade_policy",
+ "policyScope": {
+ "serviceType": ["networkOnDemand"],
+ "aicZone": [
+ " "
+ ],
+ "entityType": ["vnf"]
+ },
+ "timeSchedule": {
+ "allowedPeriodicTime": [
+ {
+ "day": "weekday",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+ }
+ ]
+ },
+ "nodeType": ["vnf"],
+ "type": "timeLimitAndVerticalTopology",
+ "conflictScope": "vnf_pserver"
+ }
+} \ No newline at end of file
diff --git a/cmso-optimizer/data/policies/Weekend_00_06.json b/cmso-optimizer/data/policies/Weekend_00_06.json
new file mode 100644
index 0000000..5e26cb4
--- /dev/null
+++ b/cmso-optimizer/data/policies/Weekend_00_06.json
@@ -0,0 +1,38 @@
+{
+ "service": "TimeLimitAndVerticalTopology",
+ "policyName": "CMSO.Weekday_00_06",
+ "description": "dev instance",
+ "templateVersion": "Dublin",
+ "version": "0001",
+ "priority": "4",
+ "riskType": "test",
+ "riskLevel": "3",
+ "guard": "False",
+ "content": {
+ "serviceType": "networkOnDemand",
+ "identity": "vnf_upgrade_policy",
+ "policyScope": {
+ "serviceType": ["networkOnDemand"],
+ "aicZone": [
+ " "
+ ],
+ "entityType": ["vnf"]
+ },
+ "timeSchedule": {
+ "allowedPeriodicTime": [
+ {
+ "day": "weekend",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+ }
+ ]
+ },
+ "nodeType": ["vnf"],
+ "type": "timeLimitAndVerticalTopology",
+ "conflictScope": "vnf_pserver"
+ }
+} \ No newline at end of file
diff --git a/cmso-optimizer/etc/config/README.txt b/cmso-optimizer/etc/config/README.txt
new file mode 100644
index 0000000..f815955
--- /dev/null
+++ b/cmso-optimizer/etc/config/README.txt
@@ -0,0 +1,3 @@
+The files in this etc/config folder are here for testing locally on eclipse.
+
+The files actually deployed are elsewhere
diff --git a/cmso-optimizer/etc/config/cadi.properties b/cmso-optimizer/etc/config/cadi.properties
new file mode 100644
index 0000000..9a6b91c
--- /dev/null
+++ b/cmso-optimizer/etc/config/cadi.properties
@@ -0,0 +1,21 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==============================================
+# Copyright (c) 2019 AT&T Intellectual Property.
+# =======================================================================
+# Licensed 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.
+# ============LICENSE_END=================================================
+#
+#-------------------------------------------------------------------------------
+cadi_loglevel=DEBUG
+cadi_prop_files=src/main/resources/aaf/org.onap.oof.props
+
diff --git a/cmso-optimizer/etc/config/optimizer.properties b/cmso-optimizer/etc/config/optimizer.properties
new file mode 100644
index 0000000..641bbeb
--- /dev/null
+++ b/cmso-optimizer/etc/config/optimizer.properties
@@ -0,0 +1,54 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==============================================
+# Copyright (c) 2019 AT&T Intellectual Property.
+# =======================================================================
+# Licensed 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.
+# ============LICENSE_END=================================================
+#
+#-------------------------------------------------------------------------------
+###
+
+### MySQL DB.
+spring.datasource.url=jdbc:mariadb://localhost:3306/optimizer
+spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
+spring.datasource.username=root
+spring.datasource.password=beer
+cmso.database.password=beer
+
+spring.datasource.initialize=false
+spring.datasource.tomcat.max-wait=10000
+spring.datasource.tomcat.initialSize=5
+spring.datasource.tomcat.max-active=25
+spring.datasource.tomcat.test-on-borrow=true
+
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=none
+spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.EJB3NamingStrategy
+spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
+spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
+spring.jpa.hibernate.id.new_generator_mappings=false
+hibernate.id.new_generator_mappings=false
+
+logging.level.org.hibernate.SQL=TRACE
+
+logging.level.org.hibernate=TRACE
+
+
+cmso.topology.create.request.url=http://127.0.0.1:7998/topology/v1/current
+cmso.ticket.create.request.url=http://127.0.0.1:7999/ticketmgt/v1/activetickets
+cmso.local.policy.folder=data/policies
+
+cmso.minizinc.command.exe="C:/Program Files/MiniZinc IDE (bundled)/minizinc.exe"
+cmso.minizinc.command.solver=OSICBC
+cmso.minizinc.command.timelimit=60000
+cmso.minizinc.command.mzn=scripts/minizinc/generic_attributes.mzn
diff --git a/cmso-optimizer/pom.xml b/cmso-optimizer/pom.xml
new file mode 100644
index 0000000..2ede9e7
--- /dev/null
+++ b/cmso-optimizer/pom.xml
@@ -0,0 +1,531 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ============LICENSE_START=======================================================
+ org.onap.optf.cmso ================================================================================
+ Copyright © 2019 AT&T Intellectual Property. All rights reserved. ================================================================================
+ Licensed 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. ============LICENSE_END========================================================= -->
+
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onap.optf.cmso</groupId>
+ <artifactId>cmso</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.onap.optf.cmso.optimizer</groupId>
+ <artifactId>cmso-optimizer</artifactId>
+
+ <packaging>jar</packaging>
+
+ <name>cmso</name>
+
+ <properties>
+ <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
+
+ <cmso.project.version>${project.version}</cmso.project.version>
+ <cmso.build.timestamp>${maven.build.timestamp}</cmso.build.timestamp>
+
+ <service.name>cmso</service.name>
+ <release-tag>Dublin</release-tag>
+ <name.space>org.onap.optf.cmso</name.space>
+ <serviceArtifactName>cmso</serviceArtifactName>
+
+ <java.version>1.8</java.version>
+ <eelf.version>1.0.0</eelf.version>
+ <pact.version>3.3.9</pact.version>
+ <spring.version>5.0.10.RELEASE</spring.version>
+ <spring.boot.version>2.1.3.RELEASE</spring.boot.version>
+ <swagger.core.version>2.0.0</swagger.core.version>
+
+ <maven.compiler.target>1.8</maven.compiler.target>
+ <maven.compiler.source>1.8</maven.compiler.source>
+ <build.number>${maven.build.timestamp}</build.number>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
+ <mariadb.version>2.2.1</mariadb.version>
+ <swagger.directory>${basedir}/src/main/resources/META-INF/resources/swagger/</swagger.directory>
+ <aaf.version>2.1.4</aaf.version>
+
+ <!-- Sonar -->
+ <ilib.version>2.0.7</ilib.version>
+ <sonar.language>java</sonar.language>
+ <jacoco.path>${basedir}/target/jacoco_report</jacoco.path>
+ <jacoco.itPath>${basedir}/target/jacoco_itReport</jacoco.itPath>
+ <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
+ <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
+ <sonar.jacoco.reportPath>${basedir}/target/jacoco-ut.exec</sonar.jacoco.reportPath>
+ <sonar.jacoco.itReportPath>${basedir}/target/jacoco-it.exec</sonar.jacoco.itReportPath>
+ <sonar.surefire.reportsPath>${basedir}/target/surefire-reports</sonar.surefire.reportsPath>
+ <sonar.failsafe.reportsPath>${basedir}/target/failsafe-reports</sonar.failsafe.reportsPath>
+
+ <docker.push.registry>localhost:5000</docker.push.registry>
+ <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
+ <docker.skip.build>false</docker.skip.build>
+ <docker.skip.push>false</docker.skip.push>
+ <docker.skip.tag>false</docker.skip.tag>
+ <skip.staging.artifacts>false</skip.staging.artifacts>
+
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <!-- Spring boot -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>${spring.boot.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-jersey</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-security</artifactId>
+ </dependency>
+ <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader-tools</artifactId>
+ </dependency> -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-jpa</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ </dependency>
+ <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>
+ </dependency> -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-configuration-processor</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>2.6</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-aop</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-expression</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-tx</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context-support</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ <version>${eelf.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ </exclusion>
+
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.yaml</groupId>
+ <artifactId>snakeyaml</artifactId>
+ </dependency>
+
+ <!-- <dependency> <groupId>org.onap.aaf.authz</groupId> <artifactId>aaf-cadi-aaf</artifactId>
+ <version>2.1.1</version> </dependency> -->
+ <dependency>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>javax.ws.rs-api</artifactId>
+ <version>2.1</version>
+ </dependency>
+
+ <!--Swagger Dependencies -->
+ <dependency>
+ <groupId>io.swagger.core.v3</groupId>
+ <artifactId>swagger-jaxrs2</artifactId>
+ <version>${swagger.core.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.swagger.core.v3</groupId>
+ <artifactId>swagger-jaxrs2-servlet-initializer</artifactId>
+ <version>${swagger.core.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-jersey2-jaxrs</artifactId>
+ <version>1.5.0</version>
+ </dependency>
+
+
+ <!-- Database -->
+ <dependency>
+ <groupId>org.mariadb.jdbc</groupId>
+ <artifactId>mariadb-java-client</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.scala-saddle</groupId>
+ <artifactId>google-rfc-2445</artifactId>
+ <version>20110304</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-text</artifactId>
+ <version>1.6</version>
+ </dependency>
+ <!-- Testing Dependencies -->
+ <!-- <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId>
+ <version>1.7.4</version> <scope>test</scope> </dependency> -->
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>1.9.5</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <version>0.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.aaf.authz</groupId>
+ <artifactId>aaf-cadi-aaf</artifactId>
+ <version>${aaf.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>cmso-optimizer</finalName>
+ <plugins>
+ <plugin>
+ <groupId>au.com.dius</groupId>
+ <artifactId>pact-jvm-provider-maven_2.11</artifactId>
+ <version>${pact.version}</version>
+ <configuration>
+ <!--pactBrokerUrl,user name,password and project version required only
+ for consumer -->
+ <pactBrokerUrl>${BROKER_URL}</pactBrokerUrl>
+ <pactBrokerUsername>pactadmin</pactBrokerUsername>
+ <pactBrokerPassword>pactadmin</pactBrokerPassword>
+ <projectVersion>1.0.0</projectVersion>
+ <!-- service provider required only for producer -->
+ <serviceProviders>
+ <serviceProvider>
+ <name>core</name>
+ <protocol>http</protocol>
+ <host>${APP_URL}</host>
+ <port>${APP_PORT}</port>
+ <path>/</path>
+ <pactBroker>
+ <url>${BROKER_URL}</url>
+ <authentication>
+ <username>pactadmin</username>
+ <password>pactadmin</password>
+ </authentication>
+ </pactBroker>
+ </serviceProvider>
+ </serviceProviders>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>com.github.kongchen</groupId>
+ <artifactId>swagger-maven-plugin</artifactId>
+ <version>3.1.5</version>
+ <configuration>
+ <apiSources>
+ <apiSource>
+ <locations>
+ <location>org.onap.optf.cmso.optimizer.service.rs</location>
+ </locations>
+ <basePath>/optimizer</basePath>
+ <info>
+ <title>${project.artifactId}</title>
+ <version>${project.version}</version>
+ </info>
+ <swaggerDirectory>${swagger.directory}</swaggerDirectory>
+ </apiSource>
+ </apiSources>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.groovy.maven</groupId>
+ <artifactId>gmaven-plugin</artifactId>
+ <version>1.0</version>
+ <executions>
+ <execution>
+ <phase>validate</phase>
+ <goals>
+ <goal>execute</goal>
+ </goals>
+ <configuration>
+ <source>${project.basedir}/src/main/script/TagVersion.groovy</source>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>exec-maven-plugin</artifactId>
+ <groupId>org.codehaus.mojo</groupId>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <version>${spring.boot.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>repackage</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>0.26.0</version>
+ <configuration>
+ <verbose>true</verbose>
+ <apiVersion>1.23</apiVersion>
+ <images>
+ <image>
+ <name>onap/optf-cmso-tciketmgt</name>
+ <alias>onap-optf-cmso-tciketmgt</alias>
+ <build>
+ <cleanup>true</cleanup>
+ <tags>
+ <tag>latest</tag>
+ <tag>${project.docker.latesttagtimestamp.version}</tag>
+ <tag>${project.docker.latesttag.version}</tag>
+ </tags>
+ <dockerFile>${project.basedir}/src/main/docker/Dockerfile</dockerFile>
+ <assembly>
+ <descriptor>${project.basedir}/src/main/docker/assembly/cmso-files.xml</descriptor>
+ <name>onap-cmso-optimizer</name>
+ </assembly>
+ </build>
+ </image>
+ </images>
+ </configuration>
+ <executions>
+ <execution>
+ <id>generate-images</id>
+ <phase>install</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>push-images</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>build</goal>
+ <goal>push</goal>
+ </goals>
+ <configuration>
+ <image>onap/optf-cmso-optimizer:%l</image>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <!-- mention the logback.xml location through system property or environment
+ variable to edit logback.xml at run time -->
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>etc/config</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>${basedir}/truststore</directory>
+ <targetPath>${basedir}/target/truststore</targetPath>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>${basedir}/bin</directory>
+ <targetPath>${basedir}/target/bin</targetPath>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>${basedir}/data</directory>
+ <targetPath>${basedir}/target/data</targetPath>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ </resources>
+ <pluginManagement>
+ <plugins>
+ <!--This plugin's configuration is used to store Eclipse m2e settings
+ only. It has no influence on the Maven build itself. -->
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>
+ com.github.kongchen
+ </groupId>
+ <artifactId>
+ swagger-maven-plugin
+ </artifactId>
+ <versionRange>
+ [3.1.5]
+ </versionRange>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>snapshot</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <properties>
+ <versionSuffix>-${build.number}-${release-tag}</versionSuffix>
+ </properties>
+ </profile>
+ <profile>
+ <id>next-stable</id>
+ <properties>
+ <versionSuffix>-${release-tag}</versionSuffix>
+ </properties>
+ </profile>
+ <profile>
+ <id>last-stable</id>
+ <properties>
+ <versionSuffix>-${release-tag}</versionSuffix>
+ </properties>
+ </profile>
+ </profiles>
+</project>
diff --git a/cmso-optimizer/scripts/minizinc/generic_attributes.mzn b/cmso-optimizer/scripts/minizinc/generic_attributes.mzn
new file mode 100644
index 0000000..af38df9
--- /dev/null
+++ b/cmso-optimizer/scripts/minizinc/generic_attributes.mzn
@@ -0,0 +1,199 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% element scheduling problem
+%% Modified on Mar 08, 2019
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Required (core) parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Number of elements.
+int: numElements;
+
+% Number of loaders/engineers.
+int: numLoaders;
+
+% Index of last possible time-slot for scheduling These time slots can be
+% minutes, hours, or nights. E.g., if scheduling happens at the granularity of
+% nights, 1st night is counted as 1, 2nd night counted as 2, and so on. OTOH,
+% if we have 6 hours each night and we are scheduling at the granularity of
+% hours, 1st hour of 1st night is 1, 1st hour of 2nd night is 7, and so on.
+int: maxTime;
+
+% TRUE, if i-th element does NOT have a conflict on j-th timeslot/night.
+array[1..numElements, 1..maxTime] of bool: noConflict;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Optional parameters (defined via policy)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Each attribute is composed of 3 parameters that must be supplied. When an
+% attribute is selected, all parameters related to it must be given.
+
+%%%%%%%%%%%%%%%%%%%%
+% Timeslots / nights capacities
+%%%%%%%%%%%%%%%%%%%%
+
+% Maximum number of elements that can be scheduled on j-th timeslot/night.
+array[1..maxTime] of 0..numElements: elementSlotCapacity;
+
+%%%%%%%%%%%%%%%%%%%%
+% Loader capacities
+%%%%%%%%%%%%%%%%%%%%
+
+% Maximum number of elements that can be assigned to the j-th loader per
+% timeslot/night.
+array[1..numLoaders, 1..maxTime] of 0..numElements: loaderCapacity;
+
+%%%%%%%%%%%%%%%%%%%%
+% Attribute matrix
+%%%%%%%%%%%%%%%%%%%%
+
+% Number of attributes for wach node, e.g., hardware, software, oss, market,
+% pool, etc.
+int: numAttributes;
+
+% Assume that i-th attribute has a range 0..attribute_range[i].
+% Assume that 0 indicates NA. E.g, we may have pools and a node
+% that does not belong to any pools will have 'pool attribute = 0
+% when we write constraints, we only consider attribute values >= 1.
+array[1..numAttributes] of int: attributesRange;
+
+% The attribute matrix that holds values of each attribute for a element.
+array[1..numElements, 1..numAttributes] of int: attributes;
+
+% Maximum number of nodes per time-slot that match on a given attribute.
+array[1..numAttributes, 1..maxTime] of int: attributeConcurrencyLimit;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Variables
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% TRUE, if i-th element gets scheduled on j-th night.
+array[1..numElements, 1..maxTime] of var bool: ELEMENT2TIMESLOT;
+
+% TRUE, if i-th element gets scheduled to j-th loader.
+array[1..numElements, 1..numLoaders] of var bool: ELEMENT2LOADER;
+
+% Indicates the time slot (nigth) in which the elements were scheduled.
+array[1..numElements] of var 0..maxTime: SCHEDULED_SLOT =
+ [sum(j in 1..maxTime)(j * bool2int(ELEMENT2TIMESLOT[i,j])) | i in 1..numElements];
+
+% Indicates the loader for which the elements were scheduled.
+array[1..numElements] of var 0..numLoaders: SCHEDULED_LOADER =
+ [sum(l in 1..numLoaders)(l * bool2int(ELEMENT2LOADER[i,l])) | i in 1..numElements];
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Constraints
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Required (core) constraints
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Schedule only on noConclict nights.
+constraint
+forall(i in 1..numElements, j in 1..maxTime)(
+ ELEMENT2TIMESLOT[i,j] -> noConflict[i,j]
+);
+
+% Schedule a element to a loader
+constraint
+forall(i in 1..numElements)(
+ sum(t in 1..maxTime)(bool2int(ELEMENT2TIMESLOT[i,t])) ==
+ sum(l in 1..numLoaders)(bool2int(ELEMENT2LOADER[i,l]))
+);
+
+% Schedule each element exactly one timeslot/night (or none).
+constraint
+forall(i in 1..numElements)(
+ sum(j in 1..maxTime)(bool2int(ELEMENT2TIMESLOT[i,j])) <= 1
+);
+
+% Schedule each element exactly one loader (or none).
+constraint
+forall(i in 1..numElements)(
+ sum(j in 1..numLoaders)(bool2int(ELEMENT2LOADER[i,j])) <= 1
+);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Optional constraints (defined via policy)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%These constraints are defined via policy and require sets of parameters also
+%defined via policy. They must be both available.
+
+%%%%%%%%%%%%%%%%%%%%
+% General capacity constraints
+%%%%%%%%%%%%%%%%%%%%
+
+% Satisfy element timeslot/nightly capacity.
+constraint
+forall(j in 1..maxTime)(
+ sum(i in 1..numElements)(bool2int(ELEMENT2TIMESLOT[i,j])) <= elementSlotCapacity[j]
+);
+
+% Satisfy loader/timeslot capacity.
+constraint
+forall(l in 1..numLoaders, t in 1..maxTime)(
+ sum(i in 1..numElements)(
+ bool2int(ELEMENT2LOADER[i,l] /\ ELEMENT2TIMESLOT[i,t])
+ ) <= loaderCapacity[l,t]
+);
+
+%%%%%%%%%%%%%%%%%%%%
+% Attribute capacity constraints
+%%%%%%%%%%%%%%%%%%%%
+
+% For attribute a and timeslot/night t, limits the number of elements having
+% the same value for attribute k, scheduled in the same timeslot/night t.
+constraint
+forall(t in 1..maxTime, a in 1..numAttributes)(
+ forall(m in 1..attributesRange[a])(
+ sum(i in 1..numElements)(
+ bool2int(attributes[i,a] == m /\ ELEMENT2TIMESLOT[i,t])
+ ) <= attributeConcurrencyLimit[a,t]
+ )
+);
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Objective function
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Computes the number of scheduled elements.
+var int: NUM_SCHEDULED = sum(i in 1..numElements)(bool2int(SCHEDULED_SLOT[i] > 0));
+
+% Computes the (average) completion time of all elements. Note that average is
+% just a simple division by a constant, and it can be dropped from the model
+% for robusteness.
+var int: TOTAL_COMPLETION_TIME = sum(i in 1..numElements)(SCHEDULED_SLOT[i]);
+
+% First, maximize the number of scheduled elements (using a heavy weight)
+% and then minimize the (average) completion time for all elements.
+solve maximize maxTime * numElements * NUM_SCHEDULED - TOTAL_COMPLETION_TIME;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Output
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+output
+["results:"] ++
+["\n -"] ++
+["\n num_scheduled: " ++ show(NUM_SCHEDULED)] ++
+["\n total_completion_time: " ++ show(TOTAL_COMPLETION_TIME)] ++
+["\n element_slot_loader: |"] ++
+[
+ "\n " ++ show(element) ++ "," ++ show(SCHEDULED_SLOT[element]) ++ "," ++
+ show(SCHEDULED_LOADER[element])
+| element in 1..numElements
+]
+
+%output
+%["\n - num_scheduled: " ++ show(NUM_SCHEDULED)] ++
+%["\n total_completion_time: " ++ show(TOTAL_COMPLETION_TIME)] ++
+%["\n elementSlotLoader |"] ++
+%[ "\n " ++ show(element) ++ "," ++
+%show(SCHEDULED_SLOT[element]) ++ "," ++ show(SCHEDULED_LOADER[element]) | element in
+%1..numElements ]
diff --git a/cmso-optimizer/src/main/docker/Dockerfile b/cmso-optimizer/src/main/docker/Dockerfile
new file mode 100644
index 0000000..9ef42ab
--- /dev/null
+++ b/cmso-optimizer/src/main/docker/Dockerfile
@@ -0,0 +1,33 @@
+FROM ubuntu:16.04
+
+MAINTAINER "The Onap Team"
+LABEL Description="This image contains ubuntu 16.04 with the openjdk installed" Version="16.04-8"
+ENV APP_HOME=/opt/app/cmso
+ARG http_proxy
+ARG https_proxy
+ENV HTTP_PROXY=$http_proxy
+ENV HTTPS_PROXY=$https_proxy
+ENV http_proxy=$HTTP_PROXY
+ENV https_proxy=$HTTPS_PROXY
+
+RUN test -n "$http_proxy" && echo "Acquire::Proxy \"http://$http_proxy\";" > /etc/apt/apt.conf.d/02proxy || true && \
+ apt-get update && \
+ apt-get -y dist-upgrade && \
+ apt-get install -y openjdk-8-jre-headless
+
+COPY onap-cmso-optimizer/cmso-optimizer.jar ${APP_HOME}/app.jar
+
+VOLUME /share/etc
+VOLUME /share/logs
+VOLUME /share/debug-logs
+
+COPY onap-cmso-optimizer/startService.sh ${APP_HOME}/startService.sh
+COPY onap-cmso-optimizer/data ${APP_HOME}/data
+
+RUN chmod 700 ${APP_HOME}/startService.sh
+RUN ln -s /share/etc ${APP_HOME}/etc
+RUN ln -s /share/logs ${APP_HOME}/logs
+RUN ln -s /share/debug-logs ${APP_HOME}/debug-logs
+
+WORKDIR ${APP_HOME}
+ENTRYPOINT ./startService.sh
diff --git a/cmso-optimizer/src/main/docker/assembly/cmso-files.xml b/cmso-optimizer/src/main/docker/assembly/cmso-files.xml
new file mode 100644
index 0000000..2e3f19e
--- /dev/null
+++ b/cmso-optimizer/src/main/docker/assembly/cmso-files.xml
@@ -0,0 +1,63 @@
+<!-- ============LICENSE_START=======================================================
+ Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. ================================================================================
+ Licensed 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. ============LICENSE_END========================================================= -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+ <id>cmso-files</id>
+
+ <formats>
+ <format>tar.gz</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+
+ <fileSets>
+ <!-- include config files -->
+ <fileSet>
+ <includes>
+ <include>${project.build.finalName}.jar</include>
+ </includes>
+ <directory>${project.build.directory}</directory>
+ <outputDirectory>/</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <includes>
+ <include>**</include>
+ </includes>
+ <directory>src/main/docker/extra-files</directory>
+ <outputDirectory>/</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <includes>
+ <include>**</include>
+ </includes>
+ <directory>data</directory>
+ <outputDirectory>/data</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>${project.basedir}/src/main/resources</directory>
+ <outputDirectory>./resources</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <directory>${project.basedir}/etc/config</directory>
+ <outputDirectory>./</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+
+</assembly>
diff --git a/cmso-optimizer/src/main/docker/extra-files/startService.sh b/cmso-optimizer/src/main/docker/extra-files/startService.sh
new file mode 100644
index 0000000..199c637
--- /dev/null
+++ b/cmso-optimizer/src/main/docker/extra-files/startService.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+VM_ARGS="${VM_ARGS} -Dserver.local.startpath=${RESOURCES_HOME}"
+
+echo "VM_ARGS="${VM_ARGS}
+
+java -Djava.security.egd=file:/dev/./urandom ${VM_ARGS} -Xms256m -Xmx1024m -jar ./app.jar
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java b/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java
new file mode 100644
index 0000000..5dea5aa
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java
@@ -0,0 +1,279 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import static com.att.eelf.configuration.Configuration.MDC_BEGIN_TIMESTAMP;
+import static com.att.eelf.configuration.Configuration.MDC_END_TIMESTAMP;
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+import static com.att.eelf.configuration.Configuration.MDC_PARTNER_NAME;
+import static com.att.eelf.configuration.Configuration.MDC_REMOTE_HOST;
+import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_CODE;
+import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_DESC;
+import static com.att.eelf.configuration.Configuration.MDC_STATUS_CODE;
+import static com.att.eelf.configuration.Configuration.MDC_TARGET_ENTITY;
+import static com.att.eelf.configuration.Configuration.MDC_TARGET_SERVICE_NAME;
+
+import com.att.eelf.utils.Stopwatch;
+import java.net.URI;
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response.StatusType;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.slf4j.MDC;
+
+/**
+ * EELF logging MDC fields not defined in the MDC Configuration (i.e. MDC_ALERT_SEVERITY)
+ **/
+public class Mdc {
+
+ /** The Constant SERVICE_NAME. */
+ public static final String SERVICE_NAME = "CSS-Scheduler";
+
+ /**
+ * The Enum Enum.
+ */
+ public enum Enum {
+ // BeginTimestamp,
+ // EndTimeStamp,
+ // RequestId,
+ // ServiceInstanceId,
+ VirtualServerName,
+ // ServiceName,
+ // PartnerName,
+ // StatusCOde,
+ // ResponseCode,
+ // ResponseDescription,
+ // InstanceUUID,
+ // AlertSeverity,
+ // ServerIPAddress,
+ // ElapsedTime,
+ // ServerFQDN,
+ // RemoteHost,
+ ClassName,
+ Unused,
+ // ProcessKey,
+ CustomField1,
+ CustomField2,
+ CustomField3,
+ CustomField4,
+ // TargetVirtualEntity,
+ // TargetEntity,
+ // TargetServiceName,
+ ErrorCode,
+ ErrorDescription,
+ Timer,
+ }
+
+ /**
+ * Gets the caller.
+ *
+ * @param back the back
+ * @return the caller
+ */
+ public static String getCaller(int back) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
+ return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName();
+ }
+
+ /**
+ * Sets the caller.
+ *
+ * @param back the new caller
+ */
+ public static void setCaller(int back) {
+ String caller = MDC.get(Enum.ClassName.name());
+ if (caller == null) {
+ MDC.put(Enum.ClassName.name(), getCaller(back));
+ }
+ }
+
+ /**
+ * Sets the observation.
+ *
+ * @param obs the new observation
+ */
+ public static void setObservation(ObservationInterface obs) {
+ MDC.put(Enum.CustomField4.name(), obs.name());
+ }
+
+ /**
+ * Clear caller.
+ */
+ public static void clearCaller() {
+ MDC.remove(Enum.ClassName.name());
+ }
+
+
+ /**
+ * Save.
+ *
+ * @return the map
+ */
+ public static Map<String, String> save() {
+ Map<String, String> save = MDC.getCopyOfContextMap();
+ return save;
+ }
+
+ /**
+ * Restore.
+ *
+ * @param mdcSave the mdc save
+ */
+ public static void restore(Map<String, String> mdcSave) {
+ MDC.clear();
+ for (String name : mdcSave.keySet()) {
+ MDC.put(name, mdcSave.get(name));
+ }
+ }
+
+
+
+ /**
+ * Sets the request id if not set.
+ *
+ * @param requestId the new request id if not set
+ */
+ public static void setRequestIdIfNotSet(String requestId) {
+ if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals("")) {
+ setRequestId(requestId);
+ }
+ }
+
+ /**
+ * Sets the request id.
+ *
+ * @param requestId the new request id
+ */
+ public static void setRequestId(String requestId) {
+ MDC.put(MDC_KEY_REQUEST_ID, requestId);
+ }
+
+ /**
+ * Metric start.
+ *
+ * @param requestContext the request context
+ */
+ public static void metricStart(ClientRequestContext requestContext) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setPartnerTargetFromUri(requestContext.getUri());
+ }
+
+ /**
+ * Metric end.
+ *
+ * @param response the response
+ */
+ public static void metricEnd(ClientResponseContext response) {
+
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ /**
+ * Audit start.
+ *
+ * @param requestContext the request context
+ * @param servletRequest the servlet request
+ */
+ public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost());
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId != null) {
+ setRequestId(transactionId);
+ } else {
+ setRequestId(UUID.randomUUID().toString());
+ }
+
+ }
+
+ /**
+ * Audit end.
+ *
+ * @param requestContext the request context
+ * @param response the response
+ */
+ public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response) {
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ private static void setResponseInfo(StatusType statusInfo) {
+ Integer status = statusInfo.getStatusCode();
+ String completed = "ERROR";
+ if (status >= 200 && status < 300) {
+ completed = "COMPLETE";
+ }
+ MDC.put(MDC_RESPONSE_CODE, status.toString());
+ MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase());
+ MDC.put(MDC_STATUS_CODE, completed);
+ }
+
+ /**
+ * Sets the event.
+ *
+ * @param requestId the new event
+ */
+ public static void setEvent(String requestId) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setRequestId(requestId);
+ }
+
+ private static void setPartnerTargetFromUri(URI uri) {
+ try {
+ MDC.put(MDC_PARTNER_NAME, uri.getHost());
+ MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort());
+ MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath());
+ } catch (Exception e) {
+ MDC.put(MDC_PARTNER_NAME, "UNKNOWN");
+ MDC.put(MDC_TARGET_ENTITY, "UNKNOWN");
+ MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN");
+ }
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java b/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java
new file mode 100644
index 0000000..fe6cea2
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * The Class MessageHeaders.
+ */
+public class MessageHeaders {
+
+ /**
+ * The Enum HeadersEnum.
+ */
+ public enum HeadersEnum {
+ UNDEFINED("UNDEFINED"),
+ TransactionID("X-TransactionId"),
+ FromAppID("X-FromAppId"),
+ MinorVersion("X-MinorVersion"),
+ PatchVersion("X-PatchVersion"),
+ LatestVersion("X-LatestVersion"),;
+
+ private final String text;
+
+ private HeadersEnum(String text) {
+ this.text = text;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ return text;
+ }
+ }
+
+ /** The Constant supportedMajorVersions. */
+ public static final Map<String, String> supportedMajorVersions = new HashMap<String, String>();
+
+ static {
+ supportedMajorVersions.put("v1", "0");
+ supportedMajorVersions.put("v2", "0");
+ }
+
+ /** The Constant supportedMajorMinorVersions. */
+ public static final Set<String> supportedMajorMinorVersions = new HashSet<String>();
+
+ static {
+ supportedMajorMinorVersions.add("v1.0");
+ supportedMajorMinorVersions.add("v2.0");
+ }
+
+ /** The Constant latestVersion. */
+ public static final String latestVersion = "2.0.0";
+
+ /** The Constant patchVersion. */
+ public static final String patchVersion = "0";
+
+ /**
+ * From string.
+ *
+ * @param text the text
+ * @return the headers enum
+ */
+ public static HeadersEnum fromString(String text) {
+ for (HeadersEnum e : HeadersEnum.values()) {
+ if (e.text.equals(text)) {
+ return e;
+ }
+ }
+ return HeadersEnum.UNDEFINED;
+ }
+
+ /**
+ * Gets the patch version.
+ *
+ * @return the patch version
+ */
+ public static String getPatchVersion() {
+ return patchVersion;
+ }
+
+ /**
+ * Gets the latest version.
+ *
+ * @return the latest version
+ */
+ public static String getLatestVersion() {
+ return latestVersion;
+ }
+
+ /**
+ * Validate major version.
+ *
+ * @param major the major
+ * @return true, if successful
+ */
+ public static boolean validateMajorVersion(String major) {
+ String majorKey = major.toLowerCase();
+ if (!supportedMajorVersions.containsKey(majorKey)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Validate major minor version.
+ *
+ * @param major the major
+ * @param minor the minor
+ * @return true, if successful
+ */
+ public static boolean validateMajorMinorVersion(String major, String minor) {
+ String majorKey = major.toLowerCase();
+ if (!supportedMajorVersions.containsKey(majorKey)) {
+ return false;
+ }
+
+ if (minor != null) {
+ String majorMinorKey = majorKey + "." + minor;
+ return supportedMajorMinorVersions.contains(majorMinorKey);
+ }
+ return true;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/Observation.java b/cmso-optimizer/src/main/java/org/onap/observations/Observation.java
new file mode 100644
index 0000000..05fe983
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/observations/Observation.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.apache.log4j.Level;
+import org.onap.optf.cmso.optimizer.Application;
+
+
+/**
+ * The Class Observation.
+ */
+public class Observation {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+ private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
+ private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param execpt the e
+ * @param arguments the arguments
+ */
+ // *************************************************************************************************
+ public static void report(ObservationInterface obs, Exception execpt, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, execpt, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, execpt, arguments);
+ }
+ Level lev = obs.getLevel();
+ switch (lev.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, execpt, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.trace(obs, execpt, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, execpt, arguments);
+ break;
+ default:
+ log.info(obs, execpt, arguments);
+ }
+ Mdc.clearCaller();
+ }
+
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param arguments the arguments
+ */
+ public static void report(ObservationInterface obs, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, arguments);
+ }
+ Level levl = obs.getLevel();
+ switch (levl.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.debug(obs, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, arguments);
+ break;
+ default:
+ log.info(obs, arguments);
+ }
+ Mdc.clearCaller();
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java b/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java
new file mode 100644
index 0000000..0dce93d
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+public interface ObservationInterface extends EELFResolvableErrorEnum {
+ public Enum<?> getValue();
+
+ public Level getLevel();
+
+ public String getMessage();
+
+ public Status getStatus();
+
+ public String getDomain();
+
+ public String name();
+
+ public Boolean getAudit();
+
+ public Boolean getMetric();
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java b/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java
new file mode 100644
index 0000000..f1c1277
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+
+/**
+ * The Class ObservationObject.
+ */
+public class ObservationObject implements ObservationInterface {
+
+ // *************************************************************************************************
+ // Interface class that matches the ObservationInteface pattern
+ // This will be used in case we decide to provide external overrides and we need to instantiate
+ // For now, we'll just use the Enum itself.
+ //
+ //
+ private Enum<?> value = null;
+
+ private Level level = null;
+ private String message = null;
+ private Status status = null;
+ private String domain = null;
+ private Boolean metric = false;
+ private Boolean audit = false;
+
+ /**
+ * Instantiates a new observation object.
+ *
+ * @param obs the o
+ */
+ public ObservationObject(ObservationInterface obs) {
+ this.value = obs.getValue();
+ this.level = obs.getLevel();
+ this.message = obs.getMessage();
+ this.status = obs.getStatus();
+ this.domain = obs.getDomain();
+ this.metric = obs.getMetric();
+ this.audit = obs.getAudit();
+
+ }
+
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ @Override
+ public Enum<?> getValue() {
+ return value;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @return the message
+ */
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
+ @Override
+ public String getDomain() {
+ return domain;
+ }
+
+ /**
+ * Gets the level.
+ *
+ * @return the level
+ */
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ /**
+ * Name.
+ *
+ * @return the string
+ */
+ @Override
+ public String name() {
+ return value.name();
+ }
+
+ /**
+ * Gets the audit.
+ *
+ * @return the audit
+ */
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ /**
+ * Gets the metric.
+ *
+ * @return the metric
+ */
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @param arguments the arguments
+ * @return the message
+ */
+ public String getMessagef(String... arguments) {
+ return EELFResourceManager.format((EELFResolvableErrorEnum) value, arguments);
+ }
+
+ /**
+ * Sets the value.
+ *
+ * @param value the new value
+ */
+ public void setValue(Enum<?> value) {
+ this.value = value;
+ }
+
+ /**
+ * Sets the level.
+ *
+ * @param level the new level
+ */
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ /**
+ * Sets the message.
+ *
+ * @param message the new message
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java
new file mode 100644
index 0000000..5f873e3
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+
+/**
+ * The Class CMSEnvironmentPostProcessor.
+ */
+public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor {
+ // tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ /**
+ * Post process environment.
+ *
+ * @param environment the environment
+ * @param application the application
+ */
+ // proeprties files.
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ String pwd = environment.getProperty("cmso.database.password");
+ if (pwd != null) {
+ pwd = PropertiesManagement.getDecryptedValue(pwd);
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("spring.datasource.password", pwd);
+ MapPropertySource propertySource = new MapPropertySource("abc", map);
+ MutablePropertySources proeprtySources = environment.getPropertySources();
+ proeprtySources.addLast(propertySource);
+ }
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
new file mode 100644
index 0000000..ba9aa6d
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aaf.cadi.CadiWrap;
+import org.onap.aaf.cadi.Permission;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.SpringProfiles;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+/**
+ * AAF authorization filter.
+ */
+
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafAuthorizationFilter extends OrderedRequestContextFilter {
+
+ @Autowired
+ AafUserRoleProperties userRoleProperties;
+
+ /**
+ * Instantiates a new aaf authorization filter.
+ */
+ public AafAuthorizationFilter() {
+ this.setOrder(FilterPriority.AAF_AUTHORIZATION.getPriority());
+
+
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ try {
+ if (request instanceof CadiWrap) {
+ CadiWrap cw = (CadiWrap) request;
+ List<Permission> perms = cw.getPermissions(cw.getUserPrincipal());
+ if (userRoleProperties.processPermissions(request, perms)) {
+ filterChain.doFilter(request, response);
+ } else {
+ Observation.report(LogMessages.UNAUTHORIZED);
+ ResponseFormatter.errorResponse(request, response, new CmsoException(
+ LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
+ } else {
+ throw new Exception();
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ ResponseFormatter.errorResponse(request, response,
+ new CmsoException(LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
new file mode 100644
index 0000000..246c396
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import java.util.Properties;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.filter.CadiFilter;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.Application;
+import org.onap.optf.cmso.optimizer.SpringProfiles;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+/**
+ * AAF authentication filter.
+ */
+
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafFilter extends OrderedRequestContextFilter {
+
+ private final CadiFilter cadiFilter;
+
+ /**
+ * Instantiates a new aaf filter.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws ServletException the servlet exception
+ */
+ public AafFilter() throws IOException, ServletException {
+ Properties cadiProperties = new Properties();
+ cadiProperties.load(Application.class.getClassLoader().getResourceAsStream("cadi.properties"));
+ cadiFilter = new CadiFilter(new PropAccess(cadiProperties));
+ this.setOrder(FilterPriority.AAF_AUTHENTICATION.getPriority());
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ cadiFilter.doFilter(request, response, filterChain);
+ if (response.getStatus() == 401) {
+ Observation.report(LogMessages.UNAUTHENTICATED);
+ ResponseFormatter.errorResponse(request, response,
+ new CmsoException(LogMessages.UNAUTHENTICATED.getStatus(), LogMessages.UNAUTHENTICATED, ""));
+ }
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
new file mode 100644
index 0000000..db58156
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+
+
+/**
+ * The Class AafPerm.
+ */
+public class AafPerm {
+ private String type;
+ private String instance;
+ private String action;
+ private Set<String> actions = new HashSet<>();
+
+ /**
+ * Gets the action.
+ *
+ * @return the action
+ */
+ public String getAction() {
+ return action;
+ }
+
+ /**
+ * Sets the action.
+ *
+ * @param action the new action
+ */
+ public void setAction(String action) {
+ this.action = action;
+ String[] list = action.split(",");
+ for (String a : list) {
+ actions.add(a);
+ }
+ }
+
+ /**
+ * Gets the type.
+ *
+ * @return the type
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * Sets the type.
+ *
+ * @param type the new type
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * Gets the single instance of AafPerm.
+ *
+ * @return single instance of AafPerm
+ */
+ public String getInstance() {
+ return instance;
+ }
+
+ /**
+ * Sets the instance.
+ *
+ * @param instance the new instance
+ */
+ public void setInstance(String instance) {
+ this.instance = instance;
+ }
+
+ /**
+ * Gets the actions.
+ *
+ * @return the actions
+ */
+ public Set<String> getActions() {
+ return actions;
+ }
+
+ /**
+ * Sets the actions.
+ *
+ * @param actions the new actions
+ */
+ public void setActions(Set<String> actions) {
+ this.actions = actions;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param userPerm the user perm
+ * @return true, if successful
+ */
+ public boolean matches(AAFPermission userPerm) {
+ if (type.equals(userPerm.getType())) {
+ if (userPerm.getInstance().equals("*") || instance.equals("*") || userPerm.getInstance().equals(instance)) {
+ for (String userAction : userPerm.getAction().split(",")) {
+ if (userAction.equals("*") || actions.contains("*") || actions.contains(userAction)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
new file mode 100644
index 0000000..38e9af4
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import org.onap.optf.cmso.optimizer.SpringProfiles;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+@ComponentScan("org.onap.optf")
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafSecurityConfig extends WebSecurityConfigurerAdapter {
+
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+
+ http.csrf().disable();
+
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
new file mode 100644
index 0000000..65decec
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The Class AafUserRole.
+ */
+public class AafUserRole {
+ private String url = "";
+ private String[] pathParts = {};
+ private String perm = "";
+ private String method = "";
+ private List<AafPerm> aafPerms = new ArrayList<>();
+
+ /**
+ * Instantiates a new aaf user role.
+ *
+ * @param url the url
+ * @param perm the perm
+ */
+ public AafUserRole(String url, String perm) {
+ this.setUrl(url);
+ this.setPerm(perm);
+ pathParts = url.split("\\/");
+
+ String[] perms = perm.split(",");
+ for (String p : perms) {
+ String[] parts = p.split(" ");
+ if (parts.length == 2) {
+ method = parts[1];
+ } else {
+ method = "ALL";
+ }
+
+ String[] list = parts[0].split("\\|");
+ if (list.length == 3) {
+ AafPerm aafPerm = new AafPerm();
+ aafPerm.setAction(list[2]);
+ aafPerm.setInstance(list[1]);
+ aafPerm.setType(list[0]);
+ aafPerms.add(aafPerm);
+ }
+ }
+ }
+
+ /**
+ * Gets the url.
+ *
+ * @return the url
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ /**
+ * Sets the url.
+ *
+ * @param url the new url
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * Gets the perm.
+ *
+ * @return the perm
+ */
+ public String getPerm() {
+ return perm;
+ }
+
+ /**
+ * Sets the perm.
+ *
+ * @param perm the new perm
+ */
+ public void setPerm(String perm) {
+ this.perm = perm;
+ }
+
+ /**
+ * Gets the aaf perms.
+ *
+ * @return the aaf perms
+ */
+ public List<AafPerm> getAafPerms() {
+ return aafPerms;
+ }
+
+ /**
+ * Sets the aaf perms.
+ *
+ * @param aafPerms the new aaf perms
+ */
+ public void setAafPerms(List<AafPerm> aafPerms) {
+ this.aafPerms = aafPerms;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param path the path
+ * @param matchMethod the match method
+ * @return true, if successful
+ */
+ public boolean matches(String path, String matchMethod) {
+ if (!this.method.equalsIgnoreCase("ALL") && !this.method.equals("*") && !this.method.equals(matchMethod)) {
+ return false;
+ }
+ List<String> inNodes = new ArrayList<>();
+ List<String> matchNodes = new ArrayList<>();
+ String[] pathList = path.split("\\/");
+ for (String n : pathList) {
+ inNodes.add(n);
+ }
+ for (String n : pathParts) {
+ matchNodes.add(n);
+ }
+
+ while (!inNodes.isEmpty() && !matchNodes.isEmpty()) {
+ String inNode = inNodes.remove(0);
+ String matchNode = matchNodes.get(0);
+ if (matchNode.equals(inNode) || matchNode.equals("*")) {
+ matchNodes.remove(0);
+ } else {
+ if (!matchNode.equals("**")) {
+ return false;
+ }
+ }
+ }
+
+ //
+ if (inNodes.isEmpty() && matchNodes.isEmpty()) {
+ return true;
+ }
+
+ // We have incoming nodes remaining, see if we can wildcard them
+ if (matchNodes.size() == 1) {
+ if (matchNodes.get(0).equals("**")) {
+ return true;
+ }
+ if (inNodes.size() == 1 && matchNodes.get(0).equals("*")) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
new file mode 100644
index 0000000..171a11f
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.SpringProfiles;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class uses a properties file to map URL patterns/method to AAF Permissions (AafPerm).
+ *
+ * @author jf9860
+ *
+ */
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafUserRoleProperties {
+ @Autowired
+ Environment env;
+
+ private List<AafUserRole> list = new ArrayList<>();
+
+ /**
+ * Initialize permissions.
+ */
+ @PostConstruct
+ public void initializePermissions() {
+ String userRolePropertiesName =
+ env.getProperty("aaf.user.roles", "src/main/resources/aaf/AAFUserRoles.properties");
+ Properties props = new Properties();
+ try {
+ props.load(new FileInputStream(new File(userRolePropertiesName)));
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ for (Object url : props.keySet()) {
+ Object value = props.get(url);
+ list.add(new AafUserRole((String) url, (String) value));
+ }
+ }
+
+ /**
+ * Gets the for url method.
+ *
+ * @param url the url
+ * @param method the method
+ * @return the for url method
+ */
+ public List<AafUserRole> getForUrlMethod(String url, String method) {
+ List<AafUserRole> userRoleList = new ArrayList<>();
+ for (AafUserRole aur : list) {
+ if (aur.matches(url, method)) {
+ userRoleList.add(aur);
+ }
+ }
+ return userRoleList;
+ }
+
+ /**
+ * Process permissions.
+ *
+ * @param request the request
+ * @param userPerms the user perms
+ * @return true, if successful
+ */
+ public boolean processPermissions(HttpServletRequest request, List<Permission> userPerms) {
+ try {
+ // Get list of perms that match incoming URL. May be more than 1...
+ // Users perms must match all that match URL
+ List<AafUserRole> perms = getForUrlMethod(request.getRequestURI(), request.getMethod());
+ int tested = 0;
+ int passed = 0;
+ for (AafUserRole perm : perms) {
+ for (AafPerm test : perm.getAafPerms()) {
+ tested++;
+ for (Permission userPerm : userPerms) {
+
+ if (test.matches((AAFPermission) userPerm)) {
+ passed++;
+ break;
+ }
+ }
+ }
+ }
+ // All permissions must be OK
+ if (tested > 0 && tested == passed) {
+ return true;
+ } else {
+ return false;
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return false;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
new file mode 100644
index 0000000..bfafbd8
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import org.springframework.core.Ordered;
+
+public enum FilterPriority {
+ AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE), AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1);
+ private final int priority;
+
+ FilterPriority(final int ppri) {
+ priority = ppri;
+ }
+
+ public int getPriority() {
+ return priority;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
new file mode 100644
index 0000000..518814e
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+
+class ResponseFormatter {
+
+
+ static void errorResponse(HttpServletRequest request, HttpServletResponse response, CmsoException error)
+ throws IOException {
+ response.setStatus(error.getStatus().getStatusCode());
+ response.getWriter().write(error.getRequestError().toString());
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
new file mode 100644
index 0000000..4c85246
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.xml.bind.DatatypeConverter;
+
+/**
+ * The Class BasicAuthenticatorFilter.
+ */
+public class BasicAuthenticatorFilter implements ClientRequestFilter {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(BasicAuthenticatorFilter.class);
+ private final String user;
+ private final String password;
+
+ /**
+ * Instantiates a new basic authenticator filter.
+ *
+ * @param user the user
+ * @param password the password
+ */
+ public BasicAuthenticatorFilter(String user, String password) {
+ this.user = user;
+ this.password = password;
+ log.info("user: " + user + " pass:" + password);
+ }
+
+ /**
+ * Filter.
+ *
+ * @param requestContext the request context
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ @Override
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+ final String basicAuthentication = getBasicAuthentication();
+ headers.add("Authorization", basicAuthentication);
+ }
+
+ private String getBasicAuthentication() {
+ String token = this.user + ":" + this.password;
+ try {
+ return "Basic " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException ex) {
+ throw new IllegalStateException("Cannot encode with UTF-8", ex);
+ }
+ }
+
+ /**
+ * Gets the user.
+ *
+ * @param request the request
+ * @return the user
+ */
+ public static String getUser(HttpServletRequest request) {
+ String user = "";
+ String header = request.getHeader("Authorization");
+ if (header != null) {
+ String[] auth = header.split("Basic ");
+ if (auth.length == 2) {
+ String token = getToken(auth[1]);
+ if (token.contains(":")) {
+ String[] tokens = token.split(":");
+ user = tokens[0];
+ }
+ }
+ }
+ return user;
+ }
+
+ private static String getToken(String auth) {
+ try {
+ String token = new String(DatatypeConverter.parseBase64Binary(auth));
+ return token;
+ } catch (Exception e) {
+ return auth;
+ }
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java
new file mode 100644
index 0000000..d56a992
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The Class CMSRequestError.
+ */
+public class CmsoRequestError implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @JsonProperty
+ RequestError requestError;
+
+ /**
+ * Instantiates a new CMS request error.
+ *
+ * @param messageId the message id
+ * @param text the text
+ * @param variables the variables
+ */
+ public CmsoRequestError(String messageId, String text, List<String> variables) {
+ requestError = new RequestError(messageId, text, variables);
+ }
+
+ /**
+ * Instantiates a new CMS request error.
+ *
+ * @param messageId the message id
+ * @param text the text
+ */
+ public CmsoRequestError(String messageId, String text) {
+ requestError = new RequestError(messageId, text, new ArrayList<String>());
+ }
+
+ /**
+ * The Class RequestError.
+ */
+ public class RequestError {
+ @JsonProperty
+ private String messageId;
+ @JsonProperty
+ private String text;
+ @JsonProperty
+ private List<String> variables;
+
+ private RequestError(String messageId, String text, List<String> variables) {
+ this.messageId = "CMSO." + messageId;
+ this.text = text;
+ this.variables = variables;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(messageId).append(":").append(text).append(":").append(variables);
+ return sb.toString();
+
+ }
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ return requestError.toString();
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
new file mode 100644
index 0000000..79a0a79
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class PropertiesManagement.
+ */
+@Component
+public class PropertiesManagement {
+
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+
+ private static final String algorithm = "AES";
+
+ private static final String cipherMode = "CBC";
+
+ private static final String paddingScheme = "PKCS5Padding";
+
+ private static final String transformation = algorithm + "/" + cipherMode + "/" + paddingScheme;
+
+ private static final String initVector = "ONAPCMSOVECTORIV"; // 16 bytes IV
+
+ @Autowired
+ Environment env;
+
+ /**
+ * Gets the property.
+ *
+ * @param key the key
+ * @param defaultValue the default value
+ * @return the property
+ */
+ public String getProperty(String key, String defaultValue) {
+ String value = env.getProperty(key, defaultValue);
+ value = getDecryptedValue(value);
+ return value;
+ }
+
+ /**
+ * Gets the decrypted value.
+ *
+ * @param value the value
+ * @return the decrypted value
+ */
+ public static String getDecryptedValue(String value) {
+ if (value.startsWith("enc:")) {
+ String secret = getSecret();
+ value = decrypt(secret, initVector, value.substring(4));
+ }
+ return value;
+ }
+
+ /**
+ * Gets the encrypted value.
+ *
+ * @param value the value
+ * @return the encrypted value
+ */
+ public static String getEncryptedValue(String value) {
+ String secret = getSecret();
+ value = encrypt(secret, initVector, value);
+ return value;
+ }
+
+ private static final String encrypt(String key, String initVector, String value) {
+ try {
+ IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
+ SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
+ Cipher cipher = Cipher.getInstance(transformation);
+ cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
+ byte[] encrypted = cipher.doFinal(value.getBytes());
+ return Base64.encodeBase64String(encrypted);
+ } catch (Exception ex) {
+ errors.error("Unexpected exception {0}", ex.getMessage());
+ debug.debug("Unexpected exception", ex);
+ }
+
+ return null;
+ }
+
+ private static final String decrypt(String key, String initVector, String encrypted) {
+ try {
+ IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
+ SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
+ Cipher cipher = Cipher.getInstance(transformation);
+ cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
+ byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
+ return new String(original);
+ } catch (Exception ex) {
+ errors.error("Unexpected exception {0}", ex.getMessage());
+ debug.debug("Unexpected exception", ex);
+ }
+ return null;
+ }
+
+ private static String getSecret() {
+ return "ONAPCMSOSECRETIV";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java
new file mode 100644
index 0000000..a83437f
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common.exceptions;
+
+import com.att.eelf.i18n.EELFResourceManager;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.Response.Status;
+import org.onap.observations.ObservationInterface;
+import org.onap.optf.cmso.common.CmsoRequestError;
+
+/**
+ * The Class CMSException.
+ */
+public class CmsoException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ protected CmsoRequestError requestError = null;
+ private List<String> variables = new ArrayList<String>();
+ protected ObservationInterface messageCode;
+ protected Status status;
+
+ /**
+ * Instantiates a new CMS exception.
+ *
+ * @param status the status
+ * @param messageCode the message code
+ * @param args the args
+ */
+ public CmsoException(Status status, ObservationInterface messageCode, String... args) {
+ super(EELFResourceManager.format(messageCode, args));
+ this.status = status;
+ this.messageCode = messageCode;
+ for (String arg : args) {
+ variables.add(arg);
+ }
+ requestError = new CmsoRequestError(messageCode.name(), getMessage(), variables);
+ }
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Gets the message code.
+ *
+ * @return the message code
+ */
+ public ObservationInterface getMessageCode() {
+ return messageCode;
+ }
+
+ /**
+ * Gets the variables.
+ *
+ * @return the variables
+ */
+ public String[] getVariables() {
+ return variables.toArray(new String[variables.size()]);
+ }
+
+ /**
+ * Gets the request error.
+ *
+ * @return the request error
+ */
+ public CmsoRequestError getRequestError() {
+ return requestError;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/Application.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/Application.java
new file mode 100644
index 0000000..e4bcc1d
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/Application.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import com.att.eelf.configuration.Configuration;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.net.InetAddress;
+import java.util.TimeZone;
+import javax.annotation.PostConstruct;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.slf4j.MDC;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"org.onap.optf.cmso"})
+@EnableAsync
+
+@EnableAutoConfiguration(exclude = {/* DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class */} )
+public class Application extends SpringBootServletInitializer {
+
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(Application.class);
+ }
+
+ @PostConstruct
+ void started() {
+ // Make sure all datetimes are stored in UTC format.
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ }
+
+ public static void main(String[] args) {
+ initMdcData();
+ SpringApplication.run(Application.class, args);
+ }
+
+ protected static void initMdcData() {
+ MDC.clear();
+ try {
+ MDC.put(Configuration.MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
+ MDC.put("hostname", InetAddress.getLocalHost().getCanonicalHostName());
+ MDC.put("serviceName", System.getProperty("info.build.artifact"));
+ MDC.put("version", System.getProperty("info.build.version"));
+ MDC.put(Configuration.MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ log.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+
+ @Bean
+ public ServletWebServerFactory servletContainer() {
+ TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
+ return tomcat;
+ }
+
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/ApplicationPropertiesFiles.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/ApplicationPropertiesFiles.java
new file mode 100644
index 0000000..283c19e
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/ApplicationPropertiesFiles.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+
+
+@Configuration
+@PropertySources({@PropertySource("file:etc/config/optimizer.properties"),})
+public class ApplicationPropertiesFiles {
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/AuthProvider.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/AuthProvider.java
new file mode 100644
index 0000000..ba763fa
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/AuthProvider.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2019 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import java.util.ArrayList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+@Component
+@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
+
+public class AuthProvider implements AuthenticationProvider {
+
+ @Autowired
+ Environment env;
+
+ @Override
+ public Authentication authenticate(Authentication authentication) {
+ String name = authentication.getName();
+ String password = authentication.getCredentials().toString();
+ // TODO check credentials until we enable AAF
+ return new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>());
+ }
+
+ @Override
+ public boolean supports(Class<?> authentication) {
+ return authentication.equals(UsernamePasswordAuthenticationToken.class);
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/CmsoEnvironmentPostProcessor.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/CmsoEnvironmentPostProcessor.java
new file mode 100644
index 0000000..5e425d0
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/CmsoEnvironmentPostProcessor.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+
+public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor {
+ // TODO tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ // proeprties files.
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ String pwd = environment.getProperty("cmso.database.password");
+ if (pwd != null) {
+ pwd = PropertiesManagement.getDecryptedValue(pwd);
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("spring.datasource.password", pwd);
+ MapPropertySource propertySource = new MapPropertySource("abc", map);
+ MutablePropertySources proeprtySources = environment.getPropertySources();
+ proeprtySources.addLast(propertySource);
+ }
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/JerseyConfiguration.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/JerseyConfiguration.java
new file mode 100644
index 0000000..fb8191b
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/JerseyConfiguration.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import java.util.logging.Logger;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.logging.LoggingFeature;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.servlet.ServletProperties;
+import org.onap.optf.cmso.optimizer.filters.CmsoContainerFilters;
+import org.onap.optf.cmso.optimizer.service.rs.AdminToolImpl;
+import org.onap.optf.cmso.optimizer.service.rs.HealthCheckImpl;
+import org.onap.optf.cmso.optimizer.service.rs.OptimizerInterfaceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+@Component
+@ApplicationPath("/")
+public class JerseyConfiguration extends ResourceConfig {
+ private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());
+
+ /**
+ * Object mapper.
+ *
+ * @return the object mapper
+ */
+ @Bean
+ @Primary
+ public ObjectMapper objectMapper() {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
+ objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
+ return objectMapper;
+ }
+
+ /**
+ * Instantiates a new jersey configuration.
+ */
+ @Autowired
+ public JerseyConfiguration( /* LogRequestFilter lrf */ ) {
+ register(HealthCheckImpl.class);
+ register(AdminToolImpl.class);
+ register(OptimizerInterfaceImpl.class);
+ property(ServletProperties.FILTER_FORWARD_ON_404, true);
+ // TODO: ONAP Conversion identify appropriate ONAP logging filters if any
+ // register(lrf, 6001);
+ // register(LogResponseFilter.class, 6004);
+
+ // TODO: Examine which logging features to enable
+ register(new LoggingFeature(log));
+ register(CmsoContainerFilters.class);
+ }
+
+ /**
+ * Jersey client.
+ *
+ * @return the client
+ */
+ @Bean
+ public Client jerseyClient() {
+ ClientConfig client = new ClientConfig();
+
+ // TODO: ONAP Conversion identify appropriate ONAP logging filters if any
+ // client.register(TransactionIdRequestFilter.class);
+ // client.register(TransactionIdResponseFilter.class);
+ // client.register(DateTimeParamConverterProvider.class);
+
+ return ClientBuilder.newClient(client);
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SecurityConfig.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SecurityConfig.java
new file mode 100644
index 0000000..ff3f1b4
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SecurityConfig.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+@ComponentScan("org.onap.optf")
+@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Autowired
+ private AuthProvider authProvider;
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+
+ auth.authenticationProvider(authProvider);
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+
+ http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
+
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SpringProfiles.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SpringProfiles.java
new file mode 100644
index 0000000..54d4b46
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SpringProfiles.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ *
+ * * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+public class SpringProfiles {
+
+ public static final String AAF_AUTHENTICATION = "aaf-auth";
+ public static final String PROPRIETARY__AUTHENTICATION = "proprietary-auth";
+
+ private SpringProfiles() {}
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManager.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManager.java
new file mode 100644
index 0000000..d82932b
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManager.java
@@ -0,0 +1,113 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.availability.policies.model.Policy;
+import org.onap.optf.cmso.optimizer.availability.policies.model.TimeLimitAndVerticalTopology;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PolicyManager {
+
+ @Autowired
+ Environment env;
+
+ public TimeLimitAndVerticalTopology getTimeLimitAndVerticalTopologyByName(String name) {
+ Policy policy = getPolicyForName(name);
+ TimeLimitAndVerticalTopology returnPolicy = null;
+ if (policy != null) {
+ ObjectMapper om = new ObjectMapper();
+ try {
+ returnPolicy = om.convertValue(policy.getContent(), TimeLimitAndVerticalTopology.class);
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+ return returnPolicy;
+ }
+
+
+ public Policy getPolicyForName(String name) {
+ Policy policy = null;
+ try {
+ return getLocalPolicyForName(name);
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return policy;
+ }
+
+ public Policy getLocalPolicyForName(String name) {
+ String policyFolder = env.getProperty("cmso.local.policy.folder", "data/policies");
+ Policy policy = null;
+ try {
+ if (!name.endsWith(".json")) {
+ name += ".json";
+ }
+ Path path = Paths.get(policyFolder, name);
+ ObjectMapper om = new ObjectMapper();
+ policy = om.readValue(path.toFile(), Policy.class);
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return policy;
+ }
+
+ public List<Policy> getSupportedPolicies() {
+ List<Policy> policies = new ArrayList<>();
+ try {
+ return getLocalSupportedPolicies();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return policies;
+ }
+
+ public List<Policy> getLocalSupportedPolicies() {
+ String policyFolder = env.getProperty("cmso.local.policy.folder", "data/policies");
+ List<Policy> policies = new ArrayList<>();
+ try {
+ Path path = Paths.get(policyFolder);
+ for (File file : path.toFile().listFiles()) {
+ if (file.isFile()) {
+ Policy policy = getLocalPolicyForName(file.getName());
+ if (policy != null) {
+ policies.add(policy);
+ }
+ }
+
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return policies;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/AllowedPeriodicTime.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/AllowedPeriodicTime.java
new file mode 100644
index 0000000..abdb5f8
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/AllowedPeriodicTime.java
@@ -0,0 +1,72 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies.model;
+
+import java.util.List;
+
+/*
+
+{
+ "day": "weekday",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+}
+
+ */
+public class AllowedPeriodicTime {
+
+ public enum Day {
+ weekday("RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"), weekend("RRULE:FREQ=WEEKLY;BYDAY=SA,SU"),;
+ private String rrule;
+
+ private Day(String rrule) {
+ this.rrule = rrule;
+ }
+
+ public String getRrule() {
+ return rrule;
+ }
+
+ }
+
+ private Day day;
+ private List<TimeRange> timeRange;
+
+ public Day getDay() {
+ return day;
+ }
+
+ public void setDay(Day day) {
+ this.day = day;
+ }
+
+ public List<TimeRange> getTimeRange() {
+ return timeRange;
+ }
+
+ public void setTimeRange(List<TimeRange> timeRange) {
+ this.timeRange = timeRange;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/Policy.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/Policy.java
new file mode 100644
index 0000000..f6bdf74
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/Policy.java
@@ -0,0 +1,155 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies.model;
+
+/*
+{
+ "service": "TimeLimitAndVerticalTopology",
+ "policyName": "CMSO.Weekday_00_06",
+ "description": "dev instance",
+ "templateVersion": "Dublin",
+ "version": "0001",
+ "priority": "4",
+ "riskType": "test",
+ "riskLevel": "3",
+ "guard": "False",
+ "content": {
+ "serviceType": "networkOnDemand",
+ "identity": "vnf_upgrade_policy",
+ "policyScope": {
+ "serviceType": ["networkOnDemand"],
+ "aicZone": [
+ " "
+ ],
+ "entityType": ["vnf"]
+ },
+ "timeSchedule": {
+ "allowedPeriodicTime": [
+ {
+ "day": "weekday",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+ }
+ ]
+ },
+ "nodeType": ["vnf"],
+ "type": "timeLimitAndVerticalTopology",
+ "conflictScope": "vnf_pserver"
+ }
+}
+ */
+public class Policy {
+
+ private String service;
+ private String policyName;
+ private String description;
+ private String templateVersion;
+ private String version;
+ private String priority;
+ private String riskType;
+ private String riskLevel;
+ private String guard;
+ private Object content;
+
+ public String getService() {
+ return service;
+ }
+
+ public void setService(String service) {
+ this.service = service;
+ }
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getTemplateVersion() {
+ return templateVersion;
+ }
+
+ public void setTemplateVersion(String templateVersion) {
+ this.templateVersion = templateVersion;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getPriority() {
+ return priority;
+ }
+
+ public void setPriority(String priority) {
+ this.priority = priority;
+ }
+
+ public String getRiskType() {
+ return riskType;
+ }
+
+ public void setRiskType(String riskType) {
+ this.riskType = riskType;
+ }
+
+ public String getRiskLevel() {
+ return riskLevel;
+ }
+
+ public void setRiskLevel(String riskLevel) {
+ this.riskLevel = riskLevel;
+ }
+
+ public String getGuard() {
+ return guard;
+ }
+
+ public void setGuard(String guard) {
+ this.guard = guard;
+ }
+
+ public Object getContent() {
+ return content;
+ }
+
+ public void setContent(Object content) {
+ this.content = content;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/PolicyScope.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/PolicyScope.java
new file mode 100644
index 0000000..d569274
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/PolicyScope.java
@@ -0,0 +1,69 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies.model;
+
+import java.util.List;
+
+/*
+{
+ "serviceType": ["networkOnDemand"],
+ "aicZone": [
+ " "
+ ],
+ "entityType": ["vnf"]
+ */
+public class PolicyScope {
+
+ public enum ServiceType {
+ networkOnDemand
+ }
+ public enum EntityType {
+ vnf
+ }
+
+ private List<String> serviceType;
+ private List<String> aicZone;
+ private List<String> entityType;
+
+ public List<String> getServiceType() {
+ return serviceType;
+ }
+
+ public void setServiceType(List<String> serviceType) {
+ this.serviceType = serviceType;
+ }
+
+ public List<String> getAicZone() {
+ return aicZone;
+ }
+
+ public void setAicZone(List<String> aicZone) {
+ this.aicZone = aicZone;
+ }
+
+ public List<String> getEntityType() {
+ return entityType;
+ }
+
+ public void setEntityType(List<String> entityType) {
+ this.entityType = entityType;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeLimitAndVerticalTopology.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeLimitAndVerticalTopology.java
new file mode 100644
index 0000000..7af22e3
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeLimitAndVerticalTopology.java
@@ -0,0 +1,127 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies.model;
+
+import java.util.List;
+
+/*
+{
+ "serviceType": "networkOnDemand",
+ "identity": "vnf_upgrade_policy",
+ "policyScope": {
+ "serviceType": ["networkOnDemand"],
+ "aicZone": [
+ " "
+ ],
+ "entityType": ["vnf"]
+ },
+ "timeSchedule": {
+ "allowedPeriodicTime": [
+ {
+ "day": "weekday",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+ }
+ ]
+ },
+ "nodeType": ["vnf"],
+ "type": "timeLimitAndVerticalTopology",
+ "conflictScope": "vnf_pserver"
+}
+ */
+
+public class TimeLimitAndVerticalTopology {
+
+ public enum ConflictScope {
+ timeLimitAndVerticalTopology,
+ }
+ public enum Type {
+ vnf_pserver,
+ }
+
+ private String serviceType;
+ private String identity;
+ private PolicyScope policyScope;
+ private TimeSchedule timeSchedule;
+ private List<String> nodeType;
+ private String type;
+ private String conflictScope;
+
+ public String getServiceType() {
+ return serviceType;
+ }
+
+ public void setServiceType(String serviceType) {
+ this.serviceType = serviceType;
+ }
+
+ public String getIdentity() {
+ return identity;
+ }
+
+ public void setIdentity(String identity) {
+ this.identity = identity;
+ }
+
+ public PolicyScope getPolicyScope() {
+ return policyScope;
+ }
+
+ public void setPolicyScope(PolicyScope policyScope) {
+ this.policyScope = policyScope;
+ }
+
+ public TimeSchedule getTimeSchedule() {
+ return timeSchedule;
+ }
+
+ public void setTimeSchedule(TimeSchedule timeSchedule) {
+ this.timeSchedule = timeSchedule;
+ }
+
+ public List<String> getNodeType() {
+ return nodeType;
+ }
+
+ public void setNodeType(List<String> nodeType) {
+ this.nodeType = nodeType;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getConflictScope() {
+ return conflictScope;
+ }
+
+ public void setConflictScope(String conflictScope) {
+ this.conflictScope = conflictScope;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeRange.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeRange.java
new file mode 100644
index 0000000..0f8f851
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeRange.java
@@ -0,0 +1,50 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies.model;
+
+/*
+
+{
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+}
+
+ */
+public class TimeRange {
+ private String start_time;
+ private String end_time;
+
+ public String getStart_time() {
+ return start_time;
+ }
+
+ public void setStart_time(String start_time) {
+ this.start_time = start_time;
+ }
+
+ public String getEnd_time() {
+ return end_time;
+ }
+
+ public void setEnd_time(String end_time) {
+ this.end_time = end_time;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeSchedule.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeSchedule.java
new file mode 100644
index 0000000..4d3db2d
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/policies/model/TimeSchedule.java
@@ -0,0 +1,51 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies.model;
+
+import java.util.List;
+
+/*
+{
+ "allowedPeriodicTime": [
+ {
+ "day": "weekday",
+ "timeRange": [
+ {
+ "start_time": "00:00:00+00:00",
+ "end_time": "06:00:00+00:00"
+ }
+ ]
+ }
+ ]
+}
+ */
+public class TimeSchedule {
+
+ private List<AllowedPeriodicTime> allowedPeriodicTime;
+
+ public List<AllowedPeriodicTime> getAllowedPeriodicTime() {
+ return allowedPeriodicTime;
+ }
+
+ public void setAllowedPeriodicTime(List<AllowedPeriodicTime> allowedPeriodicTime) {
+ this.allowedPeriodicTime = allowedPeriodicTime;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindows.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindows.java
new file mode 100644
index 0000000..23e3ad8
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindows.java
@@ -0,0 +1,227 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.timewindows;
+
+import com.google.ical.compat.jodatime.DateTimeIterator;
+import com.google.ical.compat.jodatime.DateTimeIteratorFactory;
+import java.text.ParseException;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.availability.policies.model.AllowedPeriodicTime;
+import org.onap.optf.cmso.optimizer.availability.policies.model.TimeLimitAndVerticalTopology;
+import org.onap.optf.cmso.optimizer.availability.policies.model.TimeRange;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.service.rs.models.ChangeWindow;
+
+/**
+ * The Class RecurringWindows.
+ */
+public class RecurringWindows {
+
+ /**
+ * Gets the availability windows for policies.
+ *
+ * @param policies the policies
+ * @param changeWindow the change window
+ * @return the availability windows for policies
+ */
+ public static List<ChangeWindow> getAvailabilityWindowsForPolicies(List<TimeLimitAndVerticalTopology> policies,
+ ChangeWindow changeWindow) {
+ List<ChangeWindow> availableList = new ArrayList<>();
+ for (TimeLimitAndVerticalTopology policy : policies) {
+ if (policy.getTimeSchedule() != null && policy.getTimeSchedule().getAllowedPeriodicTime() != null) {
+ for (AllowedPeriodicTime available : policy.getTimeSchedule().getAllowedPeriodicTime()) {
+ getAvailableWindowsForApt(available, changeWindow, availableList);
+ }
+ }
+ }
+ // Collapse all duplicate and overlapping availabity windows into minimum
+ // number of windows
+ availableList = collapseWindows(availableList);
+ return availableList;
+
+ }
+
+
+ private static List<ChangeWindow> collapseWindows(List<ChangeWindow> availableList) {
+ List<ChangeWindow> collapsed = new ArrayList<>();
+ Set<ChangeWindow> consumed = new HashSet<>();
+ for (ChangeWindow win : availableList) {
+ if (!consumed.contains(win)) {
+ // Find all windows that can collapse into this one
+ consumed.add(win);
+ boolean allUnique = false;
+ while (!allUnique) {
+ allUnique = true;
+ for (ChangeWindow test : availableList) {
+ // if availability windows overlap
+ if (!consumed.contains(test)) {
+ if (win.absorbIfOverlapping(test)) {
+ consumed.add(test);
+ allUnique = false;
+ }
+ }
+ }
+ }
+ collapsed.add(win);
+ }
+ }
+ return collapsed;
+ }
+
+ // "RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR",
+ private static void getAvailableWindowsForApt(AllowedPeriodicTime available, ChangeWindow changeWindow,
+ List<ChangeWindow> availableList) {
+
+ if (available.getDay() != null) {
+ switch (available.getDay()) {
+ case weekday:
+ case weekend:
+ getAvailableWindowsForAptDay(available, changeWindow, availableList);
+ return;
+ default:
+
+ }
+ }
+ availableList.add(changeWindow);
+ Observation.report(LogMessages.UNSUPPORTED_PERIODIC_TIME, available.toString());
+
+ }
+
+ // "RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR",
+
+ private static void getAvailableWindowsForAptDay(AllowedPeriodicTime available, ChangeWindow changeWindow,
+ List<ChangeWindow> availableList) {
+ try {
+ List<TimeRange> ranges = available.getTimeRange();
+ if (ranges.size() == 0) {
+ TimeRange range = new TimeRange();
+ range.setStart_time("00:00:00+00:00");
+ range.setStart_time("23:59:59+00:00");
+ ranges.add(range);
+ }
+ StringBuilder rdata = new StringBuilder();
+ rdata.append(available.getDay().getRrule()).append("\n");
+ for (TimeRange range : ranges) {
+ processRange(range, changeWindow, availableList, rdata);
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+
+
+ private static void processRange(TimeRange range, ChangeWindow changeWindow, List<ChangeWindow> availableList,
+ StringBuilder rdata) throws ParseException {
+
+ Instant cwStartInstant = changeWindow.getStartTime().toInstant();
+ Instant cwEndInstant = changeWindow.getEndTime().toInstant();
+
+ List<DateTime> startList = getRecurringList(range.getStart_time(), cwStartInstant, rdata, cwEndInstant);
+ List<DateTime> endList = getRecurringList(range.getEnd_time(), cwStartInstant, rdata, cwEndInstant);
+ // Pair them up to make change windows
+ // Everything should be UTC time
+ for (int i = 0; i < startList.size(); i++) {
+ DateTime startDt = startList.get(i);
+ if (i < endList.size()) {
+ DateTime endDt = endList.get(i);
+ if (endDt.isAfter(startDt)) {
+ ChangeWindow cw = new ChangeWindow();
+ cw.setStartTime(startDt.toDate());
+ cw.setEndTime(endDt.toDate());
+ availableList.add(cw);
+ }
+
+ }
+ }
+
+ }
+
+
+ private static List<DateTime> getRecurringList(String rangeTime, Instant cwStartInstant, StringBuilder rdata,
+ Instant cwEndInstant) throws ParseException {
+
+ Instant startInstant = getInstanceFromTime(rangeTime, cwStartInstant);
+ DateTime start = new DateTime(startInstant.toEpochMilli());
+ DateTimeIterator recur =
+ DateTimeIteratorFactory.createDateTimeIterator(rdata.toString(), start, DateTimeZone.UTC, true);
+ List<DateTime> list = new ArrayList<>();
+ while (recur.hasNext()) {
+ DateTime next = recur.next();
+ // System.out.println(next.toString());
+ if (next.isAfter(cwEndInstant.toEpochMilli())) {
+ break;
+ }
+ list.add(next);
+ }
+ return list;
+ }
+
+
+ //
+ // The policies with 'Day' enumeration only have time with no day so we add the
+ // date portion of the change window to the dtstart
+ //
+ private static Instant getInstanceFromTime(String timeIn, Instant cwStartInstant) {
+ Instant instant = null;
+ Instant date = cwStartInstant.truncatedTo(ChronoUnit.DAYS);
+ LocalDate epoch = LocalDate.ofEpochDay(0);
+ try {
+ OffsetTime offset = OffsetTime.parse(timeIn);
+ OffsetDateTime odt = offset.atDate(epoch);
+ ZonedDateTime startTime = odt.atZoneSameInstant(ZoneOffset.UTC.normalized());
+ instant = Instant.from(startTime);
+ } catch (Exception e) {
+ LocalTime local = LocalTime.parse(timeIn);
+ LocalDateTime ldt = local.atDate(epoch);
+ ZonedDateTime startTime = ldt.atZone(ZoneOffset.UTC.normalized());
+ instant = Instant.from(startTime);
+ }
+ return instant.plus(date.toEpochMilli(), ChronoUnit.MILLIS);
+ }
+
+ public static DateTimeIterator getRecurringListForChangeWindow(ChangeWindow window, Long durationInSeconds)
+ throws ParseException {
+
+ String rdata = "RRULE:FREQ=MINUTELY;INTERVAL=" + durationInSeconds/60;
+ DateTime start = new DateTime(window.getStartTime().toInstant().toEpochMilli());
+ DateTimeIterator recur =
+ DateTimeIteratorFactory.createDateTimeIterator(rdata, start, DateTimeZone.UTC, true);
+ return recur;
+ }
+
+
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/common/models/ElementCriteria.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/common/models/ElementCriteria.java
new file mode 100644
index 0000000..7b16a2f
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/common/models/ElementCriteria.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.common.models;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+@ApiModel(value = "Element Critera", description = "Element criteria for retrieving topology.")
+public class ElementCriteria implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "Element id unique to the request.")
+ private String elementId;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementAvailability.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementAvailability.java
new file mode 100644
index 0000000..4766db2
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementAvailability.java
@@ -0,0 +1,197 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer;
+
+import com.google.ical.compat.jodatime.DateTimeIterator;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import org.joda.time.DateTime;
+import org.onap.optf.cmso.optimizer.availability.policies.model.TimeLimitAndVerticalTopology;
+import org.onap.optf.cmso.optimizer.availability.timewindows.RecurringWindows;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerParameters;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.TicketData;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyElementInfo;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.service.rs.models.ChangeWindow;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.springframework.expression.spel.ast.OpInc;
+
+public class ElementAvailability extends ElementWindowMapping{
+
+ private List<TimeLimitAndVerticalTopology> policies;
+ private ActiveTicketsResponse ticketResponse;
+
+ private OptimizerParameters parameters = null;
+
+ private List<List<ChangeWindow>> globalRelativeAvailability = new ArrayList<>();
+
+ private Map<String, List<TicketData>> nodeUnAvailability = new TreeMap<>();
+
+ public ElementAvailability(List<TimeLimitAndVerticalTopology> policies, OptimizerRequest optimizerRequest,
+ TopologyResponse topologyResponse, ActiveTicketsResponse ticketResponse) throws ParseException
+ {
+ super(optimizerRequest, topologyResponse);
+ this.policies = policies;
+ this.ticketResponse = ticketResponse;
+ }
+
+ public void populate(OptimizerParameters parameters) throws ParseException {
+ this.parameters = parameters;
+ for (ChangeWindow changeWindow : optimizerRequest.getChangeWindows()) {
+ if (policies.size() > 0) {
+ globalRelativeAvailability.add(RecurringWindows.getAvailabilityWindowsForPolicies(policies, changeWindow));
+ }
+ else {
+ List<ChangeWindow> wholeWindow = new ArrayList<>();
+ wholeWindow.add(changeWindow);
+ globalRelativeAvailability.add(wholeWindow);
+ }
+ }
+ for (String id : nodeInfo.keySet()) {
+ calculateNodeAvailability(nodeInfo.get(id));
+ }
+ setNoConflicts();
+ parameters.setMaxTime(new Long(parameters.getNoConflict().get(0).size()));
+ parameters.setNumElements(new Long(parameters.getNoConflict().size()));
+
+ // for now we have 1 loader with unlimited capacity
+ parameters.setNumLoaders(1L);
+ Long loaderCapacity = parameters.getNumElements();
+ List<Long> capacity = new ArrayList<>();
+ for (Long slot =0L ; slot < parameters.getMaxTime() ; slot++) {
+ capacity.add(loaderCapacity);
+ }
+ parameters.getLoaderCapacity().add(capacity);
+
+ // For now every slot has the same concurrency limit
+ capacity = new ArrayList<>();
+ Long limit = new Long(optimizerRequest.getConcurrencyLimit());
+ if (limit > parameters.getNumElements()) {
+ limit = parameters.getNumElements();
+ }
+
+ for (Long slot =0L ; slot < parameters.getMaxTime() ; slot++) {
+ capacity.add(limit);
+ }
+ parameters.setElementSlotCapacity(capacity);
+
+ }
+
+ private void setNoConflicts() throws ParseException {
+ // Only support 1 change window for now
+ ChangeWindow window = optimizerRequest.getChangeWindows().get(0);
+ Long duration = new Long(optimizerRequest.getNormalDuration());
+ if (optimizerRequest.getAdditionalDuration() != null) {
+ duration += optimizerRequest.getAdditionalDuration();
+ }
+ for (String elementId : nodeInfo.keySet()) {
+
+ TopologyElementInfo info = nodeInfo.get(elementId);
+ Long timeZoneOffset = getTimeZoneOffset(info);
+ DateTimeIterator recur = getRecurringIterator();
+ List<Boolean> element = new ArrayList<>();
+ while (recur.hasNext()) {
+ DateTime next = recur.next();
+ if (next.isAfter(window.getEndTime().getTime())) {
+ break;
+ }
+ ChangeWindow slot = new ChangeWindow();
+ slot.setStartTime(next.toDate());
+ slot.setEndTime(next.plus(duration).toDate());
+ if (slotIsAvailable(slot, timeZoneOffset, nodeUnAvailability.get(elementId))) {
+ element.add(true);
+ } else {
+ element.add(false);
+ }
+ }
+ parameters.getNoConflict().add(element);
+ }
+
+ }
+
+ private boolean slotIsAvailable(ChangeWindow slot, Long timeZoneOffset, List<TicketData> tickets) {
+ if (isGloballyAvailable(slot, timeZoneOffset) && isNotRestricted(slot, tickets)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isNotRestricted(ChangeWindow slot, List<TicketData> tickets) {
+ if (tickets != null) {
+ for (TicketData ticket : tickets) {
+ ChangeWindow window = new ChangeWindow();
+ window.setStartTime(ticket.getStartTime());
+ window.setEndTime(ticket.getEndTime());
+ if (slot.overlaps(window)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ private boolean isGloballyAvailable(ChangeWindow slot, Long timeZoneOffset) {
+ for (ChangeWindow global : globalRelativeAvailability.get(0)) {
+ if (global.containsInTimeZone(slot, timeZoneOffset)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private Long getTimeZoneOffset(TopologyElementInfo info) {
+ // TODO Auto-generated method stub
+ return 0L;
+ }
+
+ private void calculateNodeAvailability(TopologyElementInfo info) {
+ Set<String> requiredElements = new HashSet<>();
+ requiredElements.add(info.getElementId());
+ if (info.getRequiredElements() != null) {
+ requiredElements.addAll(info.getRequiredElements());
+ }
+ if (ticketResponse.getElements() != null) {
+ List<TicketData> tickets = ticketResponse.getElements();
+ for (TicketData data : tickets) {
+ for (String id : data.getElementIds()) {
+ if (requiredElements.contains(id)) {
+ updateNodeAvailability(id, data);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ private void updateNodeAvailability(String elementId, TicketData data) {
+ List<TicketData> list = nodeUnAvailability.get(elementId);
+ if (list == null) {
+ list = new ArrayList<>();
+ nodeUnAvailability.put(elementId, list);
+ }
+ list.add(data);
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementWindowMapping.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementWindowMapping.java
new file mode 100644
index 0000000..42c69a2
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/ElementWindowMapping.java
@@ -0,0 +1,148 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer;
+
+import com.google.ical.compat.jodatime.DateTimeIterator;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
+import org.joda.time.DateTime;
+import org.onap.optf.cmso.optimizer.availability.timewindows.RecurringWindows;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.ElementSlot;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerSchedule;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyElementInfo;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.service.rs.models.ChangeWindow;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerScheduleInfo;
+import org.onap.optf.cmso.optimizer.service.rs.models.ScheduledElement;
+import org.onap.optf.cmso.optimizer.service.rs.models.ScheduledElement.ScheduleType;
+import org.onap.optf.cmso.optimizer.service.rs.models.UnScheduledElement;
+import org.onap.optf.cmso.optimizer.service.rs.models.UnScheduledElement.NotScheduledReason;
+
+// This class ensures that the node indices nodes and the time slots are the
+// same when processing the optimizer engine response as when initiating.
+public class ElementWindowMapping {
+
+ protected OptimizerRequest optimizerRequest;
+ protected TopologyResponse topologyResponse;
+
+ protected Map<String, TopologyElementInfo> nodeInfo = new TreeMap<>();
+ private List<TopologyElementInfo> nodeArray = null;
+
+ public ElementWindowMapping(OptimizerRequest optimizerRequest, TopologyResponse topologyResponse)
+ throws ParseException {
+ this.optimizerRequest = optimizerRequest;
+ this.topologyResponse = topologyResponse;
+ initialize();
+
+ }
+
+ private void initialize() throws ParseException {
+ List<TopologyElementInfo> elements = topologyResponse.getElements();
+ for (TopologyElementInfo info : elements) {
+ nodeInfo.put(info.getElementId(), info);
+ }
+ }
+
+ protected DateTimeIterator getRecurringIterator() throws ParseException {
+ // Only support 1 change window for now
+ ChangeWindow window = optimizerRequest.getChangeWindows().get(0);
+ Long duration = new Long(optimizerRequest.getNormalDuration());
+ if (optimizerRequest.getAdditionalDuration() != null) {
+ duration += optimizerRequest.getAdditionalDuration();
+ }
+ DateTimeIterator recur = RecurringWindows.getRecurringListForChangeWindow(window, duration);
+ return recur;
+ }
+
+ public void initializeForProcessResult()
+ {
+ // we need nodeInfo to be an array to speed up the result processing.
+ // but we need it sorted by elementId as when we created it....
+ nodeArray = nodeInfo.values().stream().collect(Collectors.toList());
+ nodeInfo.clear();
+
+ }
+ public OptimizerScheduleInfo processResult(OptimizerSchedule result) throws ParseException {
+ // When considering the memory vs performance
+ // 5 minute duration for a month long change window is 8928 slots
+ // The assumption is that there were be fewer allocated slots
+ // than potential slots.
+ List<ElementSlot> elements = result.getElementSlotLoader();
+ Map<Integer, List<ElementSlot>> mapSlotToElement = elements.stream().
+ collect(Collectors.groupingBy(ElementSlot::getSlot));
+ DateTimeIterator iter = getRecurringIterator();
+ // TODO - supporting only 1 change window at the moment.....
+ Long endWindow = optimizerRequest.getChangeWindows().get(0).getEndTime().getTime();
+ Integer slotIndex = 1;
+ while (iter.hasNext()) {
+ DateTime dateTime = iter.next();
+ if (dateTime.isAfter(endWindow))
+ break;
+ List<ElementSlot> list = mapSlotToElement.get(slotIndex);
+ if (list != null) {
+ list.stream().forEach(x -> x.setTime(dateTime.getMillis()));
+ }
+ slotIndex++;
+ }
+ //
+ // All assigned ElementSlots now have corresponding UTC time
+ //
+ OptimizerScheduleInfo info = new OptimizerScheduleInfo();
+ for (ElementSlot slot : elements)
+ {
+ updateInfo(slot, info);
+ }
+ return info;
+ }
+
+ private void updateInfo(ElementSlot slot, OptimizerScheduleInfo info)
+ {
+ TopologyElementInfo element = nodeArray.get(slot.getElementIndex()-1);
+ if (slot.getSlot() > 0)
+ {
+ ScheduledElement scheduled = new ScheduledElement();
+ Integer durationInSeconds = optimizerRequest.getNormalDuration();
+ if (optimizerRequest.getAdditionalDuration() != null) {
+ durationInSeconds += optimizerRequest.getAdditionalDuration();
+ }
+ scheduled.setDurationSeconds(durationInSeconds.longValue());
+ scheduled.setElementId(element.getElementId());
+ scheduled.setStartTime(new Date(slot.getTime()));
+ scheduled.setEndTime(new Date(slot.getTime() + (durationInSeconds*1000)));
+ scheduled.setScheduleType(ScheduleType.INDIVIDUAL);
+ info.getScheduledElements().add(scheduled);
+ }
+ else
+ {
+ UnScheduledElement unscheduled = new UnScheduledElement();
+ unscheduled.setElementId(element.getElementId());
+ unscheduled.setGroupId("unknown");
+ unscheduled.getNotScheduledReaons().add(NotScheduledReason.Other);
+ unscheduled.getNotScheduledMessages().add("Unknown");
+ info.getUnScheduledElements().add(unscheduled);
+ }
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerClient.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerClient.java
new file mode 100644
index 0000000..514097e
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerClient.java
@@ -0,0 +1,279 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import org.apache.commons.io.IOUtils;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.availability.policies.PolicyManager;
+import org.onap.optf.cmso.optimizer.availability.policies.model.TimeLimitAndVerticalTopology;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse.OptimizerEngineResponseStatus;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerParameters;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerResponseUtility;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerResults;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.TicketMgtRequestManager;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse;
+import org.onap.optf.cmso.optimizer.clients.topology.TopologyRequestManager;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.model.Optimizer;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Ticket;
+import org.onap.optf.cmso.optimizer.model.Topology;
+import org.onap.optf.cmso.optimizer.model.dao.OptimizerDao;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus;
+import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class OptimizerClient.
+ */
+@Component
+public class OptimizerClient {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ PropertiesManagement pm;
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Autowired
+ TopologyRequestManager topologyRequestManager;
+
+ @Autowired
+ TicketMgtRequestManager ticketMgtRequestManager;
+
+ @Autowired
+ OptimizerDao optimizerDao;
+
+ @Autowired
+ PolicyManager policyManager;
+
+ /**
+ * Make request.
+ *
+ * @param request the request
+ * @param optimizer the Optimizer
+ * @return the Optimizer response
+ */
+ public OptimizerEngineResponse makeRequest(Request request, Optimizer optimizer) {
+ Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
+ OptimizerEngineResponse apiResponse = new OptimizerEngineResponse();
+ if (optimizer.getOptimizeRetries() >= maxAttempts) {
+ apiResponse.setStatus(OptimizerEngineResponseStatus.FAILED);
+ apiResponse.setErrorMessage(LogMessages.EXCEEDED_RETRY_LIMIT.format("Optimizer", maxAttempts.toString()));
+ Observation.report(LogMessages.EXCEEDED_RETRY_LIMIT, "Optimizer", maxAttempts.toString());
+ return apiResponse;
+ }
+ OptimizerRequest optimizerRequest = null;
+ TopologyResponse topologyResponse = null;
+ ActiveTicketsResponse ticketResponse = null;
+ try {
+ optimizerRequest = getOptimizerRequest(request);
+ topologyResponse = getTopologyResponse(request.getUuid());
+ ticketResponse = getTicketResponse(request.getUuid());
+ OptimizerParameters optimizerParameters =
+ buildOptimizerParameters(optimizerRequest, topologyResponse, ticketResponse);
+ apiResponse = initiateOptimizer(optimizerParameters, request);
+ } catch (Exception e) {
+ apiResponse.setStatus(OptimizerEngineResponseStatus.FAILED);
+ apiResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return apiResponse;
+ }
+
+ private OptimizerParameters buildOptimizerParameters(OptimizerRequest optimizerRequest,
+ TopologyResponse topologyResponse, ActiveTicketsResponse ticketResponse) throws ParseException {
+ List<TimeLimitAndVerticalTopology> policies = getPolicies(optimizerRequest);
+ OptimizerParameters parameters = new OptimizerParameters();
+ ElementAvailability elementAvailability =
+ new ElementAvailability(policies, optimizerRequest, topologyResponse, ticketResponse);
+ elementAvailability.populate(parameters);
+
+ // Policies for this are undefined...
+ parameters.setAttributes(getAttributes(policies, optimizerRequest));
+ parameters.setAttributesRange(getAttributesRange(policies, optimizerRequest));
+ parameters.setAttributeConcurrencyLimit(getAttributeConcrrencyLimit(policies, optimizerRequest));
+ parameters.setNumAttributes(new Long(parameters.getAttributesRange().size()));
+ return parameters;
+ }
+
+ private List<List<Long>> getAttributeConcrrencyLimit(List<TimeLimitAndVerticalTopology> policies,
+ OptimizerRequest optimizerRequest) {
+ List<List<Long>> list = new ArrayList<>();
+ return list;
+ }
+
+ private List<Long> getAttributesRange(List<TimeLimitAndVerticalTopology> policies,
+ OptimizerRequest optimizerRequest) {
+ List<Long> list = new ArrayList<>();
+ return list;
+ }
+
+ private List<List<Long>> getAttributes(List<TimeLimitAndVerticalTopology> policies,
+ OptimizerRequest optimizerRequest) {
+ List<List<Long>> list = new ArrayList<>();
+ return list;
+ }
+
+
+ private List<TimeLimitAndVerticalTopology> getPolicies(OptimizerRequest optimizerRequest) {
+ List<TimeLimitAndVerticalTopology> list = new ArrayList<>();
+ for (PolicyInfo policyInfo : optimizerRequest.getPolicies()) {
+ TimeLimitAndVerticalTopology policy =
+ policyManager.getTimeLimitAndVerticalTopologyByName(policyInfo.getPolicyName());
+ list.add(policy);
+ }
+ return list;
+ }
+
+ private ActiveTicketsResponse getTicketResponse(UUID uuid)
+ throws JsonParseException, JsonMappingException, IOException {
+ Ticket ticketRow = ticketMgtRequestManager.getExistingTickets(uuid);
+ String ticketString = ticketRow.getTickets();
+ ObjectMapper om = new ObjectMapper();
+ return om.readValue(ticketString, ActiveTicketsResponse.class);
+ }
+
+ private TopologyResponse getTopologyResponse(UUID uuid)
+ throws JsonParseException, JsonMappingException, IOException {
+ Topology topologyRow = topologyRequestManager.getExistingTopology(uuid);
+ String topologyString = topologyRow.getTopology();
+ ObjectMapper om = new ObjectMapper();
+ return om.readValue(topologyString, TopologyResponse.class);
+ }
+
+ private OptimizerRequest getOptimizerRequest(Request request)
+ throws JsonParseException, JsonMappingException, IOException {
+ String requestString = request.getRequest();
+ ObjectMapper om = new ObjectMapper();
+ return om.readValue(requestString, OptimizerRequest.class);
+ }
+
+
+ private OptimizerEngineResponse initiateOptimizer(OptimizerParameters request, Request requestRow)
+ throws CmsoException, JsonProcessingException {
+
+
+ UUID uuid = requestRow.getUuid();
+ OptimizerEngineResponse apiResponse = new OptimizerEngineResponse();
+ apiResponse.setRequestId(uuid.toString());
+
+ String workingFolderString = env.getProperty("cmso.optimizer.engine.working.folder", "data/engine");
+ File workingFolder = new File(workingFolderString + File.separator + requestRow.getUuid().toString());
+ workingFolder.mkdirs();
+ Long timeLimit = env.getProperty("cmso.minizinc.command.timelimit", Long.class);
+ // TODO calculate time limit
+ Process p = null;
+ try {
+ Path inputFileName = Paths.get(workingFolder.getAbsolutePath(), "input.dzn");
+ Path outputFileName = Paths.get(workingFolder.getAbsolutePath(), "results.yaml");
+ String dzn = request.toMiniZinc();
+ Files.write(inputFileName, dzn.getBytes());
+ List<String> command = buildCommand(inputFileName, outputFileName, timeLimit.toString());
+ debug.debug("engine command=", command.toString());
+ ProcessBuilder pb = new ProcessBuilder(command);
+ p = pb.start();
+ String stdout = IOUtils.toString(p.getInputStream(), "UTF-8");
+ String stderr = IOUtils.toString(p.getErrorStream(), "UTF-8");
+ debug.debug("stdout=" + stdout);
+ debug.debug("stderr=" + stderr);
+ if (p.isAlive()) {
+ p.wait();
+ }
+ OptimizerResponseUtility responseUtility = new OptimizerResponseUtility();
+ OptimizerResults optimizerResults = responseUtility.parseOptimizerResult(outputFileName.toFile());
+ apiResponse.setOptimizerResults(optimizerResults);
+ apiResponse.setStatus(OptimizerEngineResponseStatus.COMPLETED);
+
+ } catch (InterruptedException e) {
+ apiResponse.setStatus(OptimizerEngineResponseStatus.FAILED);
+ apiResponse.setErrorMessage(
+ LogMessages.OPTIMIZER_REQUEST_TIMEOUT.format(uuid.toString(), timeLimit.toString()));
+ Observation.report(LogMessages.OPTIMIZER_REQUEST_TIMEOUT, uuid.toString(), timeLimit.toString());
+ p.destroyForcibly();
+ } catch (Exception e) {
+ apiResponse.setStatus(OptimizerEngineResponseStatus.FAILED);
+ apiResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+ Observation.report(LogMessages.UNEXPECTED_RESPONSE, e, e.getMessage());
+ } finally {
+ if (workingFolder.exists()) {
+ workingFolder.delete();
+ }
+ }
+ return apiResponse;
+ }
+
+ private List<String> buildCommand(Path inputFileName, Path outputFileName, String timeLimit) {
+ List<String> command = new ArrayList<>();
+ String minizinc = env.getProperty("cmso.minizinc.command.exe", "minizinc");
+ String solver = env.getProperty("cmso.minizinc.command.solver", "OSICBC");
+ String additional = env.getProperty("cmso.minizinc.command.additional", "");
+ String script = env.getProperty("cmso.minizinc.command.mzn", "scripts/minizinc/generic_attributes.mzn");
+
+ command.add(minizinc);
+ command.add("--solver");
+ command.add(solver);
+ command.add("--time-limit");
+ command.add(timeLimit);
+ command.add("--time-limit");
+ command.add(timeLimit);
+ command.add("--soln-sep");
+ command.add("\"\"");
+ command.add("--search-complete-msg");
+ command.add("\"\"");
+ for (String add : additional.split(" ")) {
+ command.add(add);
+ }
+ command.add("-o");
+ command.add(outputFileName.toString());
+ command.add(script);
+ command.add(inputFileName.toString());
+ return command;
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerRequestManager.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerRequestManager.java
new file mode 100644
index 0000000..34de3df
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/OptimizerRequestManager.java
@@ -0,0 +1,185 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse.OptimizerEngineResponseStatus;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerResults;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerSchedule;
+import org.onap.optf.cmso.optimizer.clients.topology.TopologyRequestManager;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.model.Optimizer;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Response;
+import org.onap.optf.cmso.optimizer.model.dao.OptimizerDao;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.ResponseDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerScheduleInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class OPtimizerRequestManager.
+ */
+@Component
+public class OptimizerRequestManager {
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Autowired
+ OptimizerDao optimizerDao;
+
+ @Autowired
+ ResponseDao responseDao;
+
+ @Autowired
+ OptimizerClient optimizerClient;
+
+ @Autowired
+ TopologyRequestManager topologyRequestManager;
+
+ /**
+ * Creates the Optimizer request.
+ *
+ * @param requestRow the request row
+ * @return the Optimizer response
+ */
+ public OptimizerEngineResponse createOptimizerRequest(Request requestRow) {
+ //
+ if (okToDispatch()) {
+ Optimizer optimizer = getExistingOptmizer(requestRow.getUuid());
+ if (optimizer == null) {
+ optimizer = new Optimizer();
+ optimizer.setUuid(requestRow.getUuid());
+ optimizer.setOptimizeRetries(0);
+ }
+ optimizer.setOptimizeStart(System.currentTimeMillis());
+ OptimizerEngineResponse apiResponse = optimizerClient.makeRequest(requestRow, optimizer);
+ if (apiResponse.getStatus() == OptimizerEngineResponseStatus.COMPLETED) {
+ optimizer.setOptimizeEnd(System.currentTimeMillis());
+ optimizer.setOptimizeResponse(""); // Perhaps we do not need to persist...
+ buildFinalResponse(requestRow, apiResponse);
+ }
+ optimizerDao.save(optimizer);
+ return apiResponse;
+ } else {
+ OptimizerEngineResponse apiResponse = new OptimizerEngineResponse();
+ apiResponse.setRequestId(requestRow.getUuid().toString());
+ apiResponse.setStatus(OptimizerEngineResponseStatus.IN_QUEUE);
+ apiResponse.setPollingSeconds(60);
+ return apiResponse;
+ }
+ }
+
+
+ private void buildFinalResponse(Request requestRow, OptimizerEngineResponse apiResponse) {
+ Optional<Response> opt = responseDao.findById(requestRow.getUuid());
+ Response responseRow = null;
+ if (opt.isPresent())
+ {
+ responseRow = opt.get();
+ }
+ if (responseRow == null)
+ {
+ responseRow = new Response();
+ responseRow.setUuid(requestRow.getUuid());
+ }
+
+ try
+ {
+ OptimizerResults results = apiResponse.getOptimizerResults();
+ OptimizerResponse response = new OptimizerResponse();
+ response.setRequestId(requestRow.getUuid().toString());
+
+ String optString = requestRow.getRequest();
+
+ OptimizerRequest optimizerResquest = new ObjectMapper().readValue(optString, OptimizerRequest.class);
+ TopologyResponse topologyResponse = topologyRequestManager.getTopologyResponse(requestRow.getUuid());
+ ElementWindowMapping ewm = new ElementWindowMapping(optimizerResquest, topologyResponse);
+ ewm.initializeForProcessResult();
+ for (OptimizerSchedule result : results.getSchedules()) {
+ OptimizerScheduleInfo info = ewm.processResult(result);
+ if (info != null) {
+ response.getSchedules().add(info);
+ }
+ }
+ responseRow.setRepsonse(new ObjectMapper().writeValueAsString(response));
+ requestRow.setStatus(OptimizeScheduleStatus.COMPLETED.toString());
+ responseDao.save(responseRow);
+ requestDao.save(requestRow);
+ }
+ catch (Exception e)
+ {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ requestRow.setStatus(OptimizeScheduleStatus.FAILED.toString());
+ requestRow.setMessage(e.getMessage());
+ responseRow.setRepsonse("");
+ responseDao.save(responseRow);
+ requestDao.save(requestRow);
+ }
+ }
+
+
+
+ private boolean okToDispatch() {
+ // TODO Auto-generated method stub
+
+ // Will probably change to @Async on makeRequest to queue requests in a different thread.
+ return true;
+ }
+
+
+ /**
+ * Gets the existing optimizer row.
+ *
+ * @param uuid the uuid
+ * @return the existing optmizer row
+ */
+ public Optimizer getExistingOptmizer(UUID uuid) {
+ Optional<Optimizer> oppt = optimizerDao.findById(uuid);
+ if (oppt.isPresent()) {
+ return oppt.get();
+ }
+ return null;
+ }
+
+
+ public List<OptimizerScheduleInfo> getScheduleInfo(Response responseRow) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ElementSlot.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ElementSlot.java
new file mode 100644
index 0000000..8f76b10
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ElementSlot.java
@@ -0,0 +1,106 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+/**
+ * The Class ElementSlot.
+ */
+/*
+ 1,0,1
+ 2,0,1
+ 3,0,1
+ 4,0,1
+ 5,0,1
+ */
+public class ElementSlot {
+ private Integer elementIndex = 0;
+ private Integer slot = 0;
+ private Integer loader = 0;
+ private Long time = 0L;
+
+ public Integer getElementIndex() {
+ return elementIndex;
+ }
+
+ public void setElementIndex(Integer elementIndex) {
+ this.elementIndex = elementIndex;
+ }
+
+ /**
+ * Gets the slot.
+ *
+ * @return the slot
+ */
+ public Integer getSlot() {
+ return slot;
+ }
+
+ /**
+ * Sets the slot.
+ *
+ * @param slot the new slot
+ */
+ public void setSlot(Integer slot) {
+ this.slot = slot;
+ }
+
+ /**
+ * Gets the loader.
+ *
+ * @return the loader
+ */
+ public Integer getLoader() {
+ return loader;
+ }
+
+ /**
+ * Sets the loader.
+ *
+ * @param loader the new loader
+ */
+ public void setLoader(Integer loader) {
+ this.loader = loader;
+ }
+
+ /**
+ * Instantiates a new element slot.
+ *
+ * @param cols the values
+ */
+ public ElementSlot(String[] cols) {
+ if (cols.length > 0) {
+ elementIndex = Integer.valueOf(cols[0]);
+ }
+ if (cols.length > 1) {
+ slot = Integer.valueOf(cols[1]);
+ }
+ if (cols.length > 2) {
+ loader = Integer.valueOf(cols[2]);
+ }
+ }
+
+ public Long getTime() {
+ return time;
+ }
+
+ public void setTime(Long time) {
+ this.time = time;
+ }
+}
+
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerEngineResponse.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerEngineResponse.java
new file mode 100644
index 0000000..7315b31
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerEngineResponse.java
@@ -0,0 +1,65 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+public class OptimizerEngineResponse
+{
+
+ public enum OptimizerEngineResponseStatus {
+ IN_PROGRESS, COMPLETED, FAILED, IN_QUEUE,
+ }
+
+ private String requestId;
+ private OptimizerResults optimizerResults;
+ private OptimizerEngineResponseStatus status;
+ private Integer pollingSeconds;
+ private String errorMessage;
+ public String getRequestId() {
+ return requestId;
+ }
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+ public OptimizerResults getOptimizerResults() {
+ return optimizerResults;
+ }
+ public void setOptimizerResults(OptimizerResults oprimizerResults) {
+ this.optimizerResults = oprimizerResults;
+ }
+ public OptimizerEngineResponseStatus getStatus() {
+ return status;
+ }
+ public void setStatus(OptimizerEngineResponseStatus status) {
+ this.status = status;
+ }
+ public Integer getPollingSeconds() {
+ return pollingSeconds;
+ }
+ public void setPollingSeconds(Integer pollingSeconds) {
+ this.pollingSeconds = pollingSeconds;
+ }
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutResults.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutResults.java
new file mode 100644
index 0000000..2c1c777
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutResults.java
@@ -0,0 +1,46 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+import java.util.List;
+
+/*
+
+ */
+public class OptimizerOutResults {
+ private Long elapsedMillis;
+ private List<OptimizerOutSchedule> results;
+
+ public Long getElapsedMillis() {
+ return elapsedMillis;
+ }
+
+ public void setElapsedMillis(Long elapsed_millis) {
+ this.elapsedMillis = elapsed_millis;
+ }
+
+ public List<OptimizerOutSchedule> getResults() {
+ return results;
+ }
+
+ public void setResults(List<OptimizerOutSchedule> schedules) {
+ this.results = schedules;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutSchedule.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutSchedule.java
new file mode 100644
index 0000000..abcebf2
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutSchedule.java
@@ -0,0 +1,60 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+/*
+num_scheduled: 0
+total_completion_time: 0
+element_slot_loader: |
+ 1,0,1
+ 2,0,1
+ 3,0,1
+ 4,0,1
+ 5,0,1
+ */
+public class OptimizerOutSchedule {
+ private Long numScheduled;
+ private Long totalCompletionTime;
+ private String elementSlotLoader;
+
+ public Long getNumScheduled() {
+ return numScheduled;
+ }
+
+ public void setNumScheduled(Long numScheduled) {
+ this.numScheduled = numScheduled;
+ }
+
+ public Long getTotalCompletionTime() {
+ return totalCompletionTime;
+ }
+
+ public void setTotalCompletionTime(Long totalCompletionTime) {
+ this.totalCompletionTime = totalCompletionTime;
+ }
+
+ public String getElementSlotLoader() {
+ return elementSlotLoader;
+ }
+
+ public void setElementSlotLoader(String elementSlotLoader) {
+ this.elementSlotLoader = elementSlotLoader;
+ }
+}
+
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutYaml.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutYaml.java
new file mode 100644
index 0000000..c9c16cb
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerOutYaml.java
@@ -0,0 +1,65 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+/*
+results:
+ result:
+ num_scheduled: 0
+ total_completion_time: 0
+ element_slot_loader: |
+ 1,0,1
+ 2,0,1
+ 3,0,1
+ 4,0,1
+ 5,0,1
+ result:
+ num_scheduled: 1
+ total_completion_time: 2
+ element_slot_loader: |
+ 1,0,1
+ 2,0,1
+ 3,2,1
+ 4,0,1
+ 5,0,1
+ result:
+ num_scheduled: 4
+ total_completion_time: 8
+ element_slot_loader: |
+ 1,2,1
+ 2,1,1
+ 3,2,1
+ 4,0,1
+ 5,3,1
+ elapsed_millis: 3400
+
+ */
+public class OptimizerOutYaml {
+
+ private OptimizerOutResults results;
+
+ public OptimizerOutResults getResults() {
+ return results;
+ }
+
+ public void setResults(OptimizerOutResults results) {
+ this.results = results;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerParameters.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerParameters.java
new file mode 100644
index 0000000..be74e37
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerParameters.java
@@ -0,0 +1,225 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/*
+ * numElements = 5;
+maxTime = 5;
+numLoaders = 1;
+noConflict = [| true , true , true , true , true
+ | true , true , true , true , true
+ | false , true , false , true , false
+ | false , false , false , false , false
+ | true , false , true , false , true
+ |];
+slotCapacity = [5, 5, 5, 5, 5];
+loaderCapacity = [|
+5, 5, 5, 5, 5
+|];
+
+
+numAttributes = 0;
+attributesRange = [];
+attributes = [];
+attributeConcurrencyLimit = [];
+ */
+public class OptimizerParameters {
+ private Long numElements;
+ private Long numLoaders;
+ private List<Long> elementSlotCapacity = new ArrayList<>();
+ private Long maxTime;
+ private List<List<Boolean>> noConflict = new ArrayList<>();
+ private List<List<Long>> loaderCapacity = new ArrayList<>();
+
+ private Long numAttributes;
+ private List<Long> attributesRange = new ArrayList<>();
+ private List<List<Long>> attributes = new ArrayList<>();
+ private List<List<Long>> attributeConcurrencyLimit = new ArrayList<>();
+
+ public Long getNumElements() {
+ return numElements;
+ }
+
+ public void setNumElements(Long numElements) {
+ this.numElements = numElements;
+ }
+
+ public Long getMaxTime() {
+ return maxTime;
+ }
+
+ public void setMaxTime(Long maxTime) {
+ this.maxTime = maxTime;
+ }
+
+ public Long getNumLoaders() {
+ return numLoaders;
+ }
+
+ public void setNumLoaders(Long numLoaders) {
+ this.numLoaders = numLoaders;
+ }
+
+ public List<List<Boolean>> getNoConflict() {
+ return noConflict;
+ }
+
+ public void setNoConflict(List<List<Boolean>> noConflict) {
+ this.noConflict = noConflict;
+ }
+
+ public List<Long> getElementSlotCapacity() {
+ return elementSlotCapacity;
+ }
+
+ public void setElementSlotCapacity(List<Long> slotCapacity) {
+ this.elementSlotCapacity = slotCapacity;
+ }
+
+ public List<List<Long>> getLoaderCapacity() {
+ return loaderCapacity;
+ }
+
+ public void setLoaderCapacity(List<List<Long>> loaderCapacity) {
+ this.loaderCapacity = loaderCapacity;
+ }
+
+ public Long getNumAttributes() {
+ return numAttributes;
+ }
+
+ public void setNumAttributes(Long numAttributes) {
+ this.numAttributes = numAttributes;
+ }
+
+ public List<Long> getAttributesRange() {
+ return attributesRange;
+ }
+
+ public void setAttributesRange(List<Long> attributesRange) {
+ this.attributesRange = attributesRange;
+ }
+
+ public List<List<Long>> getAttributes() {
+ return attributes;
+ }
+
+ public void setAttributes(List<List<Long>> attributes) {
+ this.attributes = attributes;
+ }
+
+ public List<List<Long>> getAttributeConcurrencyLimit() {
+ return attributeConcurrencyLimit;
+ }
+
+ public void setAttributeConcurrencyLimit(List<List<Long>> attributeConcurrencyLimit) {
+ this.attributeConcurrencyLimit = attributeConcurrencyLimit;
+ }
+
+
+
+ public String toMiniZinc() {
+ StringBuilder sb = new StringBuilder();
+ appendAttribute(sb, "numElements", numElements.toString());
+ appendAttribute(sb, "maxTime", maxTime.toString());
+ appendAttribute(sb, "numLoaders", numLoaders.toString());
+ appendAttribute(sb, "numAttributes", numAttributes.toString());
+
+ appendAttribute(sb, "noConflict", "[|\n" + formatBooleanRows(noConflict) + "|]");
+ appendAttribute(sb, "elementSlotCapacity", "[" + formatLongList(elementSlotCapacity) + "]");
+ appendAttribute(sb, "loaderCapacity", "[|\n" + formatLongRows(loaderCapacity) + "|]");
+
+
+ if (attributesRange.size() > 0) {
+ appendAttribute(sb, "attributesRange", "[" + formatLongList(attributesRange) + "]");
+ }
+ else {
+ appendAttribute(sb, "attributesRange", "[]");
+ }
+ if (attributes.size() > 0) {
+ appendAttribute(sb, "attributes", "[|\n" + formatLongRows(attributes) + "|]");
+ }
+ else {
+ appendAttribute(sb, "attributes", "array2d(1..numElements, 1..numAttributes, [])");
+ }
+ if (attributeConcurrencyLimit.size() > 0) {
+ appendAttribute(sb, "attributeConcurrencyLimit", "[|\n" + formatLongRows(attributeConcurrencyLimit) + "|]");
+ }
+ else
+ {
+ appendAttribute(sb, "attributeConcurrencyLimit", "array2d(1..numAttributes, 1..maxTime, [])");
+ }
+ return sb.toString();
+ }
+
+ private void appendAttribute(StringBuilder sb, String name, String value) {
+ sb.append(name).append(" = ").append(value).append(";\n");
+ }
+
+ // Methods to dump minizinc parameters. THese may be very large
+ //
+ private String formatBooleanRows(List<List<Boolean>> list) {
+ StringBuilder sb = new StringBuilder();
+ String row = "";
+ for (List<Boolean> objectList : list) {
+ sb.append(row).append(formatBooleanList(objectList));
+ row = "| ";
+ }
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ private String formatBooleanList(List<Boolean> list) {
+ StringBuilder sb = new StringBuilder();
+ String comma = "";
+ for (Object object : list) {
+ sb.append(comma).append(object.toString());
+ comma = ", ";
+ }
+ return sb.toString();
+ }
+
+ private String formatLongRows(List<List<Long>> list) {
+ StringBuilder sb = new StringBuilder();
+ String row = "";
+ for (List<Long> objectList : list) {
+ sb.append(row).append(formatLongList(objectList));
+ row = "| ";
+ }
+ sb.append("\n");
+ return sb.toString();
+ }
+
+ private String formatLongList(List<Long> list) {
+ StringBuilder sb = new StringBuilder();
+ String comma = "";
+ for (Object object : list) {
+ sb.append(comma).append(object.toString());
+ comma = ", ";
+ }
+ return sb.toString();
+ }
+
+}
+
+
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResponseUtility.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResponseUtility.java
new file mode 100644
index 0000000..89208b2
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResponseUtility.java
@@ -0,0 +1,82 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+import com.google.common.base.CaseFormat;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.introspector.Property;
+import org.yaml.snakeyaml.introspector.PropertyUtils;
+
+public class OptimizerResponseUtility extends PropertyUtils {
+
+ public OptimizerResults parseOptimizerResult(File resultsFile) {
+ OptimizerResults results = null;
+ try (InputStream input = new FileInputStream(resultsFile)) {
+ Constructor constructor = new Constructor(OptimizerOutResults.class);
+ constructor.setPropertyUtils(this);
+ Yaml yaml = new Yaml(constructor);
+ OptimizerOutResults optimizerOut = yaml.load(input);
+ results = marshall(optimizerOut);
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return results;
+ }
+
+ private OptimizerResults marshall(OptimizerOutResults optimizerOut) {
+ OptimizerResults results = new OptimizerResults();
+ results.setElapsedMillis(optimizerOut.getElapsedMillis());
+ List<OptimizerSchedule> schedules = new ArrayList<>();
+ results.setSchedules(schedules);
+ for (OptimizerOutSchedule sch : optimizerOut.getResults()) {
+ schedules.add(marshall(sch));
+ }
+ return results;
+ }
+
+ private OptimizerSchedule marshall(OptimizerOutSchedule sch) {
+ OptimizerSchedule optimizerSchedule = new OptimizerSchedule();
+ optimizerSchedule.setNumScheduled(sch.getNumScheduled());
+ optimizerSchedule.setTotalCompletionTime(sch.getTotalCompletionTime());
+ String[] rows = sch.getElementSlotLoader().split("\n");
+ List<ElementSlot> slots = new ArrayList<>();
+ optimizerSchedule.setElementSlotLoader(slots);
+ for (String row : rows) {
+ String[] cols = row.split(",");
+ ElementSlot slot = new ElementSlot(cols);
+ slots.add(slot);
+ }
+ return optimizerSchedule;
+ }
+
+ @Override
+ public Property getProperty(Class<? extends Object> type, String name) {
+ name = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name);
+ return super.getProperty(type, name);
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResults.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResults.java
new file mode 100644
index 0000000..9c31a9f
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerResults.java
@@ -0,0 +1,46 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+import java.util.List;
+
+/*
+
+ */
+public class OptimizerResults {
+ private Long elapsedMillis;
+ private List<OptimizerSchedule> schedules;
+
+ public Long getElapsedMillis() {
+ return elapsedMillis;
+ }
+
+ public void setElapsedMillis(Long elapsed_millis) {
+ this.elapsedMillis = elapsed_millis;
+ }
+
+ public List<OptimizerSchedule> getSchedules() {
+ return schedules;
+ }
+
+ public void setSchedules(List<OptimizerSchedule> schedules) {
+ this.schedules = schedules;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerSchedule.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerSchedule.java
new file mode 100644
index 0000000..d4bc008
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/OptimizerSchedule.java
@@ -0,0 +1,63 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+import java.util.List;
+
+/*
+num_scheduled: 0
+total_completion_time: 0
+element_slot_loader: |
+ 1,0,1
+ 2,0,1
+ 3,0,1
+ 4,0,1
+ 5,0,1
+ */
+public class OptimizerSchedule {
+ private Long numScheduled;
+ private Long totalCompletionTime;
+ private List<ElementSlot> elementSlotLoader;
+
+ public Long getNumScheduled() {
+ return numScheduled;
+ }
+
+ public void setNumScheduled(Long numScheduled) {
+ this.numScheduled = numScheduled;
+ }
+
+ public Long getTotalCompletionTime() {
+ return totalCompletionTime;
+ }
+
+ public void setTotalCompletionTime(Long totalCompletionTime) {
+ this.totalCompletionTime = totalCompletionTime;
+ }
+
+ public List<ElementSlot> getElementSlotLoader() {
+ return elementSlotLoader;
+ }
+
+ public void setElementSlotLoader(List<ElementSlot> elementSlotLoader) {
+ this.elementSlotLoader = elementSlotLoader;
+ }
+
+}
+
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/Results.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/Results.java
new file mode 100644
index 0000000..402bdf2
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/Results.java
@@ -0,0 +1,46 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+import java.util.List;
+
+/*
+
+ */
+public class Results {
+ private Long elapsedMillis;
+ private List<OptimizerSchedule> schedules;
+
+ public Long getElapsedMillis() {
+ return elapsedMillis;
+ }
+
+ public void setElapsedMillis(Long elapsed_millis) {
+ this.elapsedMillis = elapsed_millis;
+ }
+
+ public List<OptimizerSchedule> getSchedules() {
+ return schedules;
+ }
+
+ public void setSchedules(List<OptimizerSchedule> schedules) {
+ this.schedules = schedules;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtClient.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtClient.java
new file mode 100644
index 0000000..21f0d76
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtClient.java
@@ -0,0 +1,231 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.ticketmgt;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.clients.common.models.ElementCriteria;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsRequest;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse.ActiveTicketResponseStatus;
+import org.onap.optf.cmso.optimizer.clients.topology.TopologyRequestManager;
+import org.onap.optf.cmso.optimizer.clients.topology.models.ConstraintElements;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyElementInfo;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyPolicyInfo;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.filters.CmsoClientFilters;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Ticket;
+import org.onap.optf.cmso.optimizer.model.Topology;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.TicketDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.ElementInfo;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class TicketMgtClient.
+ */
+@Component
+public class TicketMgtClient {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ PropertiesManagement pm;
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Autowired
+ TicketDao ticketDao;
+
+ @Autowired
+ TopologyRequestManager topologyRequestManager;
+
+ /**
+ * Make request of ticket mgt system.
+ *
+ * @param requestRow the request row
+ * @param ticketRow the ticket row
+ * @return the active tickets response
+ */
+ public ActiveTicketsResponse makeRequest(Request requestRow, Ticket ticketRow) {
+ ActiveTicketsResponse ticketResponse = new ActiveTicketsResponse();
+ Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
+ if (ticketRow.getTicketsRetries() >= maxAttempts) {
+ ticketResponse.setStatus(ActiveTicketResponseStatus.FAILED);
+ ticketResponse.setErrorMessage(LogMessages.EXCEEDED_RETRY_LIMIT.format("Topology", maxAttempts.toString()));
+ Observation.report(LogMessages.EXCEEDED_RETRY_LIMIT, "TicketMgt", maxAttempts.toString());
+ return ticketResponse;
+ }
+ ObjectMapper om = new ObjectMapper();
+ String originalRequest = requestRow.getRequest();
+ OptimizerRequest optimizerRequest = null;;
+ try {
+ optimizerRequest = om.readValue(originalRequest, OptimizerRequest.class);
+ ActiveTicketsRequest apiRequest = buildRequest(optimizerRequest);
+ ticketResponse = initiateApiRequest(apiRequest, ticketRow, requestRow);
+ } catch (Exception e) {
+ ticketResponse.setStatus(ActiveTicketResponseStatus.FAILED);
+ ticketResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return ticketResponse;
+ }
+
+ private ActiveTicketsRequest buildRequest(OptimizerRequest optimizerRequest)
+ throws JsonParseException, JsonMappingException, IOException {
+ UUID uuid = UUID.fromString(optimizerRequest.getRequestId());
+ Topology topologyRow = topologyRequestManager.getExistingTopology(uuid);
+ String topologyString = topologyRow.getTopology();
+ TopologyResponse topologyResponse = new ObjectMapper().readValue(topologyString, TopologyResponse.class);
+ ActiveTicketsRequest apiRequest = new ActiveTicketsRequest();
+ apiRequest.setRequestId(optimizerRequest.getRequestId());
+ apiRequest.setCommonData(optimizerRequest.getCommonData());
+ apiRequest.setChangeWindows(optimizerRequest.getChangeWindows());
+ apiRequest.setElements(getElementCriteria(topologyResponse));
+ return apiRequest;
+ }
+
+ private List<TopologyPolicyInfo> getPolicies(OptimizerRequest optimizerRequest) {
+ List<TopologyPolicyInfo> list = new ArrayList<>();
+ for (PolicyInfo optInfo : optimizerRequest.getPolicies()) {
+ TopologyPolicyInfo topInfo = new TopologyPolicyInfo();
+ topInfo.setPolicyDescription(optInfo.getPolicyDescription());
+ topInfo.setPolicyName(optInfo.getPolicyName());
+ topInfo.setPolicyModifiers(optInfo.getPolicyModifiers());
+ list.add(topInfo);
+ }
+ return list;
+ }
+
+ private List<ElementCriteria> getElementCriteria(TopologyResponse topologyResponse) {
+ Map<String, ElementCriteria> map = new HashMap<>();
+ for (TopologyElementInfo info : topologyResponse.getElements()) {
+ ElementCriteria criteria = new ElementCriteria();
+ criteria.setElementId(info.getElementId());
+ criteria.setElementData(info.getElementData());
+ map.put(criteria.getElementId(), criteria);
+ if (info.getRequiredElements() != null) {
+ for (String required : info.getRequiredElements()) {
+ if (!map.containsKey(required)) {
+ ElementCriteria crit = new ElementCriteria();
+ crit.setElementId(required);
+ map.put(crit.getElementId(), crit);
+ }
+ }
+ }
+ if (info.getConstraintElements() != null) {
+ for (ConstraintElements constraint : info.getConstraintElements()) {
+ if (!map.containsKey(constraint.getElementId())) {
+ ElementCriteria crit = new ElementCriteria();
+ crit.setElementId(constraint.getElementId());
+ map.put(crit.getElementId(), crit);
+ }
+ }
+ }
+
+ }
+ List<ElementCriteria> list = new ArrayList<>();
+ list.addAll(map.values());
+ return list;
+ }
+
+
+ private ActiveTicketsResponse initiateApiRequest(ActiveTicketsRequest apiRequest, Ticket ticketRow,
+ Request requestRow) throws CmsoException, JsonProcessingException {
+ String url = env.getProperty("cmso.ticket.create.request.url");
+ String username = env.getProperty("mechid.user");
+ String password = pm.getProperty("mechid.pass", "");
+ Client client = ClientBuilder.newClient();
+ client.register(new BasicAuthenticatorFilter(username, password));
+ client.register(new CmsoClientFilters());
+ debug.debug("topology url / user: " + url + " / " + username);
+ debug.debug("topology Request: " + new ObjectMapper().writeValueAsString(apiRequest));
+ Observation.report(LogMessages.TOPOLOGY_REQUEST, "Begin", apiRequest.getRequestId(), url);
+ ticketRow.setTicketsStart(System.currentTimeMillis());
+
+ WebTarget webTarget = client.target(url);
+ Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
+ Response response = invocationBuilder.post(Entity.json(apiRequest));
+ Observation.report(LogMessages.TOPOLOGY_REQUEST, "End", apiRequest.getRequestId(), url);
+ ActiveTicketsResponse apiResponse = null;
+ switch (response.getStatus()) {
+ case 202:
+ debug.debug("Successfully scheduled asynchronous ticket request: " + apiRequest.getRequestId());
+ break;
+ case 200:
+ debug.debug("Successfully retrieved tickets: " + apiRequest.getRequestId());
+ apiResponse = processApiResponse(apiRequest, response, ticketRow, requestRow);
+ break;
+ default:
+ throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNEXPECTED_RESPONSE, url,
+ response.getStatusInfo().toString());
+ }
+ return apiResponse;
+ }
+
+ private ActiveTicketsResponse processApiResponse(ActiveTicketsRequest apiRequest, Response response,
+ Ticket ticketRow, Request requestRow) {
+ String responseString = response.readEntity(String.class);
+ ActiveTicketsResponse apiResponse = null;
+ try {
+ apiResponse = new ObjectMapper().readValue(responseString, ActiveTicketsResponse.class);
+ ticketRow.setTickets(responseString);
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ apiResponse = new ActiveTicketsResponse();
+ apiResponse.setRequestId(apiRequest.getRequestId());
+ apiResponse.setStatus(ActiveTicketResponseStatus.FAILED);
+ apiResponse.setErrorMessage(e.getMessage());
+ }
+ return apiResponse;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtRequestManager.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtRequestManager.java
new file mode 100644
index 0000000..8520809
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtRequestManager.java
@@ -0,0 +1,93 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.ticketmgt;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Ticket;
+import org.onap.optf.cmso.optimizer.model.Topology;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.TicketDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * Ticket Mgt request manager.
+ *
+ * @author jf9860
+ *
+ */
+@Component
+public class TicketMgtRequestManager {
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Autowired
+ TicketDao ticketDao;
+
+ @Autowired
+ TicketMgtClient ticketmgtClient;
+
+ /**
+ * Creates the tickets request.
+ *
+ * @param requestRow the uuid
+ * @return the active tickets response
+ */
+ public ActiveTicketsResponse createTicketsRequest(Request requestRow) {
+ Ticket row = null;
+ Optional<Ticket> rowOpt = ticketDao.findById(requestRow.getUuid());
+ if (rowOpt.isPresent()) {
+ row = rowOpt.get();
+
+ }
+ if (row == null) {
+ row = new Ticket();
+ row.setUuid(requestRow.getUuid());
+ row.setTicketsRetries(0);
+ }
+ ActiveTicketsResponse apiResponse = ticketmgtClient.makeRequest(requestRow, row);
+ ticketDao.save(row);
+ return apiResponse;
+ }
+ /**
+ * Gets the existing tickets.
+ *
+ * @param uuid the uuid
+ * @return the existing tickets
+ */
+ public Ticket getExistingTickets(UUID uuid) {
+ Optional<Ticket> opt = ticketDao.findById(uuid);
+ if (opt.isPresent()) {
+ return opt.get();
+ }
+ return null;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsRequest.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsRequest.java
new file mode 100644
index 0000000..f03c6f3
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsRequest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.clients.common.models.ElementCriteria;
+import org.onap.optf.cmso.optimizer.service.rs.models.ChangeWindow;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+public class ActiveTicketsRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ActiveTicketsRequest.class);
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(
+ value = "Implementation specific name value pairs provided to be passed to Ticket Management query .")
+ private List<NameValue> commonData;
+
+ @ApiModelProperty(value = "Lists of desired change windows for which TicketData will be returned.")
+ private List<ChangeWindow> changeWindows = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the elements for which TicketData will be returned.")
+ private List<ElementCriteria> elements = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+
+ public List<NameValue> getCommonData() {
+ return commonData;
+ }
+
+
+ public void setCommonData(List<NameValue> commonData) {
+ this.commonData = commonData;
+ }
+
+
+ public List<ChangeWindow> getChangeWindows() {
+ return changeWindows;
+ }
+
+
+ public void setChangeWindows(List<ChangeWindow> changeWindows) {
+ this.changeWindows = changeWindows;
+ }
+
+
+ public List<ElementCriteria> getElements() {
+ return elements;
+ }
+
+
+ public void setElements(List<ElementCriteria> elements) {
+ this.elements = elements;
+ }
+
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsResponse.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsResponse.java
new file mode 100644
index 0000000..9780af6
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsResponse.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ActiveTicketsResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ActiveTicketsResponse.class);
+
+ public enum ActiveTicketResponseStatus {
+ IN_PROGRESS, COMPLETED, FAILED,
+ }
+
+ private String requestId;
+
+ private List<TicketData> elements = new ArrayList<>();
+
+ private ActiveTicketResponseStatus status;
+
+ private Integer pollingSeconds;
+ private String errorMessage;
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public List<TicketData> getElements() {
+ return elements;
+ }
+
+ public void setElements(List<TicketData> elements) {
+ this.elements = elements;
+ }
+
+ public ActiveTicketResponseStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(ActiveTicketResponseStatus status) {
+ this.status = status;
+ }
+
+ public Integer getPollingSeconds() {
+ return pollingSeconds;
+ }
+
+ public void setPollingSeconds(Integer pollingSeconds) {
+ this.pollingSeconds = pollingSeconds;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/Availability.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/Availability.java
new file mode 100644
index 0000000..37995bb
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/Availability.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+public enum Availability {
+ full, partial, unavailable
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/TicketData.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/TicketData.java
new file mode 100644
index 0000000..07b9f94
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/TicketData.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import org.springframework.format.annotation.DateTimeFormat;
+
+@ApiModel(value = "Ticket Data", description = "Change Management Ticket Information.")
+public class TicketData implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(TicketData.class);
+
+ @ApiModelProperty(value = "Unique ticket identifier")
+ private String id;
+
+ @ApiModelProperty(value = "Scheduled start time of change.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date startTime;
+
+ @ApiModelProperty(value = "Scheduled end time of change.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date endTime;
+
+ @ApiModelProperty(value = "Availability of element(s) during change window")
+ private Availability availability;
+
+ @ApiModelProperty(
+ value = "List elementIds of elements being changed. At least one maps to elementId in the request")
+ private List<String> elementIds = new ArrayList<>();
+
+ @ApiModelProperty(value = "Details of the change.")
+ private String changeDetails;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
+
+ public Date getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
+
+ public Availability getAvailability() {
+ return availability;
+ }
+
+ public void setAvailability(Availability availability) {
+ this.availability = availability;
+ }
+
+ public List<String> getElementIds() {
+ return elementIds;
+ }
+
+ public void setElementIds(List<String> elementIds) {
+ this.elementIds = elementIds;
+ }
+
+ public String getChangeDetails() {
+ return changeDetails;
+ }
+
+ public void setChangeDetails(String changeDetails) {
+ this.changeDetails = changeDetails;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java
new file mode 100644
index 0000000..c333651
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java
@@ -0,0 +1,193 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.topology;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.clients.common.models.ElementCriteria;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyPolicyInfo;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyRequest;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse.TopologyRequestStatus;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.filters.CmsoClientFilters;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Topology;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.TopologyDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.ElementInfo;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class TopologyClient.
+ */
+@Component
+public class TopologyClient {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ PropertiesManagement pm;
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Autowired
+ TopologyDao topologyDao;
+
+ /**
+ * Make request.
+ *
+ * @param request the request
+ * @param topology the topology
+ * @return the topology response
+ */
+ public TopologyResponse makeRequest(Request request, Topology topology) {
+ Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
+ TopologyResponse topologyResponse = new TopologyResponse();
+ if (topology.getTopologyRetries() >= maxAttempts) {
+ topologyResponse.setStatus(TopologyRequestStatus.FAILED);
+ topologyResponse.setErrorMessage(LogMessages.EXCEEDED_RETRY_LIMIT.format(
+ "Topology", maxAttempts.toString()));
+ Observation.report(LogMessages.EXCEEDED_RETRY_LIMIT, "Topology", maxAttempts.toString());
+ return topologyResponse;
+ }
+ TopologyRequest topologyRequest = new TopologyRequest();
+ ObjectMapper om = new ObjectMapper();
+ String originalRequest = request.getRequest();
+ OptimizerRequest optimizerRequest = null;;
+ try {
+ optimizerRequest = om.readValue(originalRequest, OptimizerRequest.class);
+ } catch (Exception e) {
+ topologyResponse.setStatus(TopologyRequestStatus.FAILED);
+ topologyResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ topologyRequest = new TopologyRequest();
+ topologyRequest.setRequestId(optimizerRequest.getRequestId());
+ topologyRequest.setCommonData(optimizerRequest.getCommonData());
+ topologyRequest.setElements(getElementCriteria(optimizerRequest));
+ topologyRequest.setPolicies(getPolicies(optimizerRequest));
+ try {
+ topologyResponse = initiateTopology(topologyRequest, topology, request);
+ } catch (Exception e) {
+ topologyResponse.setStatus(TopologyRequestStatus.FAILED);
+ topologyResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return topologyResponse;
+ }
+
+ private List<TopologyPolicyInfo> getPolicies(OptimizerRequest optimizerRequest) {
+ List<TopologyPolicyInfo> list = new ArrayList<>();
+ for (PolicyInfo optInfo : optimizerRequest.getPolicies()) {
+ TopologyPolicyInfo topInfo = new TopologyPolicyInfo();
+ topInfo.setPolicyDescription(optInfo.getPolicyDescription());
+ topInfo.setPolicyName(optInfo.getPolicyName());
+ topInfo.setPolicyModifiers(optInfo.getPolicyModifiers());
+ list.add(topInfo);
+ }
+ return list;
+ }
+
+ private List<ElementCriteria> getElementCriteria(OptimizerRequest optimizerRequest) {
+ List<ElementCriteria> list = new ArrayList<>();
+ for (ElementInfo info : optimizerRequest.getElements()) {
+ ElementCriteria criteria = new ElementCriteria();
+ criteria.setElementId(info.getElementId());
+ criteria.setElementData(info.getElementData());
+ list.add(criteria);
+ }
+ return list;
+ }
+
+ private TopologyResponse initiateTopology(TopologyRequest request, Topology topology, Request requestRow)
+ throws CmsoException, JsonProcessingException {
+ String url = env.getProperty("cmso.topology.create.request.url");
+ String username = env.getProperty("mechid.user");
+ String password = pm.getProperty("mechid.pass", "");
+ Client client = ClientBuilder.newClient();
+ client.register(new BasicAuthenticatorFilter(username, password));
+ client.register(new CmsoClientFilters());
+ debug.debug("topology url / user: " + url + " / " + username);
+ debug.debug("topology Request: " + new ObjectMapper().writeValueAsString(request));
+ Observation.report(LogMessages.TOPOLOGY_REQUEST, "Begin", request.getRequestId(), url);
+ topology.setTopologyStart(System.currentTimeMillis());
+ WebTarget webTarget = client.target(url);
+ Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
+ Response response = invocationBuilder.post(Entity.json(request));
+ Observation.report(LogMessages.TOPOLOGY_REQUEST, "End", request.getRequestId(), url);
+ TopologyResponse topologyResponse = null;
+ switch (response.getStatus()) {
+ case 202:
+ debug.debug("Successfully scheduled asynchronous topology: " + request.getRequestId());
+ break;
+ case 200:
+ debug.debug("Successfully retrieved topology: " + request.getRequestId());
+ topologyResponse = processTopologyResponse(request, response, topology, requestRow);
+ break;
+ default:
+ throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNEXPECTED_RESPONSE, url,
+ response.getStatusInfo().toString());
+ }
+ return topologyResponse;
+ }
+
+ private TopologyResponse processTopologyResponse(TopologyRequest request, Response response, Topology topology,
+ Request requestRow) {
+ String responseString = response.readEntity(String.class);
+ TopologyResponse topologyResponse = null;
+ try {
+ topologyResponse = new ObjectMapper().readValue(responseString, TopologyResponse.class);
+ topology.setTopology(responseString);
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ topologyResponse = new TopologyResponse();
+ topologyResponse.setRequestId(request.getRequestId());
+ topologyResponse.setStatus(TopologyRequestStatus.FAILED);
+ topologyResponse.setErrorMessage(e.getMessage());
+ }
+ return topologyResponse;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java
new file mode 100644
index 0000000..a1cb51d
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java
@@ -0,0 +1,99 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.topology;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Topology;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.TopologyDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class TopologyRequestManager.
+ */
+@Component
+public class TopologyRequestManager {
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Autowired
+ TopologyDao topologyDao;
+
+ @Autowired
+ TopologyClient topologyClient;
+
+ /**
+ * Creates the topology request.
+ *
+ * @param requestRow the request row
+ * @return the topology response
+ */
+ public TopologyResponse createTopologyRequest(Request requestRow) {
+ Topology topology = getExistingTopology(requestRow.getUuid());
+ if (topology == null) {
+ topology = new Topology();
+ topology.setUuid(requestRow.getUuid());
+ topology.setTopologyRetries(0);
+ }
+ TopologyResponse topologyResponse = topologyClient.makeRequest(requestRow, topology);
+ topologyDao.save(topology);
+ return topologyResponse;
+
+ }
+
+
+ /**
+ * Gets the existing topology.
+ *
+ * @param uuid the uuid
+ * @return the existing topology
+ */
+ public Topology getExistingTopology(UUID uuid) {
+ Optional<Topology> topologyOpt = topologyDao.findById(uuid);
+ if (topologyOpt.isPresent()) {
+ return topologyOpt.get();
+ }
+ return null;
+ }
+
+
+ public TopologyResponse getTopologyResponse(UUID uuid) throws JsonParseException, JsonMappingException, IOException {
+ Topology row = getExistingTopology(uuid);
+ if (row != null)
+ {
+ String responseString = row.getTopology();
+ return new ObjectMapper().readValue(responseString, TopologyResponse.class);
+ }
+ return null;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ConstraintElements.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ConstraintElements.java
new file mode 100644
index 0000000..dfd4fad
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ConstraintElements.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
+
+@ApiModel(value = "Topology Constraint ELements",
+ description = "Constraining Element Information returned from TopologyRequuest.")
+public class ConstraintElements implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ public enum AvailabilityMatrixScope {
+ NONE, GLOBAL, ELEMENT,
+ }
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Type of constraint.")
+ private String constraintType;
+
+ @ApiModelProperty(
+ value = "If more than one instance of constraintType,"
+ + " minimum number of available instances required."
+ + " Useful for identifying availableBackup elements, service paths.")
+ private Integer constraintTypeMinimum = 1;
+
+ @ApiModelProperty(value = "Availability matrix name. Availability matrix will not be passed to optimizer engine."
+ + " Generally useful for global concurrency type constraints.")
+ private String optimizerAvailabilityMatrixName;
+
+ @ApiModelProperty(value = "Availability matrix scope global or scoped per elementId.")
+ private AvailabilityMatrixScope availabilityMatrixScope = AvailabilityMatrixScope.NONE;
+
+ @ApiModelProperty(value = "Availability matrix is aggregated into element availability marrix.")
+ private boolean elementAvailabilityAggreagation = true;
+
+ @ApiModelProperty(value = "Elements ")
+ private List<String> elements;
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public String getConstraintType() {
+ return constraintType;
+ }
+
+ public void setConstraintType(String constraintType) {
+ this.constraintType = constraintType;
+ }
+
+ public Integer getConstraintTypeMinimum() {
+ return constraintTypeMinimum;
+ }
+
+ public void setConstraintTypeMinimum(Integer constraintTypeMinimum) {
+ this.constraintTypeMinimum = constraintTypeMinimum;
+ }
+
+ public String getOptimizerAvailabilityMatrixName() {
+ return optimizerAvailabilityMatrixName;
+ }
+
+ public void setOptimizerAvailabilityMatrixName(String optimizerAvailabilityMatrixName) {
+ this.optimizerAvailabilityMatrixName = optimizerAvailabilityMatrixName;
+ }
+
+ public List<String> getElements() {
+ return elements;
+ }
+
+ public void setElements(List<String> elements) {
+ this.elements = elements;
+ }
+
+ public AvailabilityMatrixScope getAvailabilityMatrixScope() {
+ return availabilityMatrixScope;
+ }
+
+ public void setAvailabilityMatrixScope(AvailabilityMatrixScope availabilityMatrixScope) {
+ this.availabilityMatrixScope = availabilityMatrixScope;
+ }
+
+ public boolean isElementAvailabilityAggreagation() {
+ return elementAvailabilityAggreagation;
+ }
+
+ public void setElementAvailabilityAggreagation(boolean elementAvailabilityAggreagation) {
+ this.elementAvailabilityAggreagation = elementAvailabilityAggreagation;
+ }
+
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementCriteria.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementCriteria.java
new file mode 100644
index 0000000..e018533
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementCriteria.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+@ApiModel(value = "Element Critera", description = "Element criteria for retrieving topology.")
+public class ElementCriteria implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "Element id unique to the request.")
+ private String elementId;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementLocation.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementLocation.java
new file mode 100644
index 0000000..e7f8202
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementLocation.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+
+@ApiModel(value = "Element Location", description = "Location information necessary to determine timezone."
+ + " lat/lon and/or timezone must be provided")
+public class ElementLocation implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ElementLocation.class);
+
+ @ApiModelProperty(value = "Geographic latitude of element.")
+ private Float lat;
+
+ @ApiModelProperty(value = "Geographic longitude of element.")
+ private Float lon;
+
+ @ApiModelProperty(value = "Timezone.")
+ private String timezone;
+
+ public Float getLat() {
+ return lat;
+ }
+
+ public void setLat(Float lat) {
+ this.lat = lat;
+ }
+
+ public Float getLon() {
+ return lon;
+ }
+
+ public void setLon(Float lon) {
+ this.lon = lon;
+ }
+
+ public String getTimezone() {
+ return timezone;
+ }
+
+ public void setTimezone(String timezone) {
+ this.timezone = timezone;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckComponent.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckComponent.java
new file mode 100644
index 0000000..0cd9763
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckComponent.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+
+@ApiModel
+public class HealthCheckComponent implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckComponent.class);
+
+ private String name;
+ private String url;
+ private String status;
+ private Boolean healthy = false;
+
+ public Boolean getHealthy() {
+ return healthy;
+ }
+
+ public void setHealthy(Boolean healthy) {
+ this.healthy = healthy;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckMessage.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckMessage.java
new file mode 100644
index 0000000..c139736
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckMessage.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel
+public class HealthCheckMessage implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckMessage.class);
+
+ private Boolean healthy = false;
+ private String buildInfo = "";
+ private String currentTime = "";
+ private String hostname = "";
+
+ private List<HealthCheckComponent> components = new ArrayList<HealthCheckComponent>();
+
+ public Boolean getHealthy() {
+ return healthy;
+ }
+
+ public void setHealthy(Boolean healthy) {
+ this.healthy = healthy;
+ }
+
+ public String getBuildInfo() {
+ return buildInfo;
+ }
+
+ public void setBuildInfo(String buildInfo) {
+ this.buildInfo = buildInfo;
+ }
+
+ public String getCurrentTime() {
+ return currentTime;
+ }
+
+ public void setCurrentTime(String currentTime) {
+ this.currentTime = currentTime;
+ }
+
+ public String getHostname() {
+ return hostname;
+ }
+
+ public void setHostname(String hostname) {
+ this.hostname = hostname;
+ }
+
+ public List<HealthCheckComponent> getComponents() {
+ return components;
+ }
+
+ public void setComponents(List<HealthCheckComponent> components) {
+ this.components = components;
+ }
+
+ public void addComponent(HealthCheckComponent components) {
+ this.components.add(components);
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ReferencedElementInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ReferencedElementInfo.java
new file mode 100644
index 0000000..e51ce70
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ReferencedElementInfo.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+@ApiModel(value = "Topology Related Element", description = "Element Information returned from TopologyRequuest.")
+public class ReferencedElementInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ReferencedElementInfo.class);
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Location information for the element.")
+ private ElementLocation elementLocation;
+
+ @ApiModelProperty(value = "Related elements only. Element ids of the element(s) ")
+ private List<String> referencingElements;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public ElementLocation getElementLocation() {
+ return elementLocation;
+ }
+
+ public void setElementLocation(ElementLocation elementLocation) {
+ this.elementLocation = elementLocation;
+ }
+
+
+ public List<String> getRelatedElements() {
+ return referencingElements;
+ }
+
+ public void setRelatedElements(List<String> relatedElements) {
+ this.referencingElements = relatedElements;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyElementInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyElementInfo.java
new file mode 100644
index 0000000..14c96a0
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyElementInfo.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+@ApiModel(value = "Topology Element", description = "Element Information returned from TopologyRequuest.")
+public class TopologyElementInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyElementInfo.class);
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Location information for the element.")
+ private ElementLocation elementLocation;
+
+ @ApiModelProperty(value = "List of related elements required to be available to execute the chenge.")
+ private List<String> requiredElements;
+
+ @ApiModelProperty(value = "Lists of related elements that must be "
+ + " available to avoid network outage while executing the change."
+ + " Each set constraint elements")
+ private List<ConstraintElements> constraintElements = new ArrayList<>();
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public ElementLocation getElementLocation() {
+ return elementLocation;
+ }
+
+ public void setElementLocation(ElementLocation elementLocation) {
+ this.elementLocation = elementLocation;
+ }
+
+ public List<String> getRequiredElements() {
+ return requiredElements;
+ }
+
+ public void setRequiredElements(List<String> requiredElements) {
+ this.requiredElements = requiredElements;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+ public List<ConstraintElements> getConstraintElements() {
+ return constraintElements;
+ }
+
+ public void setConstraintElements(List<ConstraintElements> constraintElements) {
+ this.constraintElements = constraintElements;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyPolicyInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyPolicyInfo.java
new file mode 100644
index 0000000..9266758
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyPolicyInfo.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+@ApiModel(value = "Supported Policy Information", description = "Policy Information returned from get policies API.")
+public class TopologyPolicyInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyPolicyInfo.class);
+
+ @ApiModelProperty(value = "Policy name")
+ private String policyName;
+
+ @ApiModelProperty(value = "Policy description")
+ private String policyDescription;
+
+ @ApiModelProperty(value = "Named values to modify/override policy attributes.")
+ public List<NameValue> policyModifiers = new ArrayList<>();
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+ public String getPolicyDescription() {
+ return policyDescription;
+ }
+
+ public void setPolicyDescription(String policyDescription) {
+ this.policyDescription = policyDescription;
+ }
+
+ public List<NameValue> getPolicyModifiers() {
+ return policyModifiers;
+ }
+
+ public void setPolicyModifiers(List<NameValue> policyModifiers) {
+ this.policyModifiers = policyModifiers;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyRequest.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyRequest.java
new file mode 100644
index 0000000..ff6df18
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyRequest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.clients.common.models.ElementCriteria;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+@ApiModel(value = "Topology Request",
+ description = "Request to retrieve topology information for the provided elements.")
+public class TopologyRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyRequest.class);
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "Implementation specific name value pairs.")
+ private List<NameValue> commonData;
+
+ @ApiModelProperty(value = "List of the elements for which topology information is requested.")
+ private List<ElementCriteria> elements = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the policies to control topology retrieve.")
+ private List<TopologyPolicyInfo> policies = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+
+ public List<NameValue> getCommonData() {
+ return commonData;
+ }
+
+
+ public void setCommonData(List<NameValue> commonData) {
+ this.commonData = commonData;
+ }
+
+
+ public List<ElementCriteria> getElements() {
+ return elements;
+ }
+
+
+ public void setElements(List<ElementCriteria> elements) {
+ this.elements = elements;
+ }
+
+
+ public List<TopologyPolicyInfo> getPolicies() {
+ return policies;
+ }
+
+
+ public void setPolicies(List<TopologyPolicyInfo> policies) {
+ this.policies = policies;
+ }
+
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyResponse.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyResponse.java
new file mode 100644
index 0000000..2b4a726
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyResponse.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.clients.topology.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Topology Response", description = "Response to topology query for the requested elements.")
+public class TopologyResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyResponse.class);
+
+ public enum TopologyRequestStatus {
+ IN_PROGRESS, COMPLETED, FAILED,
+ }
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "List of elements for for which topology has been requested.")
+ private List<TopologyElementInfo> elements = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of referenced elements representing the topology that has been requested.")
+ private List<ReferencedElementInfo> referencedElements = new ArrayList<>();
+
+ @ApiModelProperty(value = "Status of asynchronous request. COMPLETED is returned on initial synchonous request. "
+ + "If IN_PROGRESS is returned, the optimizer will enter asynchronous polling mode.")
+ private TopologyRequestStatus status;
+
+ @ApiModelProperty(value = "If request is asynchronous (IN_PROGRESS), suggested interval to the next poll.")
+ private Integer pollingSeconds;
+
+ private String errorMessage;
+
+ public TopologyRequestStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(TopologyRequestStatus status) {
+ this.status = status;
+ }
+
+ public Integer getPollingSeconds() {
+ return pollingSeconds;
+ }
+
+ public void setPollingSeconds(Integer pollingSeconds) {
+ this.pollingSeconds = pollingSeconds;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public List<TopologyElementInfo> getElements() {
+ return elements;
+ }
+
+ public void setElements(List<TopologyElementInfo> elements) {
+ this.elements = elements;
+ }
+
+ public List<ReferencedElementInfo> getReferencedElements() {
+ return referencedElements;
+ }
+
+ public void setReferencedElements(List<ReferencedElementInfo> referencedElements) {
+ this.referencedElements = referencedElements;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/Availability.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/Availability.java
new file mode 100644
index 0000000..81cebaf
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/Availability.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.common;
+
+public enum Availability {
+ full, partial, unavailable
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/LogMessages.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/LogMessages.java
new file mode 100644
index 0000000..f8d23eb
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/common/LogMessages.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.common;
+
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+import org.onap.observations.ObservationInterface;
+
+/**
+ * The Enum LogMessages.
+ */
+public enum LogMessages implements ObservationInterface {
+
+ OPTIMIZE_SCHEDULE("Optimize schedule {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ GET_POLICIES("Get active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ GET_SCHEDULE("Get optimized schedule {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ DELETE_SCHEDULE("Delete optimized schedule {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+
+ INVALID_ATTRIBUTE("Invalid attribute {0}={1}", Status.BAD_REQUEST, Level.INFO),
+ MISSING_REQUIRED_ATTRIBUTE("Missing required attribute '{0}'", Status.BAD_REQUEST, Level.INFO),
+ INVALID_REQUEST("The input data structure is incorrect", Status.BAD_REQUEST, Level.INFO),
+ REQUEST_TIMED_OUT("Request timed out.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ UNEXPECTED_EXCEPTION("Unexpected exception encountered during processing. Please contact support : {0}",
+ Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+
+ UNDEFINED_FILTER_ATTRIBUTE("Undefined filter attribute {0}", Status.BAD_REQUEST, Level.INFO),
+ INVALID_DATE_FILTER("Invalid date filter provided {0}=(1}", Status.BAD_REQUEST, Level.INFO),
+
+ INCOMING_MESSAGE("Incoming message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ INCOMING_MESSAGE_RESPONSE("Message response method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE("Outgoing message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE_RETURNED("Outgoing message returned method={0} path={1} status={2}", Status.OK, Level.INFO, true,
+ false),
+
+ UNEXPECTED_RESPONSE("Unexpected response from URL {0} : HTTP Status={1}", Status.INTERNAL_SERVER_ERROR,
+ Level.ERROR),
+ INVALID_CHANGE_WINDOW("Change window end time {0} must be after start time {1}", Status.OK, Level.INFO),
+ EXPECTED_EXCEPTION("Expected exception encountered during processing. {0}", Status.OK, Level.INFO),
+ UNABLE_TO_UPDATE_TICKET("Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}",
+ Status.OK, Level.INFO),
+ UNAUTHORIZED("Authorization failed.", Status.FORBIDDEN, Level.INFO),
+ UNAUTHENTICATED("Authentication failed.", Status.UNAUTHORIZED, Level.INFO),
+ EXPECTED_DATA_NOT_FOUND("Retrieve of {0} from {1} failed. Not found.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ DUPLICATE_REQUEST_ID("Request id {0} already exists", Status.BAD_REQUEST, Level.INFO),
+ TOPOLOGY_REQUEST("Topology request {0} for {1} URL: {1}", Status.OK, Level.INFO),
+ OPTIMIZER_REQUEST("OPtimizer request {0} for {1} Command: {1}", Status.OK, Level.INFO),
+ TICKETS_REQUEST("Tickets request {0} for {1} URL: {1}", Status.OK, Level.INFO),
+ UNSUPPORTED_PERIODIC_TIME("Unsupported periodic time from policy: {0}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ EXCEEDED_RETRY_LIMIT("Outbound request for {0} exceeded retry limit {1}", Status.INTERNAL_SERVER_ERROR,
+ Level.ERROR),
+ FAILED_TO_CREATE_TOPOLOGY_REQUEST("Failed to create request reqeust for id={0}", Status.INTERNAL_SERVER_ERROR,
+ Level.ERROR),
+ FAILED_TO_CREATE_TICKET_REQUEST("Failed to create ticket request for id={0}", Status.INTERNAL_SERVER_ERROR,
+ Level.ERROR),
+ FAILED_TO_CREATE_OPTIMIZER_REQUEST("Failed to create optimizer request for id={0}", Status.INTERNAL_SERVER_ERROR,
+ Level.ERROR),
+ OPTIMIZER_REQUEST_TIMEOUT("Optimizer engine request timed out id={0} timelimit={1}", Status.INTERNAL_SERVER_ERROR,
+ Level.ERROR),
+
+ ;
+ private final String defaultId;
+ private final String defaultMessage;
+ private final String defaultResolution;
+ private final String defaultAction;
+
+ private final Status status;
+ private final Level level;
+ private final Boolean audit;
+ private final Boolean metric;
+
+
+ private LogMessages(String message, Status code, Level lev) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ this.audit = false;
+ this.metric = false;
+ }
+
+ private LogMessages(String message, Status code, Level lev, Boolean audit, Boolean metric) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.audit = audit;
+ this.metric = metric;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ }
+
+ private LogMessages(String message, Status code, Level lev, String id, String resolution, String action) {
+ level = lev;
+ status = code;
+ defaultMessage = message;
+ this.defaultId = id;
+ this.defaultResolution = resolution;
+ this.defaultAction = action;
+ this.audit = false;
+ this.metric = false;
+ }
+
+ static {
+ EELFResourceManager.loadMessageBundle("logmessages");
+ }
+
+ /**
+ * Gen properties.
+ *
+ * @return the string
+ */
+ public String genProperties() {
+ // Use this to regenerate properties file. The desire to change messages without updating code is
+ // well understood, but the developer should be able to code the defaults without having to update 2
+ // different files and
+ // get it wrong.
+ StringBuilder sb = new StringBuilder();
+ sb.append("# Generated from ").append(this.getClass().getName()).append("\n");
+ for (LogMessages lm : values()) {
+ sb.append(lm.name());
+ sb.append(" ").append(lm.defaultId);
+ sb.append("|").append(lm.defaultMessage);
+ sb.append("|").append(lm.defaultResolution);
+ sb.append("|").append(lm.defaultAction);
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Gets the level.
+ *
+ * @return the level
+ */
+ // interface methods
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @return the message
+ */
+ @Override
+ public String getMessage() {
+ return defaultMessage;
+ }
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ @Override
+ public Enum<?> getValue() {
+ return this;
+ }
+
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
+ @Override
+ public String getDomain() {
+ return this.getClass().getSimpleName();
+ }
+
+ /**
+ * Gets the audit.
+ *
+ * @return the audit
+ */
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ /**
+ * Gets the metric.
+ *
+ * @return the metric
+ */
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * Format.
+ *
+ * @param args the args
+ * @return the string
+ */
+ public String format(String... args) {
+ return EELFResourceManager.format(this, args);
+ }
+
+ /**
+ * The main method.
+ *
+ * @param argv the arguments
+ */
+ public static void main(String[] argv) {
+ System.out.println(LogMessages.UNEXPECTED_EXCEPTION.genProperties());
+ try {
+ Files.write(Paths.get("src/main/resources/logmessages.properties"),
+ LogMessages.UNEXPECTED_EXCEPTION.genProperties().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties file.", e);
+
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("<html><body><h1>Cell Site Selection Scheduler mS Observations</h1>\n<table border=\"1\">\n<tr>");
+ sb.append("<td>Code</td> ");
+ sb.append("<td>Log Level</td> ");
+ sb.append("<td>Message</td> ");
+ sb.append("</tr>\n");
+ for (LogMessages m : LogMessages.values()) {
+ if (m.level == Level.ERROR || m.level == Level.WARN || m.level == Level.FATAL) {
+ sb.append("<tr>");
+ sb.append("<td>").append(m.name()).append("</td> ");
+ sb.append("<td>").append(m.level).append("</td> ");
+ sb.append("<td>").append(m.defaultMessage).append("</td> ");
+ sb.append("</tr>\n");
+ }
+ }
+ try {
+ Files.write(Paths.get("logmessages.html"), sb.toString().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties html file.", e);
+
+ }
+
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/core/OptimizerManager.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/core/OptimizerManager.java
new file mode 100644
index 0000000..eabebec
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/core/OptimizerManager.java
@@ -0,0 +1,296 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.core;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+import javax.ws.rs.core.Response.Status;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.clients.optimizer.OptimizerRequestManager;
+import org.onap.optf.cmso.optimizer.clients.optimizer.models.OptimizerEngineResponse;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.TicketMgtRequestManager;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse;
+import org.onap.optf.cmso.optimizer.clients.topology.TopologyRequestManager;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Response;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.ResponseDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.ChangeWindow;
+import org.onap.optf.cmso.optimizer.service.rs.models.ElementInfo;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class OptimizerManager.
+ */
+@Component
+public class OptimizerManager {
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Autowired
+ ResponseDao responseDao;
+
+ @Autowired
+ TopologyRequestManager topologyRequestManager;
+
+ @Autowired
+ TicketMgtRequestManager ticketMgtRequestManager;
+
+ @Autowired
+ OptimizerRequestManager optimizerRequestManager;
+
+ /**
+ * Validate optimizer request.
+ *
+ * @param request the request
+ * @throws CmsoException cmso exception
+ */
+ public void validate(OptimizerRequest request) throws CmsoException {
+ if (request.getRequestId() == null) {
+ reportRequiredMissing("requestId");
+ }
+ if (request.getConcurrencyLimit() == null) {
+ reportRequiredMissing("concurrencyLimit");
+ }
+ if (request.getChangeWindows() == null || request.getChangeWindows().size() < 1) {
+ reportRequiredMissing("changeWindows");
+ }
+ if (request.getElements() == null || request.getElements().size() < 1) {
+ reportRequiredMissing("elements");
+ }
+ if (request.getNormalDuration() == null) {
+ reportRequiredMissing("normalDuration");
+ }
+ validateElements(request.getElements());
+ validateChangeWindows(request.getChangeWindows());
+ }
+
+ private void validateChangeWindows(List<ChangeWindow> changeWindows) throws CmsoException {
+ for (ChangeWindow changeWindow : changeWindows) {
+ validateChangeWindow(changeWindow);
+ }
+ }
+
+ private void validateChangeWindow(ChangeWindow changeWindow) throws CmsoException {
+ if (changeWindow.getStartTime() == null) {
+ reportRequiredMissing("startTime");
+ }
+ if (changeWindow.getEndTime() == null) {
+ reportRequiredMissing("endTime");
+ }
+ if (!changeWindow.getEndTime().after(changeWindow.getStartTime())) {
+ throw new CmsoException(Status.BAD_REQUEST, LogMessages.INVALID_CHANGE_WINDOW,
+ changeWindow.getEndTime().toString(), changeWindow.getStartTime().toString());
+ }
+
+ }
+
+ private void validateElements(List<ElementInfo> elements) throws CmsoException {
+ // Perhaps check for duplicate elements....
+ for (ElementInfo element : elements) {
+ validateElement(element);
+ }
+ }
+
+ private void validateElement(ElementInfo element) throws CmsoException {
+ if (element.getElementId() == null || element.getElementId().equals("")) {
+ reportRequiredMissing("elementId");
+ }
+ }
+
+ private void reportRequiredMissing(String name) throws CmsoException {
+ throw new CmsoException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, name);
+ }
+
+ /**
+ * Process optimizer request.
+ *
+ * @param request the request
+ * @return the optimizer response
+ * @throws CmsoException the cmso exception
+ */
+ public OptimizerResponse processOptimizerRequest(OptimizerRequest request) throws CmsoException {
+ UUID uuid = UUID.fromString(request.getRequestId());
+ Request requestRow = null;
+ Optional<Request> rrOptional = requestDao.findById(uuid);
+ if (rrOptional.isPresent()) {
+ requestRow = rrOptional.get();
+ }
+ OptimizerResponse optimizerResponse = new OptimizerResponse();
+ optimizerResponse.setRequestId(request.getRequestId());
+ if (requestRow != null) {
+ throw new CmsoException(Status.BAD_REQUEST, LogMessages.DUPLICATE_REQUEST_ID, request.getRequestId());
+ }
+ requestRow = new Request();
+ requestRow.setUuid(uuid);
+ requestRow.setCreatedTime(System.currentTimeMillis());
+ ObjectMapper om = new ObjectMapper();
+ try {
+ requestRow.setRequest(om.writeValueAsString(request));
+ } catch (JsonProcessingException e) {
+ throw new CmsoException(Status.BAD_REQUEST, LogMessages.INVALID_REQUEST, e.getMessage());
+ }
+ requestRow.setStatus(OptimizeScheduleStatus.PENDING_TOPOLOGY.toString());
+ requestDao.save(requestRow);
+ initiateDataGathering(requestRow);
+ requestDao.save(requestRow);
+ OptimizeScheduleStatus status = OptimizeScheduleStatus.valueOf(requestRow.getStatus());
+ if (status == OptimizeScheduleStatus.COMPLETED)
+ {
+ // COmpletely synchronous optimization
+ optimizerResponse = getCompletedOptimizerResponse(uuid);
+ }
+ else
+ {
+ // One or more steps are asynchronous
+ optimizerResponse.setStatus(status);
+ optimizerResponse.setErrorMessage("");
+ }
+ return optimizerResponse;
+ }
+
+ private void initiateDataGathering(Request requestRow) throws CmsoException {
+ TopologyResponse topologyResponse = topologyRequestManager.createTopologyRequest(requestRow);
+ if (topologyResponse != null) {
+ switch (topologyResponse.getStatus()) {
+ case COMPLETED:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.PENDING_TICKETS.toString());
+ initiateTicketGathering(requestRow); // continue synchronous flow
+ return;
+ case FAILED:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setRequestEnd(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.FAILED.toString());
+ requestRow.setMessage(topologyResponse.getErrorMessage());
+ return;
+ case IN_PROGRESS:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.TOPOLOGY_IN_PROGRESS.toString());
+ return;
+ default:
+ break;
+ }
+ }
+ throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.FAILED_TO_CREATE_TOPOLOGY_REQUEST,
+ requestRow.getUuid().toString());
+ }
+
+ private void initiateTicketGathering(Request requestRow) throws CmsoException {
+ ActiveTicketsResponse apiResponse = ticketMgtRequestManager.createTicketsRequest(requestRow);
+ if (apiResponse != null) {
+ switch (apiResponse.getStatus()) {
+ case COMPLETED:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.PENDING_OPTIMIZER.toString());
+ initiateOptimizer(requestRow);
+ return;
+ case FAILED:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setRequestEnd(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.FAILED.toString());
+ requestRow.setMessage(apiResponse.getErrorMessage());
+ return;
+ case IN_PROGRESS:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.TICKETS_IN_PROGRESS.toString());
+ return;
+ default:
+ break;
+ }
+ }
+ throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.FAILED_TO_CREATE_TICKET_REQUEST,
+ requestRow.getUuid().toString());
+ }
+
+
+ private void initiateOptimizer(Request requestRow) throws CmsoException {
+ OptimizerEngineResponse apiResponse = optimizerRequestManager.createOptimizerRequest(requestRow);
+ if (apiResponse != null) {
+ switch (apiResponse.getStatus()) {
+ case COMPLETED:
+ requestRow.setRequestEnd(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.COMPLETED.toString());
+ return;
+ case FAILED:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setRequestEnd(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.FAILED.toString());
+ requestRow.setMessage(apiResponse.getErrorMessage());
+ return;
+ case IN_PROGRESS:
+ case IN_QUEUE:
+ requestRow.setRequestStart(System.currentTimeMillis());
+ requestRow.setStatus(OptimizeScheduleStatus.OPTIMIZER_IN_PROGRESS.toString());
+ return;
+ default:
+ break;
+ }
+ }
+ throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.FAILED_TO_CREATE_TICKET_REQUEST,
+ requestRow.getUuid().toString());
+ }
+
+ public OptimizerResponse getCompletedOptimizerResponse(UUID uuid)
+ {
+ OptimizerResponse response = new OptimizerResponse();
+ response.setRequestId(uuid.toString());
+ response.setStatus(OptimizeScheduleStatus.COMPLETED);
+ Response responseRow = getResponseRow(uuid);
+ if (responseRow != null)
+ {
+ response.setSchedules(optimizerRequestManager.getScheduleInfo(responseRow));
+ }
+ return response;
+ }
+
+ public Response getResponseRow(UUID uuid)
+ {
+ Optional<Response> opt = responseDao.findById(uuid);
+ if (opt.isPresent())
+ {
+ return opt.get();
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unused")
+ private Request getRequestRow(UUID uuid) throws CmsoException {
+ Request requestRow = null;
+ Optional<Request> requestOptional = requestDao.findById(uuid);
+ if (requestOptional.isPresent()) {
+ return requestOptional.get();
+ }
+ throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.EXPECTED_DATA_NOT_FOUND,
+ uuid.toString(), "Request table");
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoClientFilters.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoClientFilters.java
new file mode 100644
index 0000000..fffd53e
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoClientFilters.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.filters;
+
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+
+import java.io.IOException;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.client.ClientResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import org.onap.observations.Mdc;
+import org.onap.observations.MessageHeaders;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Component;
+
+// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+@Component
+public class CmsoClientFilters implements ClientRequestFilter, ClientResponseFilter {
+
+ private static String appId = "cmso";
+
+ @Override
+ public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
+ // On the way back
+ Mdc.metricEnd(responseContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE_RETURNED, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString(), responseContext.getStatusInfo().toString());
+ }
+
+ @Override
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ // On the way out
+ Mdc.metricStart(requestContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString());
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+
+ String transactionId = (String) headers.getFirst(MessageHeaders.HeadersEnum.TransactionID.toString());
+ String mdcId = MDC.get(MDC_KEY_REQUEST_ID);
+ if (transactionId == null || transactionId.equals("")) {
+ if (mdcId != null) {
+ headers.add(HeadersEnum.TransactionID.toString(), mdcId);
+ }
+ }
+ headers.add(HeadersEnum.FromAppID.toString(), appId);
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoContainerFilters.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoContainerFilters.java
new file mode 100644
index 0000000..e8fe5f0
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/filters/CmsoContainerFilters.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.filters;
+
+import java.io.IOException;
+import java.util.UUID;
+import javax.annotation.Priority;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.ext.Provider;
+import org.onap.observations.Mdc;
+import org.onap.observations.MessageHeaders;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.springframework.stereotype.Component;
+
+@Priority(1)
+@Provider
+@Component
+public class CmsoContainerFilters implements ContainerRequestFilter, ContainerResponseFilter {
+
+
+ @Context
+ private HttpServletRequest servletRequest;
+
+ @Override
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+ try {
+ Mdc.auditEnd(requestContext, responseContext);
+ Observation.report(LogMessages.INCOMING_MESSAGE_RESPONSE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString(),
+ responseContext.getStatusInfo().toString());
+ MultivaluedMap<String, String> reqHeaders = requestContext.getHeaders();
+ MultivaluedMap<String, Object> respHeaders = responseContext.getHeaders();
+ String minorVersion = reqHeaders.getFirst(HeadersEnum.MinorVersion.toString());
+ respHeaders.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ respHeaders.add(HeadersEnum.LatestVersion.toString(), MessageHeaders.latestVersion);
+ respHeaders.add(HeadersEnum.PatchVersion.toString(), MessageHeaders.patchVersion);
+
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+ }
+
+ @Override
+ public void filter(ContainerRequestContext requestContext) throws IOException {
+ try {
+ // On the way in
+ Mdc.auditStart(requestContext, servletRequest);
+ Observation.report(LogMessages.INCOMING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString());
+
+ String majorVersion = requestContext.getUriInfo().getPath();
+ if (majorVersion != null) {
+
+ if (majorVersion.startsWith("dispatch/")) {
+ return;
+ }
+ majorVersion = majorVersion.replaceAll("/.*$", "");
+ }
+ if (!MessageHeaders.validateMajorVersion(majorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported Major version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+ }
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId == null) {
+ transactionId = UUID.randomUUID().toString();
+ headers.add(HeadersEnum.TransactionID.toString(), transactionId);
+ }
+ String minorVersion = headers.getFirst(HeadersEnum.MinorVersion.toString());
+ if (minorVersion == null) {
+ minorVersion = MessageHeaders.supportedMajorVersions.get(majorVersion);
+ headers.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ }
+ if (!MessageHeaders.validateMajorMinorVersion(majorVersion, minorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported API version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+
+ }
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ throw e;
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Optimizer.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Optimizer.java
new file mode 100644
index 0000000..880992c
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Optimizer.java
@@ -0,0 +1,109 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model;
+
+import java.io.Serializable;
+import java.util.UUID;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.NamedQuery;
+
+
+/**
+ * The persistent class for the optimizer database table.
+ *
+ */
+@Entity
+@NamedQuery(name = "Optimizer.findAll", query = "SELECT o FROM Optimizer o")
+public class Optimizer implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ private UUID uuid;
+
+ @Column(name = "optimize_end")
+ private Long optimizeEnd;
+
+ @Column(name = "optimize_polling_interval")
+ private Integer optimizePollingInterval;
+
+ @Lob
+ @Column(name = "optimize_response")
+ private String optimizeResponse;
+
+ @Column(name = "optimize_retries")
+ private Integer optimizeRetries;
+
+ @Column(name = "optimize_start")
+ private Long optimizeStart;
+
+ public Optimizer() {}
+
+ public UUID getUuid() {
+ return this.uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public Long getOptimizeEnd() {
+ return this.optimizeEnd;
+ }
+
+ public void setOptimizeEnd(Long optimizeEnd) {
+ this.optimizeEnd = optimizeEnd;
+ }
+
+ public Integer getOptimizePollingInterval() {
+ return this.optimizePollingInterval;
+ }
+
+ public void setOptimizePollingInterval(Integer optimizePollingInterval) {
+ this.optimizePollingInterval = optimizePollingInterval;
+ }
+
+ public String getOptimizeResponse() {
+ return this.optimizeResponse;
+ }
+
+ public void setOptimizeResponse(String optimizeResponse) {
+ this.optimizeResponse = optimizeResponse;
+ }
+
+ public Integer getOptimizeRetries() {
+ return this.optimizeRetries;
+ }
+
+ public void setOptimizeRetries(Integer optimizeRetries) {
+ this.optimizeRetries = optimizeRetries;
+ }
+
+ public Long getOptimizeStart() {
+ return this.optimizeStart;
+ }
+
+ public void setOptimizeStart(Long optimizeStart) {
+ this.optimizeStart = optimizeStart;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Request.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Request.java
new file mode 100644
index 0000000..3ae723f
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Request.java
@@ -0,0 +1,118 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model;
+
+import java.io.Serializable;
+import java.util.UUID;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.NamedQuery;
+
+
+/**
+ * The persistent class for the request database table.
+ *
+ */
+@Entity
+@NamedQuery(name = "Request.findAll", query = "SELECT r FROM Request r")
+public class Request implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ private UUID uuid;
+
+ @Column(name = "created_time")
+ private Long createdTime;
+
+ @Lob
+ private String request;
+
+ @Column(name = "request_end")
+ private Long requestEnd;
+
+ @Column(name = "request_start")
+ private Long requestStart;
+
+ private String status;
+
+ @Lob
+ private String message;
+
+ public Request() {}
+
+ public UUID getUuid() {
+ return this.uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public Long getCreatedTime() {
+ return this.createdTime;
+ }
+
+ public void setCreatedTime(Long createdTime) {
+ this.createdTime = createdTime;
+ }
+
+ public String getRequest() {
+ return this.request;
+ }
+
+ public void setRequest(String request) {
+ this.request = request;
+ }
+
+ public Long getRequestEnd() {
+ return this.requestEnd;
+ }
+
+ public void setRequestEnd(Long requestEnd) {
+ this.requestEnd = requestEnd;
+ }
+
+ public Long getRequestStart() {
+ return this.requestStart;
+ }
+
+ public void setRequestStart(Long requestStart) {
+ this.requestStart = requestStart;
+ }
+
+ public String getStatus() {
+ return this.status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Response.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Response.java
new file mode 100644
index 0000000..b327ccd
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Response.java
@@ -0,0 +1,75 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model;
+
+import java.io.Serializable;
+import java.util.UUID;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.NamedQuery;
+
+
+/**
+ * The persistent class for the response database table.
+ *
+ */
+@Entity
+@NamedQuery(name = "Response.findAll", query = "SELECT r FROM Response r")
+public class Response implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ private UUID uuid;
+
+ @Column(name = "delivered_time")
+ private Long deliveredTime;
+
+ @Lob
+ private String response;
+
+ public Response() {}
+
+ public UUID getUuid() {
+ return this.uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public Long getDeliveredTime() {
+ return this.deliveredTime;
+ }
+
+ public void setDeliveredTime(Long deliveredTime) {
+ this.deliveredTime = deliveredTime;
+ }
+
+ public String getRepsonse() {
+ return this.response;
+ }
+
+ public void setRepsonse(String repsonse) {
+ this.response = repsonse;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Ticket.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Ticket.java
new file mode 100644
index 0000000..1fb9ed5
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Ticket.java
@@ -0,0 +1,110 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model;
+
+import java.io.Serializable;
+import java.util.UUID;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+
+/**
+ * The persistent class for the tickets database table.
+ *
+ */
+@Entity
+@Table(name = "tickets")
+@NamedQuery(name = "Ticket.findAll", query = "SELECT t FROM Ticket t")
+public class Ticket implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ private UUID uuid;
+
+ @Lob
+ private String tickets;
+
+ @Column(name = "tickets_end")
+ private Long ticketsEnd;
+
+ @Column(name = "tickets_retries")
+ private Integer ticketsRetries;
+
+ @Column(name = "tickets_start")
+ private Long ticketsStart;
+
+ @Column(name = "topology_polling_interval")
+ private Integer topologyPollingInterval;
+
+ public Ticket() {}
+
+ public UUID getUuid() {
+ return this.uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getTickets() {
+ return this.tickets;
+ }
+
+ public void setTickets(String tickets) {
+ this.tickets = tickets;
+ }
+
+ public Long getTicketsEnd() {
+ return this.ticketsEnd;
+ }
+
+ public void setTicketsEnd(Long ticketsEnd) {
+ this.ticketsEnd = ticketsEnd;
+ }
+
+ public Integer getTicketsRetries() {
+ return this.ticketsRetries;
+ }
+
+ public void setTicketsRetries(Integer ticketsRetries) {
+ this.ticketsRetries = ticketsRetries;
+ }
+
+ public Long getTicketsStart() {
+ return this.ticketsStart;
+ }
+
+ public void setTicketsStart(Long ticketsStart) {
+ this.ticketsStart = ticketsStart;
+ }
+
+ public Integer getTopologyPollingInterval() {
+ return this.topologyPollingInterval;
+ }
+
+ public void setTopologyPollingInterval(Integer topologyPollingInterval) {
+ this.topologyPollingInterval = topologyPollingInterval;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Topology.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Topology.java
new file mode 100644
index 0000000..f113634
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Topology.java
@@ -0,0 +1,108 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model;
+
+import java.io.Serializable;
+import java.util.UUID;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.NamedQuery;
+
+
+/**
+ * The persistent class for the topology database table.
+ *
+ */
+@Entity
+@NamedQuery(name = "Topology.findAll", query = "SELECT t FROM Topology t")
+public class Topology implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ private UUID uuid;
+
+ @Lob
+ private String topology;
+
+ @Column(name = "topology_end")
+ private Long topologyEnd;
+
+ @Column(name = "topology_polling_interval")
+ private Integer topologyPollingInterval;
+
+ @Column(name = "topology_retries")
+ private Integer topologyRetries;
+
+ @Column(name = "topology_start")
+ private Long topologyStart;
+
+ public Topology() {}
+
+ public UUID getUuid() {
+ return this.uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public String getTopology() {
+ return this.topology;
+ }
+
+ public void setTopology(String topology) {
+ this.topology = topology;
+ }
+
+ public Long getTopologyEnd() {
+ return this.topologyEnd;
+ }
+
+ public void setTopologyEnd(Long topologyEnd) {
+ this.topologyEnd = topologyEnd;
+ }
+
+ public Integer getTopologyPollingInterval() {
+ return this.topologyPollingInterval;
+ }
+
+ public void setTopologyPollingInterval(Integer topologyPollingInterval) {
+ this.topologyPollingInterval = topologyPollingInterval;
+ }
+
+ public Integer getTopologyRetries() {
+ return this.topologyRetries;
+ }
+
+ public void setTopologyRetries(Integer topologyRetries) {
+ this.topologyRetries = topologyRetries;
+ }
+
+ public Long getTopologyStart() {
+ return this.topologyStart;
+ }
+
+ public void setTopologyStart(Long topologyStart) {
+ this.topologyStart = topologyStart;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/OptimizerDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/OptimizerDao.java
new file mode 100644
index 0000000..96a4fe1
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/OptimizerDao.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model.dao;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.optf.cmso.optimizer.model.Optimizer;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface OptimizerDao extends PagingAndSortingRepository<Optimizer, UUID> {
+ @Override
+ Optional<Optimizer> findById(UUID id);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ Optimizer save(Optimizer persisted);
+
+ @Override
+ void delete(Optimizer toDelete);
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/RequestDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/RequestDao.java
new file mode 100644
index 0000000..6a2ac3b
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/RequestDao.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model.dao;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface RequestDao extends PagingAndSortingRepository<Request, UUID> {
+ @Override
+ Optional<Request> findById(UUID id);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ Request save(Request persisted);
+
+ @Override
+ void delete(Request toDelete);
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/ResponseDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/ResponseDao.java
new file mode 100644
index 0000000..bf91b6b
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/ResponseDao.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model.dao;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.optf.cmso.optimizer.model.Response;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface ResponseDao extends PagingAndSortingRepository<Response, UUID> {
+ @Override
+ Optional<Response> findById(UUID id);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ Response save(Response persisted);
+
+ @Override
+ void delete(Response toDelete);
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TicketDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TicketDao.java
new file mode 100644
index 0000000..41642f7
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TicketDao.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model.dao;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.optf.cmso.optimizer.model.Ticket;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface TicketDao extends PagingAndSortingRepository<Ticket, UUID> {
+ @Override
+ Optional<Ticket> findById(UUID id);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ Ticket save(Ticket persisted);
+
+ @Override
+ void delete(Ticket toDelete);
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TopologyDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TopologyDao.java
new file mode 100644
index 0000000..e0d0566
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TopologyDao.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.model.dao;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.optf.cmso.optimizer.model.Topology;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface TopologyDao extends PagingAndSortingRepository<Topology, UUID> {
+ @Override
+ Optional<Topology> findById(UUID id);
+
+ @SuppressWarnings("unchecked")
+ @Override
+ Topology save(Topology persisted);
+
+ @Override
+ void delete(Topology toDelete);
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminTool.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminTool.java
new file mode 100644
index 0000000..bc9a389
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminTool.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+
+@Api("Administration")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface AdminTool {
+
+ // ******************************************************************
+ @GET
+ @Path("/admin/{id}")
+ @Produces({MediaType.TEXT_PLAIN})
+ @RequestMapping(value = "/{apiVersion}/admin/{id}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN)
+ @ApiOperation(value = "", notes = "Returns encrypted value of id.", response = String.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Request failed")})
+ public Response exec(@ApiParam(
+ value = "v1|v2") @PathVariable @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Identifier") @PathVariable @PathParam("id") String id);
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminToolImpl.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminToolImpl.java
new file mode 100644
index 0000000..7b4859d
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminToolImpl.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class AdminToolImpl implements AdminTool {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(AdminToolImpl.class);
+
+
+ @Context
+ UriInfo uri;
+
+ @Context
+ HttpServletRequest request;
+
+ @Override
+ public Response exec(String apiVersion, String id) {
+ log.info("AdminTool.exec entered " + uri.getPath());
+ if (id.length() < 4) {
+ return Response.ok("").build();
+ }
+ String encrypted = PropertiesManagement.getEncryptedValue(id);
+ Response response = Response.ok(encrypted).build();
+ return response;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheck.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheck.java
new file mode 100644
index 0000000..aba9cde
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheck.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.optf.cmso.optimizer.service.rs.models.HealthCheckMessage;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Api("Administration")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface HealthCheck {
+
+ // ******************************************************************
+ @GET
+ @Path("/health")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/health", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "", notes = "Returns health status of server.", response = HealthCheckMessage.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Not healthy", response = HealthCheckMessage.class)})
+ public Response healthCheck(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Check Interfaces") @QueryParam("checkInterfaces") @DefaultValue(
+ value = "true") Boolean checkInterfaces);
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheckImpl.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheckImpl.java
new file mode 100644
index 0000000..80deaaf
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheckImpl.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.UUID;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.HealthCheckComponent;
+import org.onap.optf.cmso.optimizer.service.rs.models.HealthCheckMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class HealthCheckImpl implements HealthCheck {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ RequestDao requestDao;
+
+
+
+ @Context
+ UriInfo uri;
+
+ @Context
+ HttpServletRequest request;
+
+
+ @Override
+ public Response healthCheck(String apiVersion, Boolean checkInterfaces) {
+ debug.debug("Entered healthcheck");
+ Response response = null;
+ HealthCheckMessage hc = new HealthCheckMessage();
+ hc.setHealthy(true);
+
+ addToHealthCheckMessage(hc, this.healthCheckDb());
+
+ if (hc.getHealthy()) {
+ response = Response.ok().entity(hc).build();
+ }
+ else {
+ response = Response.status(Response.Status.BAD_REQUEST).entity(hc).build();
+ }
+ return response;
+ }
+
+ private void addToHealthCheckMessage(HealthCheckMessage hc, HealthCheckComponent hcc) {
+ if (!hcc.getHealthy()) {
+ hc.setHealthy(false);
+ }
+
+ hc.setHostname(System.getenv("HOSTNAME"));
+ hc.addComponent(hcc);
+ }
+
+ private HealthCheckComponent healthCheckDb() {
+ HealthCheckComponent hcc = new HealthCheckComponent();
+ hcc.setName("Optimizer database");
+ String url = env.getProperty("spring.datasource.url");
+ hcc.setUrl(url);
+ try {
+ requestDao.findById(UUID.randomUUID());
+ hcc.setHealthy(true);
+ hcc.setStatus("OK");
+ } catch (Exception e) {
+ hcc.setStatus(e.getMessage());
+
+ }
+ return hcc;
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterface.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterface.java
new file mode 100644
index 0000000..27a368f
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterface.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.optf.cmso.common.CmsoRequestError;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse;
+import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Api("Optimizer Interface")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface OptimizerInterface {
+ // ******************************************************************
+
+ @POST
+ @Path("/optimize/schedule")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/optimize/shedule", method = RequestMethod.POST,
+ consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "", notes = "API to request schedule optimization for the passed elements.")
+ @ApiResponses(value = {@ApiResponse(code = 202, message = "Accepted"),
+ @ApiResponse(code = 400, message = "Bad request", response = CmsoRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response optimizeSchedule(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Optimization data.") OptimizerRequest optimizerRequest);
+
+ @GET
+ @Path("/policies")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/policies", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "", notes = "API to retrieve supported change management policies.",
+ response = PolicyInfo.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Bad request", response = CmsoRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response getPolicies(@ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion);
+
+ @GET
+ @Path("/optimize/schedule/{id}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/schedule/{id}", method = RequestMethod.GET,
+ produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "", notes = "API to poll for " + " optimized schedule.", response = OptimizerResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 404, message = "Not found.", response = CmsoRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response getSchedule(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Request id") @PathParam("id") @PathVariable(value = "id") String id);
+
+ @DELETE
+ @Path("/optimize/schedule/{id}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/schedule/{id}", method = RequestMethod.DELETE,
+ produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "", notes = "API to acknowledge and delete"
+ + " optimized schedule request. Acknowledgesthat optimization has "
+ + "results have been retrieved an are safe to delete")
+ @ApiResponses(value = {@ApiResponse(code = 204, message = "Deleted"),
+ @ApiResponse(code = 404, message = "Not found.", response = CmsoRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response deleteSchedule(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Request id") @PathParam("id") @PathVariable(value = "id") String id);
+
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterfaceImpl.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterfaceImpl.java
new file mode 100644
index 0000000..a2a018a
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterfaceImpl.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.ArrayList;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.core.OptimizerManager;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+@Controller
+public class OptimizerInterfaceImpl implements OptimizerInterface {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ Environment env;
+
+ @Context
+ UriInfo uri;
+
+ @Context
+ HttpServletRequest httpRequest;
+
+ @Autowired
+ OptimizerManager optimizerManager;
+
+ @Autowired
+ RequestDao requestDao;
+
+ @Override
+ @Transactional
+ public Response optimizeSchedule(String apiVersion, OptimizerRequest request) {
+ String id = request.getRequestId();
+ Observation.report(LogMessages.OPTIMIZE_SCHEDULE, "Received", httpRequest.getRemoteAddr(), id, "");
+ Response response = null;
+ try {
+ optimizerManager.validate(request); // Throws CmsException if invalid message
+ OptimizerResponse optimizerResponse = optimizerManager.processOptimizerRequest(request);
+ if (optimizerResponse != null)
+ {
+ response = Response.ok(optimizerResponse).build();
+ } else {
+ // Request will be processed asynchronously
+ response = Response.accepted().build();
+ }
+ } catch (CmsoException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.OPTIMIZE_SCHEDULE, "Returned", httpRequest.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+
+ @Override
+ public Response getPolicies(String apiVersion) {
+ // TODO Auto-generated method stub
+ Observation.report(LogMessages.GET_POLICIES, "Received", httpRequest.getRemoteAddr(), "", "");
+ Response response = null;
+ try {
+ List<OptimizerResponse> list = new ArrayList<>();
+ response = Response.ok(list).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.GET_POLICIES, "Returned", httpRequest.getRemoteAddr(), "",
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+
+ @Override
+ public Response getSchedule(String apiVersion, String id) {
+ // TODO Auto-generated method stub
+ Observation.report(LogMessages.GET_SCHEDULE, "Received", httpRequest.getRemoteAddr(), id, "");
+ Response response = null;
+ try {
+ OptimizerResponse atr = new OptimizerResponse();
+ atr.setStatus(OptimizeScheduleStatus.CREATED);
+ atr.setRequestId(id);
+ response = Response.ok(atr).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.GET_SCHEDULE, "Returned", httpRequest.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+
+ @Override
+ public Response deleteSchedule(String apiVersion, String id) {
+ // TODO Auto-generated method stub
+ Observation.report(LogMessages.DELETE_SCHEDULE, "Received", httpRequest.getRemoteAddr(), id, "");
+ Response response = null;
+ try {
+ OptimizerResponse atr = new OptimizerResponse();
+ atr.setStatus(OptimizeScheduleStatus.DELETED);
+ atr.setRequestId(id);
+ response = Response.noContent().build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.DELETE_SCHEDULE, "Returned", httpRequest.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindow.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindow.java
new file mode 100644
index 0000000..4eb6824
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindow.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * The Class ChangeWindow.
+ */
+@ApiModel(value = "Change Window", description = "Time window for which tickets are to returned")
+public class ChangeWindow implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ChangeWindow.class);
+
+ @ApiModelProperty(value = "Earliest time for which changes may begin.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date startTime;
+
+ @ApiModelProperty(value = "Latest time by which all changes must be completed.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date endTime;
+
+ /**
+ * Gets the start time.
+ *
+ * @return the start time
+ */
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ /**
+ * Sets the start time.
+ *
+ * @param startTime the new start time
+ */
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
+
+ /**
+ * Gets the end time.
+ *
+ * @return the end time
+ */
+ public Date getEndTime() {
+ return endTime;
+ }
+
+ /**
+ * Sets the end time.
+ *
+ * @param endTime the new end time
+ */
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
+
+ /**
+ * Overlaps test instance.b
+ *
+ * @param test the test window
+ * @return true, if successful
+ */
+ public boolean overlaps(ChangeWindow test) {
+ int start = startTime.compareTo(test.getStartTime());
+ int end = endTime.compareTo(test.getEndTime());
+ int startend = startTime.compareTo(test.getEndTime());
+ int endstart = endTime.compareTo(test.getStartTime());
+ // at least one of the ends match up
+ if (start == 0 || end == 0 || startend == 0 || endstart == 0) {
+ return true;
+ }
+ // end is before start or start is before end, cannot overlap
+ if (endstart == -1 || startend == 1) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Test if this window contains the passed window.
+ *
+ * @param test the test
+ * @return true, if this change window contains the passed change window
+ */
+ public boolean contains(ChangeWindow test) {
+ if (!test.getStartTime().before(getStartTime()) && !test.getEndTime().after(getEndTime())) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Passed slot time (test) is within this change window adjusted for the time zone of the element.
+ * This is used to interpret global relative availability (maintenance) windows as opposed to
+ * absolute UTC times provided in tickets which should already be adjusted for time zone.
+ *
+ * @param test the test
+ * @param timeZoneOffset the time zone offset
+ * @return true, if successful
+ */
+ public boolean containsInTimeZone(ChangeWindow test, Long timeZoneOffset) {
+ Instant startInstant = startTime.toInstant().plusMillis(timeZoneOffset);
+ Instant endInstant = endTime.toInstant().plusMillis(timeZoneOffset);
+ if (!test.getStartTime().toInstant().isBefore(startInstant)
+ && !test.getEndTime().toInstant().isAfter(endInstant)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Absorb if overlapping window.
+ *
+ * @param test the test window
+ * @return true, if successful
+ */
+ public boolean absorbIfOverlapping(ChangeWindow test) {
+ if (overlaps(test)) {
+ if (test.getStartTime().before(getStartTime())) {
+ setStartTime(test.getStartTime());
+ }
+ if (test.getEndTime().after(getEndTime())) {
+ setEndTime(test.getEndTime());
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ConstraintElements.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ConstraintElements.java
new file mode 100644
index 0000000..0cbd6e2
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ConstraintElements.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
+
+@ApiModel(value = "Topology Constraint Elements",
+ description = "Constraining Element Information returned from TopologyRequuest.")
+public class ConstraintElements implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ public enum AvailabilityMatrixScope {
+ NONE, GLOBAL, ELEMENT,
+ }
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Type of constraint.")
+ private String constraintType;
+
+ @ApiModelProperty(
+ value = "If more than one instance of constraintType,"
+ + " minimum number of available instances required."
+ + " Useful for identifying availableBackup elements, service paths.")
+ private Integer constraintTypeMinimum = 1;
+
+ @ApiModelProperty(value = "Availability matrix name. Availability matrix will not be passed to optimizer engine."
+ + " Generally useful for global concurrency type constraints.")
+ private String optimizerAvailabilityMatrixName;
+
+ @ApiModelProperty(value = "Availability matrix scope global or scoped per elementId.")
+ private AvailabilityMatrixScope availabilityMatrixScope = AvailabilityMatrixScope.NONE;
+
+ @ApiModelProperty(value = "Availability matrix is aggregated into element availability marrix.")
+ private boolean elementAvailabilityAggreagation = true;
+
+ @ApiModelProperty(value = "Elements ")
+ private List<String> elements;
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public String getConstraintType() {
+ return constraintType;
+ }
+
+ public void setConstraintType(String constraintType) {
+ this.constraintType = constraintType;
+ }
+
+ public Integer getConstraintTypeMinimum() {
+ return constraintTypeMinimum;
+ }
+
+ public void setConstraintTypeMinimum(Integer constraintTypeMinimum) {
+ this.constraintTypeMinimum = constraintTypeMinimum;
+ }
+
+ public String getOptimizerAvailabilityMatrixName() {
+ return optimizerAvailabilityMatrixName;
+ }
+
+ public void setOptimizerAvailabilityMatrixName(String optimizerAvailabilityMatrixName) {
+ this.optimizerAvailabilityMatrixName = optimizerAvailabilityMatrixName;
+ }
+
+ public List<String> getElements() {
+ return elements;
+ }
+
+ public void setElements(List<String> elements) {
+ this.elements = elements;
+ }
+
+ public AvailabilityMatrixScope getAvailabilityMatrixScope() {
+ return availabilityMatrixScope;
+ }
+
+ public void setAvailabilityMatrixScope(AvailabilityMatrixScope availabilityMatrixScope) {
+ this.availabilityMatrixScope = availabilityMatrixScope;
+ }
+
+ public boolean isElementAvailabilityAggreagation() {
+ return elementAvailabilityAggreagation;
+ }
+
+ public void setElementAvailabilityAggreagation(boolean elementAvailabilityAggreagation) {
+ this.elementAvailabilityAggreagation = elementAvailabilityAggreagation;
+ }
+
+
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementInfo.java
new file mode 100644
index 0000000..7c2e074
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementInfo.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Optimizer Element", description = "Element to be scheduled.")
+public class ElementInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ElementInfo.class);
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ @ApiModelProperty(value = "VNF group identifier.")
+ public String groupId;
+
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementLocation.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementLocation.java
new file mode 100644
index 0000000..0e82237
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ElementLocation.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+
+@ApiModel(value = "Element Location", description = "Location information necessary to determine timezone."
+ + " lat/lon and/or timezone must be provided")
+public class ElementLocation implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ElementLocation.class);
+
+ @ApiModelProperty(value = "Geographic latitude of element.")
+ private Float lat;
+
+ @ApiModelProperty(value = "Geographic longitude of element.")
+ private Float lon;
+
+ @ApiModelProperty(value = "Timezone.")
+ private String timezone;
+
+ public Float getLat() {
+ return lat;
+ }
+
+ public void setLat(Float lat) {
+ this.lat = lat;
+ }
+
+ public Float getLon() {
+ return lon;
+ }
+
+ public void setLon(Float lon) {
+ this.lon = lon;
+ }
+
+ public String getTimezone() {
+ return timezone;
+ }
+
+ public void setTimezone(String timezone) {
+ this.timezone = timezone;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckComponent.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckComponent.java
new file mode 100644
index 0000000..2217bcf
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckComponent.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+
+@ApiModel
+public class HealthCheckComponent implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckComponent.class);
+
+ private String name;
+ private String url;
+ private String status;
+ private Boolean healthy = false;
+
+ public Boolean getHealthy() {
+ return healthy;
+ }
+
+ public void setHealthy(Boolean healthy) {
+ this.healthy = healthy;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckMessage.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckMessage.java
new file mode 100644
index 0000000..307a935
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/HealthCheckMessage.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel
+public class HealthCheckMessage implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckMessage.class);
+
+ private Boolean healthy = false;
+ private String buildInfo = "";
+ private String currentTime = "";
+ private String hostname = "";
+
+ private List<HealthCheckComponent> components = new ArrayList<HealthCheckComponent>();
+
+ public Boolean getHealthy() {
+ return healthy;
+ }
+
+ public void setHealthy(Boolean healthy) {
+ this.healthy = healthy;
+ }
+
+ public String getBuildInfo() {
+ return buildInfo;
+ }
+
+ public void setBuildInfo(String buildInfo) {
+ this.buildInfo = buildInfo;
+ }
+
+ public String getCurrentTime() {
+ return currentTime;
+ }
+
+ public void setCurrentTime(String currentTime) {
+ this.currentTime = currentTime;
+ }
+
+ public String getHostname() {
+ return hostname;
+ }
+
+ public void setHostname(String hostname) {
+ this.hostname = hostname;
+ }
+
+ public List<HealthCheckComponent> getComponents() {
+ return components;
+ }
+
+ public void setComponents(List<HealthCheckComponent> components) {
+ this.components = components;
+ }
+
+ public void addComponent(HealthCheckComponent components) {
+ this.components.add(components);
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/NameValue.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/NameValue.java
new file mode 100644
index 0000000..dcda0ef
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/NameValue.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+
+@ApiModel(value = "Name Value Data", description = "Instance of a name/value")
+public class NameValue implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(NameValue.class);
+
+ public NameValue() {
+
+ }
+
+ public NameValue(String name, Object value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ @ApiModelProperty(value = "Name.")
+ private String name;
+
+ @ApiModelProperty(value = "Value.")
+ private Object value;
+
+
+ public String getName() {
+ return name;
+ }
+
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ public Object getValue() {
+ return value;
+ }
+
+
+ public void setValue(Object value) {
+ this.value = value;
+ }
+
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerRequest.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerRequest.java
new file mode 100644
index 0000000..0961de5
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerRequest.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Optimizer Request",
+ description = "Request to provide an \"conflict free\" schedule for passed elements.")
+public class OptimizerRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerRequest.class);
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "Concurrency limit for this request")
+ private Integer concurrencyLimit;
+
+ @ApiModelProperty(value = "Expected duration of normal change")
+ private Integer normalDuration;
+
+ @ApiModelProperty(value = "Additional duration for failed change")
+ private Integer additionalDuration;
+
+ @ApiModelProperty(value = "Implementation specific name value pairs.")
+ private List<NameValue> commonData;
+
+ @ApiModelProperty(value = "Lists of desired change windows to schedule the elements.")
+ private List<ChangeWindow> changeWindows = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the elements to schedule.")
+ private List<ElementInfo> elements = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the policies to control optimization.")
+ private List<PolicyInfo> policies = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+
+ public List<PolicyInfo> getPolicies() {
+ return policies;
+ }
+
+
+ public void setPolicies(List<PolicyInfo> policies) {
+ this.policies = policies;
+ }
+
+
+ public List<NameValue> getCommonData() {
+ return commonData;
+ }
+
+
+ public void setCommonData(List<NameValue> commonData) {
+ this.commonData = commonData;
+ }
+
+
+ public List<ElementInfo> getElements() {
+ return elements;
+ }
+
+
+ public void setElements(List<ElementInfo> elements) {
+ this.elements = elements;
+ }
+
+
+ public List<ChangeWindow> getChangeWindows() {
+ return changeWindows;
+ }
+
+
+ public void setChangeWindows(List<ChangeWindow> changeWindows) {
+ this.changeWindows = changeWindows;
+ }
+
+
+ public Integer getConcurrencyLimit() {
+ return concurrencyLimit;
+ }
+
+
+ public void setConcurrencyLimit(Integer concurrencyLimit) {
+ this.concurrencyLimit = concurrencyLimit;
+ }
+
+
+ public Integer getNormalDuration() {
+ return normalDuration;
+ }
+
+
+ public void setNormalDuration(Integer normalDuration) {
+ this.normalDuration = normalDuration;
+ }
+
+
+ public Integer getAdditionalDuration() {
+ return additionalDuration;
+ }
+
+
+ public void setAdditionalDuration(Integer additionalDuration) {
+ this.additionalDuration = additionalDuration;
+ }
+
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerResponse.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerResponse.java
new file mode 100644
index 0000000..b8b5a21
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerResponse.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Optimizer Response", description = "Response to optimizer request for the requested elements.")
+public class OptimizerResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerResponse.class);
+
+ public enum OptimizeScheduleStatus {
+ CREATED,
+ PENDING_TOPOLOGY,
+ TOPOLOGY_IN_PROGRESS,
+ PENDING_TICKETS,
+ TICKETS_IN_PROGRESS,
+ PENDING_OPTIMIZER,
+ OPTIMIZER_IN_PROGRESS,
+ COMPLETED,
+ FAILED,
+ DELETED,
+ }
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "Status of the optimization")
+ private OptimizeScheduleStatus status;
+
+ @ApiModelProperty(value = "Message for failed optimization")
+ private String errorMessage;
+
+
+ @ApiModelProperty(value = "List of schedules returned by the optimizer.")
+ private List<OptimizerScheduleInfo> schedules = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+
+ public List<OptimizerScheduleInfo> getSchedules() {
+ return schedules;
+ }
+
+ public void setSchedules(List<OptimizerScheduleInfo> schedules) {
+ this.schedules = schedules;
+ }
+
+ public OptimizeScheduleStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(OptimizeScheduleStatus status) {
+ this.status = status;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerScheduleInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerScheduleInfo.java
new file mode 100644
index 0000000..37bb404
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/OptimizerScheduleInfo.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Optimizer Schedule Info", description = "Schedule Information returned from optimizer request.")
+public class OptimizerScheduleInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerScheduleInfo.class);
+
+ @ApiModelProperty(value = "Lists of elements with start times.")
+ private List<ScheduledElement> scheduledElements = new ArrayList<>();
+
+ @ApiModelProperty(value = "Lists of elements that were not able to be scheduled.")
+ private List<UnScheduledElement> unScheduledElements = new ArrayList<>();
+
+
+ public List<ScheduledElement> getScheduledElements() {
+ return scheduledElements;
+ }
+
+
+ public void setScheduledElements(List<ScheduledElement> scheduledElements) {
+ this.scheduledElements = scheduledElements;
+ }
+
+
+ public List<UnScheduledElement> getUnScheduledElements() {
+ return unScheduledElements;
+ }
+
+
+ public void setUnScheduledElements(List<UnScheduledElement> unScheduledElements) {
+ this.unScheduledElements = unScheduledElements;
+ }
+
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/PolicyInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/PolicyInfo.java
new file mode 100644
index 0000000..524571a
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/PolicyInfo.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Supported Policy Information", description = "Policy Information returned from get policies API.")
+public class PolicyInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(PolicyInfo.class);
+
+ @ApiModelProperty(value = "Policy name")
+ private String policyName;
+
+ @ApiModelProperty(value = "Policy description")
+ private String policyDescription;
+
+ @ApiModelProperty(value = "Named values to modify/override policy attributes.")
+ public List<NameValue> policyModifiers = new ArrayList<>();
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+ public String getPolicyDescription() {
+ return policyDescription;
+ }
+
+ public void setPolicyDescription(String policyDescription) {
+ this.policyDescription = policyDescription;
+ }
+
+ public List<NameValue> getPolicyModifiers() {
+ return policyModifiers;
+ }
+
+ public void setPolicyModifiers(List<NameValue> policyModifiers) {
+ this.policyModifiers = policyModifiers;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ReferencedElementInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ReferencedElementInfo.java
new file mode 100644
index 0000000..97210b1
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ReferencedElementInfo.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Topology Related Element", description = "Element Information returned from TopologyRequuest.")
+public class ReferencedElementInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ReferencedElementInfo.class);
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Location information for the element.")
+ private ElementLocation elementLocation;
+
+ @ApiModelProperty(value = "Related elements only. Element ids of the element(s) ")
+ private List<String> referencingElements;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public ElementLocation getElementLocation() {
+ return elementLocation;
+ }
+
+ public void setElementLocation(ElementLocation elementLocation) {
+ this.elementLocation = elementLocation;
+ }
+
+
+ public List<String> getRelatedElements() {
+ return referencingElements;
+ }
+
+ public void setRelatedElements(List<String> relatedElements) {
+ this.referencingElements = relatedElements;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ScheduledElement.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ScheduledElement.java
new file mode 100644
index 0000000..b3561dd
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/ScheduledElement.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+@ApiModel(value = "Scheduled Element", description = "Scheduled element returned by the optimizer.")
+public class ScheduledElement implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ScheduledElement.class);
+
+ public enum ScheduleType {
+ UNKNOWN, GROUP_DISPATCH, INDIVIDUAL,
+ }
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Group identifier")
+ private String groupId;
+
+ private ScheduleType scheduleType = ScheduleType.UNKNOWN;
+
+ @ApiModelProperty(value = "Earliest time for which changes may begin.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date startTime;
+
+ @ApiModelProperty(value = "Latest time by which all changes must be completed.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date endTime;
+
+ @ApiModelProperty(value = "Expected duration of change in seconds.")
+ private Long durationSeconds;
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public ScheduleType getScheduleType() {
+ return scheduleType;
+ }
+
+ public void setScheduleType(ScheduleType scheduleType) {
+ this.scheduleType = scheduleType;
+ }
+
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
+
+ public Date getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getDurationSeconds() {
+ return durationSeconds;
+ }
+
+ public void setDurationSeconds(Long durationSeconds) {
+ this.durationSeconds = durationSeconds;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/UnScheduledElement.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/UnScheduledElement.java
new file mode 100644
index 0000000..775c760
--- /dev/null
+++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/models/UnScheduledElement.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Unscheduled Element", description = "Scheduled element returned by the optimizer.")
+public class UnScheduledElement implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(UnScheduledElement.class);
+
+ public enum NotScheduledReason {
+ ConcurrencyConstraint, AvailabilityConstraint, Other,
+ }
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Group identifier")
+ private String groupId;
+
+ @ApiModelProperty(value = "List of reasons not able to schedule this element.")
+ private List<NotScheduledReason> notScheduledReaons = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of messages not able to schedule this element.")
+ private List<String> notScheduledMessages = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public List<NotScheduledReason> getNotScheduledReaons() {
+ return notScheduledReaons;
+ }
+
+ public void setNotScheduledReaons(List<NotScheduledReason> notScheduledReaons) {
+ this.notScheduledReaons = notScheduledReaons;
+ }
+
+ public List<String> getNotScheduledMessages() {
+ return notScheduledMessages;
+ }
+
+ public void setNotScheduledMessages(List<String> notScheduledMessages) {
+ this.notScheduledMessages = notScheduledMessages;
+ }
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-optimizer/src/main/resources/META-INF/spring.factories b/cmso-optimizer/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..c0b4a01
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.env.EnvironmentPostProcessor=org.onap.optf.cmso.CmsoEnvironmentPostProcessor \ No newline at end of file
diff --git a/cmso-optimizer/src/main/resources/aaf/AAFUserRoles.properties b/cmso-optimizer/src/main/resources/aaf/AAFUserRoles.properties
new file mode 100644
index 0000000..e7fc221
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/aaf/AAFUserRoles.properties
@@ -0,0 +1 @@
+/**=org.onap.oof.access|*|get ALL \ No newline at end of file
diff --git a/cmso-optimizer/src/main/resources/aaf/org.onap.oof.cred.props b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.cred.props
new file mode 100644
index 0000000..21945b8
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.cred.props
@@ -0,0 +1,11 @@
+############################################################
+# Properties Generated by AT&T Certificate Manager
+# by root
+# on 2019-02-15T21:01:19.868+0000
+# @copyright 2016, AT&T
+############################################################
+aaf_id=oof@oof.onap.org
+aaf_password=demo123456!
+cadi_keyfile=src/main/resources/aaf/org.onap.oof.keyfile
+cadi_truststore=src/main/resources/aaf/truststoreONAPall.jks
+#cadi_truststore_password=enc:erNqS33_5xn_bwcaroba7NvYfPLpPUYxqzw3rdwGTY7jbnygOTyQ-R6dpSC_3iPOomp-rqZkHgMGImiUk9DFPr
diff --git a/cmso-optimizer/src/main/resources/aaf/org.onap.oof.keyfile b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.keyfile
new file mode 100644
index 0000000..f85a567
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.keyfile
@@ -0,0 +1,27 @@
+liD-IR8Y1MHqPDTUqq3AaTtqnWn5jCpfIRBlyi6xY4A0fbQz8ZPlTZPHkshRt0dHdST3R7TIvTyQ
+JpTCeBNBu2df3vBbUzsN0rIpPG9TGjzmE7cRu4V4kfefSqsIj-S7OTAaWaWpwGWJYLLCB2sQALkS
+f68VWdupUEw3g9jqCU1QzjKOnLGvhlp6Qrc1xG4Z5Ar8WERw-C3DqTWUKANoEvjWkvH2rAywzj93
+pmspvd5fQfH1rp1ACNvnPrRb_oYNfwPrNpE7Sb4LvM1muoiKMDF64IDO0TkxhjHZ9wpJgVsnowby
+qmokqf39dMRRk3S1IEpOiBGyLS_885JDj_XJKYRQsjvkTzjpFJ7wE2-HDZEVWCITvtS9-Xorm5TI
+3iU4rjMDew5fkBnjoKuSOS7Lksva4ouZOCiUkDos1jAJ5XMDEQm4BcPHtcW6PpC602-qRcgnNjjP
+wOPdF7hCm27ZTai3lAtNGByR7oBr9r5Uma-soORFvg8drV8Rgh0lax-poFVhoEH7RhKPIzYpSco9
+jnpURzi_epTjAhjjup-erTv2GAIllKsSEHZLbfsFWlNUZTOx58PSB0jBN5m_8HxTyNm0zsm0Cb7U
+KsjPduQ5ZblsfRIJwqpOBXoof7WerKReMZSOdgjZUNueiuEImVH9_SYOdKZhkluSi4yfEtme7CCP
+kZ2JhdiT5km3SeonalhU2MUsx60krxyQ1mnjI4jS9QagUME4mujdvM_L7mtjcPZVSfXUn49whakE
+J-NQV6q2iZgN2IxsT_uCnlZYwnE5i-IbQkQAEu13m6ETsMmf0cwPnKaSwRhb8G48EkJhTL-GP9Z0
+-EsIKT7lQt7kfX-mmNoEirTg9gQAaN3uxLmdHvXpeJdlETnnaLYYJJ3h-SL0e_5Yz2SpdsEwZ3Bk
+PtR-QvlYKDhG1nhPOna65ctCzn81PZOUP3lsO6MSTOK6D6Taxfh1TYEBAvzCP0BfFBodw4lSglFP
+I5IfdiJmomTGARa36nC_O5YzH_jBWLQrgd2gxI5H5bB-5zqzu79SGX9o2_LRVY_LVV0BmI3xSYOI
+vziYYC1XyTY6blfdiOM5a5KjraErxSTEFZVFrsx4OQ_dLA0woVtixawrIy1rgfQr49U1oIRe8BgN
+j3eis_UQAbPbmdbEe1qtXnvi6T7trHskzt6K-vTgo5ITJkr-F2Sds_QgNdaFBGuES6X5RwRGlbHT
+Tl_M8Ja_1K-RMNKJRssoRTKstpwnrhk9IcoSwYcLykbDLgeC0mhSMHOOuWv1RGRaZdzObc5YA1eB
+idQmzy5xAHzNxPHHrB-fpjFJRYv_QZY9qZcGvP58d6bHO0upxbj-BBt9zfc7Qt0JLU6EAdYbW5TI
+2v4JImikrx6KvtoK8vcjJMTDAanTVB31J65tat0rq9wYKxUdjBJLzkT3psYs_DRtYQc0i02YTD7t
+dWya0-3p1Yrt0em3XGb8JAh2PA3BsQKmvKAOc054wf_B8n8saxSFw1WQL30vU5c4-Z_p53HfaUYd
+Qg7DZskzgwBRy48sLJNCrn81RtxXfQP1XtPEZs-AAlTUslHoUdoQ1cwrYEgkNT1cjk6sLI_oKSK-
+dDICBnlYLrZRBS3sH8K38WaIh1WRY6vbGVDs1tUectUpng_-Khavd0Crw7D_CE6T7Rnfcn0pnTV-
+HW1PIXejFsONQn-2c3a9HZ-v6Hg4JL6UWm-qgBPC5118ymO0LfmrviAFAC6Wt3WFiNzrvx9Jggus
+lE0qvLVfkQVZXAy-hSPHlYZmtxk5voVsf60qPoDN2-NdpWz62M9PrXd_A03YGxzt0G6J4VXExRES
+xqLeGNGB496AfX_vEub97sR8xcbbUXsyt12uVnygifGyND60coikaKrMktv2OLOLEl8AudLp0ZNA
+oOoYJZqfUnQqaLt0dNmNa5OtzYjf7f6bYX0V8XLTHlFqZ6QzqYGFMPNhDYjqtet6d--Q8t7_5S5C
+RfXP8Wh8CjbEh2_rsr9rvy1nhM_Cptxc0BFXcS5Dt_R4vjd2G4B_LEC4Hy1s_rZThzUVxRCl \ No newline at end of file
diff --git a/cmso-optimizer/src/main/resources/aaf/org.onap.oof.location.props b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.location.props
new file mode 100644
index 0000000..d4a48df
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.location.props
@@ -0,0 +1,8 @@
+############################################################
+# Properties Generated by AT&T Certificate Manager
+# by root
+# on 2019-02-15T21:01:19.861+0000
+# @copyright 2016, AT&T
+############################################################
+cadi_latitude=0.00
+cadi_longitude=0.00
diff --git a/cmso-optimizer/src/main/resources/aaf/org.onap.oof.props b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.props
new file mode 100644
index 0000000..766c354
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/aaf/org.onap.oof.props
@@ -0,0 +1,14 @@
+############################################################
+# Properties Generated by AT&T Certificate Manager
+# by root
+# on 2019-02-15T21:01:19.866+0000
+# @copyright 2016, AT&T
+############################################################
+aaf_id=oof@oof.onap.org
+aaf_locate_url=https://aaf-onap-test.osaaf.org:8095
+aaf_url=https://AAF_LOCATE_URL/AAF_NS.service:2.1
+cadi_etc_dir=etc/config
+cadi_latitude=0.00
+cadi_longitude=0.00
+cadi_prop_files=src/main/resources/aaf/org.onap.oof.location.props;src/main/resources/aaf/org.onap.oof.cred.props
+cm_url=https://AAF_LOCATE_URL/AAF_NS.cm:2.1
diff --git a/cmso-optimizer/src/main/resources/aaf/permissions.properties b/cmso-optimizer/src/main/resources/aaf/permissions.properties
new file mode 100644
index 0000000..85d3e3c
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/aaf/permissions.properties
@@ -0,0 +1,2 @@
+permission.type=org.onap.oof
+permission.instance=* \ No newline at end of file
diff --git a/cmso-optimizer/src/main/resources/application.properties b/cmso-optimizer/src/main/resources/application.properties
new file mode 100644
index 0000000..a22df14
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/application.properties
@@ -0,0 +1,49 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==============================================
+# Copyright (c) 2019 AT&T Intellectual Property.
+# =======================================================================
+# Licensed 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.
+# ============LICENSE_END=================================================
+#
+#-------------------------------------------------------------------------------
+
+info.build.artifact=@project.artifactId@
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.version=@project.version@
+
+spring.jersey.type=filter
+spring.mvc.urls=swagger,docs,prometheus
+server.servlet.context-path=/optimizer
+spring.main.allow-bean-definition-overriding=true
+
+#This property is used to set the Tomcat connector attributes.developers can define multiple attributes separated by comma
+#tomcat.connector.attributes=allowTrace-true
+
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+
+#The minimum number of threads always kept alive
+server.tomcat.min-spare-threads=25
+
+# External API port
+server.port=7997
+
+kubernetes.namespace=org.onap.optf.cmso
+
+
+com.att.eelf.logging.file=logback.xml
+com.att.eelf.logging.path=
+
+logging.config=
+spring.profiles.active=proprietary-auth
diff --git a/cmso-optimizer/src/main/resources/banner.txt b/cmso-optimizer/src/main/resources/banner.txt
new file mode 100644
index 0000000..ecb0dd9
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+#-----------------------------------------------------------
+ ____ ____ ____________ ________ ________ ____
+ / __ \/ __ \/_ __/ ____/ / ____/ |/ / ___// __ \
+ / / / / /_/ / / / / /_ / / / /|_/ /\__ \/ / / /
+ / /_/ / ____/ / / / __/ / /___/ / / /___/ / /_/ /
+ \____/_/ /_/ /_/ \____/_/ /_//____/\____/
+
+${archetype.name}-Version:${archetype.version}
+
+#----------------------------------------------------------- \ No newline at end of file
diff --git a/cmso-optimizer/src/main/resources/logback.xml b/cmso-optimizer/src/main/resources/logback.xml
new file mode 100644
index 0000000..2fd5329
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/logback.xml
@@ -0,0 +1,377 @@
+<!--
+ Copyright © 2017-2018 AT&T Intellectual Property.
+ Modifications Copyright © 2018 IBM.
+
+ Licensed 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.
+
+
+ Unless otherwise specified, all documentation contained herein is licensed
+ under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ you may not use this documentation except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://creativecommons.org/licenses/by/4.0/
+
+ Unless required by applicable law or agreed to in writing, documentation
+ 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.
+-->
+
+<configuration scan="true" scanPeriod="3 seconds" debug="false">
+
+ <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
+ <property resource="application.properties" />
+ <property name="namespace" value="${kubernetes.namespace}"></property>
+ <!-- directory path for all other type logs -->
+ <property name="logDir" value="logs" />
+ <!-- directory path for debugging type logs -->
+ <property name="debugDir" value="debug-logs" />
+ <property name="logDirectory" value="${logDir}" />
+ <property name="debugLogDirectory" value="${debugDir}" />
+ <!-- log file names -->
+ <property name="generalLogName" value="application" />
+ <property name="securityLogName" value="security" />
+ <property name="performanceLogName" value="performance" />
+ <property name="serverLogName" value="server" />
+ <property name="policyLogName" value="policy" />
+ <property name="errorLogName" value="error" />
+ <property name="metricsLogName" value="metrics" />
+ <property name="auditLogName" value="audit" />
+ <property name="debugLogName" value="debug" />
+
+ <property name="defaultPattern"
+ value="%d{yyyy-MM-dd HH:mm:ss.SSS} $ version: %X{version} threadId: {PID:- } %-5level namespace:${namespace} %logger{20} [ hostname: %X{hostname} serviceName: %X{serviceName} version: %X{version} transactionId: %X{transactionId} requestTimeStamp: %X{requestTimestamp} responseTimeStamp: %X{responseTimestamp} duration: %X{duration}] %m%n" />
+
+ <property name="performanceandAuditpattern"
+ value="%date{ISO8601,UTC}|%thread|%.-5level|namespace:${namespace}|%logger{20}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{serviceName}| %msg%n" />
+
+ <property name="auditLoggerPattern"
+ value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+ <property name="metricsLoggerPattern"
+ value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+ <property name="errorLoggerPattern"
+ value="%date{ISO8601,UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%.-5level|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />
+
+ <property name="debugLoggerPattern"
+ value="%date{ISO8601,UTC}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
+
+ <appender name="STDOUT"
+ class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- EELF Appenders -->
+ <!-- ============================================================================ -->
+
+ <!-- The EELFAppender is used to record events to the general application
+ log -->
+
+ <appender name="EELF"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELF"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <appender name="EELFSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender>
+
+ <!-- EELF Performance Appender. This appender is used to record performance
+ records. -->
+ <appender name="EELFPerformance"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${performanceLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPerformance"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPerformance" />
+ </appender>
+
+ <!-- EELF Server Appender. This appender is used to record Server related
+ logging events. The Server logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate
+ Server events from other components, or it can be eliminated to record these
+ events as part of the application root log. -->
+ <appender name="EELFServer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${serverLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFServer"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFServer" />
+ </appender>
+
+
+ <!-- EELF Policy Appender. This appender is used to record Policy engine
+ related logging events. The Policy logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+ <appender name="EELFPolicy"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${policyLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPolicy"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPolicy" />
+ </appender>
+
+
+ <!-- EELF Audit Appender. This appender is used to record audit engine related
+ logging events. The audit logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+
+ <appender name="EELFAudit"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${auditLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${auditLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFAudit"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFAudit" />
+ </appender>
+
+ <appender name="EELFMetrics"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${metricsLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${metricsLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics" />
+ </appender>
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${errorLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError" />
+ </appender>
+
+ <appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="${EELF_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELF" />
+ </logger>
+ <logger name="com.att.eelf.security" level="${DECURITY_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFSecurity" />
+ </logger>
+ <logger name="com.att.eelf.perf" level="${PERF_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFPerformance" />
+ </logger>
+ <logger name="com.att.eelf.server" level="${SERVER_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFServer" />
+ </logger>
+ <logger name="com.att.eelf.policy" level="${POLICY_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFPolicy" />
+ </logger>
+ <logger name="com.att.eelf.audit" level="${AUDIT_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFAudit" />
+ </logger>
+
+ <logger name="com.att.eelf.metrics" level="${METRICS_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFMetrics" />
+ </logger>
+
+ <logger name="com.att.eelf.error" level="${ERROR_LEVEL:-error}"
+ additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="com.att.eelf.debug" level="${DEBUG_LEVEL:-debug}"
+ additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+ </logger>
+
+ <root level="${ROOT_LEVEL:-INFO}">
+ <!-- appender-ref ref="STDOUT" / -->
+ <appender-ref ref="asyncEELF" />
+ </root>
+
+</configuration>
diff --git a/cmso-optimizer/src/main/resources/logmessages.properties b/cmso-optimizer/src/main/resources/logmessages.properties
new file mode 100644
index 0000000..2c7a32c
--- /dev/null
+++ b/cmso-optimizer/src/main/resources/logmessages.properties
@@ -0,0 +1,28 @@
+# Generated from org.onap.optf.cmso.optimizer.common.LogMessages
+OPTIMIZE_SCHEDULE OPTIMIZE_SCHEDULE|Optimize schedule {0} : {1}: {2} : {3}|No resolution needed|No action is required
+GET_POLICIES GET_POLICIES|Get active tickets {0} : {1}: {2} : {3}|No resolution needed|No action is required
+GET_SCHEDULE GET_SCHEDULE|Get optimized schedule {0} : {1}: {2} : {3}|No resolution needed|No action is required
+DELETE_SCHEDULE DELETE_SCHEDULE|Delete optimized schedule {0} : {1}: {2} : {3}|No resolution needed|No action is required
+INVALID_ATTRIBUTE INVALID_ATTRIBUTE|Invalid attribute {0}={1}|No resolution needed|No action is required
+MISSING_REQUIRED_ATTRIBUTE MISSING_REQUIRED_ATTRIBUTE|Missing required attribute '{0}'|No resolution needed|No action is required
+INVALID_REQUEST INVALID_REQUEST|The input data structure is incorrect|No resolution needed|No action is required
+REQUEST_TIMED_OUT REQUEST_TIMED_OUT|Request timed out.|No resolution needed|No action is required
+UNEXPECTED_EXCEPTION UNEXPECTED_EXCEPTION|Unexpected exception encountered during processing. Please contact support : {0}|No resolution needed|No action is required
+UNDEFINED_FILTER_ATTRIBUTE UNDEFINED_FILTER_ATTRIBUTE|Undefined filter attribute {0}|No resolution needed|No action is required
+INVALID_DATE_FILTER INVALID_DATE_FILTER|Invalid date filter provided {0}=(1}|No resolution needed|No action is required
+INCOMING_MESSAGE INCOMING_MESSAGE|Incoming message method={0} path={1}|No resolution needed|No action is required
+INCOMING_MESSAGE_RESPONSE INCOMING_MESSAGE_RESPONSE|Message response method={0} path={1} status={2}|No resolution needed|No action is required
+OUTGOING_MESSAGE OUTGOING_MESSAGE|Outgoing message method={0} path={1}|No resolution needed|No action is required
+OUTGOING_MESSAGE_RETURNED OUTGOING_MESSAGE_RETURNED|Outgoing message returned method={0} path={1} status={2}|No resolution needed|No action is required
+UNEXPECTED_RESPONSE UNEXPECTED_RESPONSE|Unexpected response from URL {0} : HTTP Status={1}|No resolution needed|No action is required
+INVALID_CHANGE_WINDOW INVALID_CHANGE_WINDOW|Change window end time {0} must be after start time {1}|No resolution needed|No action is required
+EXPECTED_EXCEPTION EXPECTED_EXCEPTION|Expected exception encountered during processing. {0}|No resolution needed|No action is required
+UNABLE_TO_UPDATE_TICKET UNABLE_TO_UPDATE_TICKET|Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}|No resolution needed|No action is required
+UNAUTHORIZED UNAUTHORIZED|Authorization failed.|No resolution needed|No action is required
+UNAUTHENTICATED UNAUTHENTICATED|Authentication failed.|No resolution needed|No action is required
+EXPECTED_DATA_NOT_FOUND EXPECTED_DATA_NOT_FOUND|Retrieve of {0} from {1} failed. Not found.|No resolution needed|No action is required
+DUPLICATE_REQUEST_ID DUPLICATE_REQUEST_ID|Request id {0} already exists|No resolution needed|No action is required
+TOPOLOGY_REQUEST TOPOLOGY_REQUEST|Topology request {0} for {1} URL: {1}|No resolution needed|No action is required
+OPTIMIZER_REQUEST OPTIMIZER_REQUEST|OPtimizer request {0} for {1} Command: {1}|No resolution needed|No action is required
+TICKETS_REQUEST TICKETS_REQUEST|Tickets request {0} for {1} URL: {1}|No resolution needed|No action is required
+UNSUPPORTED_PERIODIC_TIME UNSUPPORTED_PERIODIC_TIME|Unsupported periodic time from policy: {0}|No resolution needed|No action is required
diff --git a/cmso-optimizer/src/main/script/TagVersion.groovy b/cmso-optimizer/src/main/script/TagVersion.groovy
new file mode 100644
index 0000000..c682f7f
--- /dev/null
+++ b/cmso-optimizer/src/main/script/TagVersion.groovy
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CMSO
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.cmso.maven.scripts
+
+println project.properties['cmso.project.version'];
+def versionArray;
+if ( project.properties['cmso.project.version'] != null ) {
+ versionArray = project.properties['cmso.project.version'].split('\\.');
+}
+
+if ( project.properties['cmso.project.version'].endsWith("-SNAPSHOT") ) {
+ project.properties['project.docker.latesttag.version']=versionArray[0] + '.' + versionArray[1] + "-SNAPSHOT-latest";
+ project.properties['project.docker.latesttagtimestamp.version']=versionArray[0] + '.' + versionArray[1] + "-SNAPSHOT-"+project.properties['cmso.build.timestamp'];
+} else {
+ project.properties['project.docker.latesttag.version']=versionArray[0] + '.' + versionArray[1] + "-STAGING-latest";
+ project.properties['project.docker.latesttagtimestamp.version']=versionArray[0] + '.' + versionArray[1] + "-STAGING-"+project.properties['cmso.build.timestamp'];
+}
+
+println 'New Tag for docker:' + project.properties['project.docker.latesttag.version']; \ No newline at end of file
diff --git a/cmso-optimizer/src/test/data/resultsTest001.yaml b/cmso-optimizer/src/test/data/resultsTest001.yaml
new file mode 100644
index 0000000..1c7eed6
--- /dev/null
+++ b/cmso-optimizer/src/test/data/resultsTest001.yaml
@@ -0,0 +1,28 @@
+results:
+ - num_scheduled: 0
+ total_completion_time: 0
+ element_slot_loader: |
+ 1,0,1
+ 2,0,1
+ 3,0,1
+ 4,0,1
+ 5,0,1
+ -
+ num_scheduled: 1
+ total_completion_time: 2
+ element_slot_loader: |
+ 1,0,1
+ 2,0,1
+ 3,2,1
+ 4,0,1
+ 5,0,1
+ -
+ num_scheduled: 4
+ total_completion_time: 8
+ element_slot_loader: |
+ 1,2,1
+ 2,1,1
+ 3,2,1
+ 4,0,1
+ 5,3,1
+elapsed_millis: 3400 \ No newline at end of file
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/AuthProviderTest.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
new file mode 100644
index 0000000..d2852d2
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright © 2019 IBM Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.optf.cmso.optimizer.AuthProvider;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+
+@RunWith(MockitoJUnitRunner.class)
+public class AuthProviderTest {
+
+ @Test
+ public void authenticate() {
+ String principal = "testName";
+ String credential = "testPassword";
+ Authentication authentication = mock(Authentication.class);
+ when(authentication.getName()).thenReturn(principal);
+ when(authentication.getCredentials()).thenReturn(credential);
+ AuthProvider authProvider = new AuthProvider();
+ Authentication auth = authProvider.authenticate(authentication);
+ assertEquals(principal, auth.getPrincipal());
+ assertEquals(credential, auth.getCredentials());
+ }
+
+ @Test
+ public void supports() {
+ AuthProvider authProvider = new AuthProvider();
+ assertTrue(authProvider.supports(UsernamePasswordAuthenticationToken.class));
+ assertFalse(authProvider.supports(Authentication.class));
+ }
+}
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/JtestHelper.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/JtestHelper.java
new file mode 100644
index 0000000..fe76de1
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/JtestHelper.java
@@ -0,0 +1,57 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Map;
+import java.util.Scanner;
+import org.apache.commons.lang3.text.StrSubstitutor;
+
+public class JtestHelper {
+ private static String templatefolder = "src/test/templates" + File.separator;
+
+ /**
+ * Template.
+ *
+ * @param filename the filename
+ * @param values the values
+ * @return the string
+ */
+ public static String template(String filename, Map<String, String> values) {
+ String data = "";
+ Scanner scan = null;
+ try {
+ File ttfolder = new File(templatefolder + filename);
+ scan = new Scanner(ttfolder);
+ scan.useDelimiter("\\Z");
+ data = scan.next();
+ StrSubstitutor ss = new StrSubstitutor(values);
+ data = ss.replace(data);
+ } catch (FileNotFoundException e) {
+ data = "";
+ } finally {
+ if (scan != null) {
+ scan.close();
+ }
+ }
+ return data;
+ }
+}
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManagerTest.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManagerTest.java
new file mode 100644
index 0000000..c71c829
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/policies/PolicyManagerTest.java
@@ -0,0 +1,69 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.policies;
+
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.optf.cmso.optimizer.availability.policies.model.Policy;
+import org.onap.optf.cmso.optimizer.availability.policies.model.TimeLimitAndVerticalTopology;
+import org.springframework.core.env.Environment;
+
+@RunWith(MockitoJUnitRunner.class)
+public class PolicyManagerTest {
+
+ @InjectMocks
+ private PolicyManager policyManager;
+
+ @Mock
+ public Environment env;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ Mockito.when(env.getProperty("cmso.local.policy.folder", "data/policies")).thenReturn("data/policies");
+ }
+
+ @Test
+ public void getPolicyByName() {
+ String policyName = "Weekday_00_06";
+
+ String result = "CMSO.Weekday_00_06,CMSO.Weekday_00_06,CMSO.Weekday_00_06,";
+ List<Policy> policies = policyManager.getSupportedPolicies();
+ StringBuilder sb = new StringBuilder();
+ for (Policy pol : policies) {
+ sb.append(pol.getPolicyName()).append(",");
+ }
+ System.out.println(" String result = \"" + sb.toString() + "\";");
+ Assert.assertTrue(result.equals(sb.toString()));
+ Policy policy = policyManager.getPolicyForName(policyName);
+ Assert.assertTrue(policy != null);
+ TimeLimitAndVerticalTopology top = policyManager.getTimeLimitAndVerticalTopologyByName(policyName);
+ Assert.assertTrue(top != null);
+
+ }
+}
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindowsTest.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindowsTest.java
new file mode 100644
index 0000000..ce1f1a4
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/availability/timewindows/RecurringWindowsTest.java
@@ -0,0 +1,79 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.availability.timewindows;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.optf.cmso.optimizer.availability.policies.PolicyManager;
+import org.onap.optf.cmso.optimizer.availability.policies.model.TimeLimitAndVerticalTopology;
+import org.onap.optf.cmso.optimizer.service.rs.models.ChangeWindow;
+import org.springframework.core.env.Environment;
+
+@RunWith(MockitoJUnitRunner.class)
+public class RecurringWindowsTest {
+
+
+ @InjectMocks
+ private PolicyManager policyManager;
+
+ @Mock
+ public Environment env;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ Mockito.when(env.getProperty("cmso.local.policy.folder", "data/policies")).thenReturn("data/policies");
+ }
+
+ @Test
+ public void getAvailabilityWindowsForPolicies() {
+ getAvailabilityWindowsForPolicy("Weekday_00_06", "2019-03-08T00:00:00.00Z", "2019-03-12T00:00:00.00Z", 2);
+ getAvailabilityWindowsForPolicy("EveryDay_00_06", "2019-03-08T00:00:00.00Z", "2019-03-12T00:00:00.00Z", 4);
+ getAvailabilityWindowsForPolicy("Weekend_00_06", "2019-03-08T00:00:00.00Z", "2019-03-12T00:00:00.00Z", 3);
+
+ }
+
+ private void getAvailabilityWindowsForPolicy(String policyName, String startStr, String endStr, int size) {
+ TimeLimitAndVerticalTopology top = policyManager.getTimeLimitAndVerticalTopologyByName(policyName);
+ Assert.assertTrue(top != null);
+ List<TimeLimitAndVerticalTopology> topList = new ArrayList<>();
+ topList.add(top);
+ ChangeWindow changeWindow = new ChangeWindow();
+ Instant start = Instant.parse(startStr);
+ Instant end = Instant.parse(endStr);
+ changeWindow.setStartTime(Date.from(start));
+ changeWindow.setEndTime(Date.from(end));
+ List<ChangeWindow> windows = RecurringWindows.getAvailabilityWindowsForPolicies(topList, changeWindow);
+ Assert.assertTrue(windows != null);
+ Assert.assertTrue(windows.size() == size);
+
+ }
+}
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ResultsTest.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ResultsTest.java
new file mode 100644
index 0000000..ddbee2f
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/clients/optimizer/models/ResultsTest.java
@@ -0,0 +1,40 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ */
+
+package org.onap.optf.cmso.optimizer.clients.optimizer.models;
+
+import java.io.File;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.yaml.snakeyaml.introspector.PropertyUtils;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ResultsTest extends PropertyUtils {
+ @Test
+ public void yamlTests() {
+ OptimizerResponseUtility util = new OptimizerResponseUtility();
+ File resultsFile = new File("src/test/data/resultsTest001.yaml");
+ OptimizerResults results = util.parseOptimizerResult(resultsFile);
+ Assert.assertTrue(results != null);
+
+ }
+
+
+}
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindowTest.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindowTest.java
new file mode 100644
index 0000000..b1309fb
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/optimizer/service/rs/models/ChangeWindowTest.java
@@ -0,0 +1,53 @@
+package org.onap.optf.cmso.optimizer.service.rs.models;
+
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+import java.time.Instant;
+import java.util.Date;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class ChangeWindowTest {
+
+
+ @Test
+ public void chagneWindowTest() {
+ ChangeWindow window = new ChangeWindow();
+ window.setStartTime(Date.from(Instant.parse("2019-03-08T00:00:00.00Z")));
+ window.setEndTime(Date.from(Instant.parse("2019-03-12T00:00:00.00Z")));
+ testContains(window, "2019-03-08T00:00:00.00Z", "2019-03-12T00:00:00.00Z", true);
+ testContains(window, "2019-03-07T23:59:59Z", "2019-03-12T00:00:00.00Z", false);
+ testContains(window, "2019-03-09T23:59:59Z", "2019-03-11T00:00:00.00Z", true);
+ testContains(window, "2019-03-06T23:59:59Z", "2019-03-06T23:59:59Z", false);
+ testContains(window, "2019-03-12T23:59:59Z", "2019-03-13T00:00:00.00Z", false);
+
+ }
+
+ private void testContains(ChangeWindow window, String from, String to, boolean contains) {
+ ChangeWindow test = new ChangeWindow();
+ test.setStartTime(Date.from(Instant.parse(from)));
+ test.setEndTime(Date.from(Instant.parse(to)));
+ Assert.assertTrue(window.contains(test) == contains);
+ }
+
+}
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
new file mode 100644
index 0000000..f7d0939
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
@@ -0,0 +1,37 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.service.rs;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import javax.servlet.http.HttpServletRequest;
+
+public class MockHttpServletRequest {
+ public StringBuffer url = new StringBuffer("http://localhost:8089/cmso/v1/ChangeManagement/schedules/");
+ public HttpServletRequest request = mock(HttpServletRequest.class);
+
+ MockHttpServletRequest() {
+
+ when(request.getRequestURL()).thenReturn(url);
+ when(request.getHeader("Authorization")).thenReturn("BasicbTEzODc3OnNjaGVkdWxlci1SMTgwMiE=");
+
+ }
+
+}
diff --git a/cmso-optimizer/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java b/cmso-optimizer/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
new file mode 100644
index 0000000..f91fc54
--- /dev/null
+++ b/cmso-optimizer/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
@@ -0,0 +1,48 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.utilities;
+
+import org.onap.optf.cmso.common.PropertiesManagement;
+
+/**
+ * The Class PropertiesAdmin.
+ */
+public class PropertiesAdmin {
+
+ /**
+ * The main method.
+ *
+ * @param args the arguments
+ */
+ public static void main(String[] args) {
+ if (args.length < 1) {
+ System.out.println("Missing argument");
+ return;
+ }
+ String value = "";
+ if (args[0].startsWith("dec:")) {
+ value = PropertiesManagement.getDecryptedValue(args[0].substring(4));
+ } else {
+ value = PropertiesManagement.getEncryptedValue(args[0]);
+ }
+ System.out.println(args[0] + " : " + value);
+ }
+
+}
diff --git a/cmso-robot/docker/Dockerfile b/cmso-robot/docker/Dockerfile
index b70c16b..aa41520 100644
--- a/cmso-robot/docker/Dockerfile
+++ b/cmso-robot/docker/Dockerfile
@@ -1,22 +1,51 @@
-FROM robotframework/rfdocker:3.1.1
+FROM ubuntu:16.04
MAINTAINER "CMSO"
LABEL name="Docker image for the CMSO Robot Testing Framework"
LABEL usage="docker run -e <testname> optf-cmso-robot"
+RUN apt-get update
+RUN apt-get install -y software-properties-common vim
+RUN add-apt-repository ppa:jonathonf/python-3.6
+RUN apt-get update
+RUN apt-get install -y build-essential python3.6 python3.6-dev python3-pip python3.6-venv
+
+# update pip
+RUN python3.6 -m pip install pip --upgrade
+RUN python3.6 -m pip install wheel
+
+RUN apt-get update \
+ && apt-get install \
+ --no-install-recommends \
+ --assume-yes \
+ chromium-browser \
+ chromium-chromedriver \
+ dnsutils \
+ git \
+ gcc
+
+
COPY /onap-cmso/robot /opt/cmso-robot/robot
COPY /onap-cmso/ete.sh /opt/cmso-robot
RUN chmod 777 /opt/cmso-robot/ete.sh
COPY /onap-cmso/server.py /opt/cmso-robot
+
+
+RUN ln -s /usr/bin/python3.6 /usr/bin/python
+RUN python --version
+RUN pip --version
+RUN pip install robotframework==3.1.1
+
RUN pip install Flask
+RUN pip install selenium
+RUN pip install robotframework-sshlibrary
+RUN pip install robotframework-requests
###Just to keep it running
CMD ["/usr/bin/python", "/opt/cmso-robot/server.py"]
### Use --entrypoint to override to run the tests test and exit
### --entrypoint /opt/cmso-robot/ete.sh
-
-
diff --git a/cmso-service/etc/config/cmso.properties b/cmso-service/etc/config/cmso.properties
index d4a78e8..e9bec86 100644
--- a/cmso-service/etc/config/cmso.properties
+++ b/cmso-service/etc/config/cmso.properties
@@ -52,9 +52,9 @@ spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.Ph
spring.jpa.hibernate.id.new_generator_mappings=false
hibernate.id.new_generator_mappings=false
-logging.level.org.hibernate.SQL=TRACE
+logging.level.org.hibernate.SQL=WARN
-logging.level.org.hibernate=TRACE
+logging.level.org.hibernate=WARN
#
cmso.aaf.enabled=false
diff --git a/cmso-service/etc/config/optimizer.properties b/cmso-service/etc/config/optimizer.properties
index db014d6..aa79e8a 100644
--- a/cmso-service/etc/config/optimizer.properties
+++ b/cmso-service/etc/config/optimizer.properties
@@ -29,6 +29,12 @@
# limitations under the License.
#-------------------------------------------------------------------------------
-cmso.optimizer.url=http://localhost:8080/cmso/v1/loopbacktest/optimizer
-cmso.optimizer.callbackurl=http://localhost:8080/cmso/v1/optimizerCallback
+## Loopback
+#cmso.optimizer.request.url=http://localhost:8080/cmso/v1/loopbacktest/optimize/schedule
+#cmso.optimizer.status.url=http://localhost:8080/cmso/v1/loopbacktest/optimize/schedule
+#cmso.optimizer.health.url=http://localhost:8080/cmso/v1/loopbacktest/optimize/schedule/health
+## Local optimizer service
+cmso.optimizer.request.url=http://127.0.0.1:7997/optimizer/v1/optimize/schedule
+cmso.optimizer.status.url=http://127.0.0.1:7997/optimizer/v1/optimize/schedule
+cmso.optimizer.health.url=http://127.0.0.1:7997/optimizer/v1/health?checkInterfaces=true
diff --git a/cmso-service/pom.xml b/cmso-service/pom.xml
index d64709e..3700d25 100644
--- a/cmso-service/pom.xml
+++ b/cmso-service/pom.xml
@@ -166,10 +166,6 @@
</dependency>
<dependency>
<groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
diff --git a/cmso-service/src/main/java/org/onap/observations/Mdc.java b/cmso-service/src/main/java/org/onap/observations/Mdc.java
index b00bed3..b9b30ea 100644
--- a/cmso-service/src/main/java/org/onap/observations/Mdc.java
+++ b/cmso-service/src/main/java/org/onap/observations/Mdc.java
@@ -1,32 +1,29 @@
/*
* Copyright © 2019 AT&T Intellectual Property.
- *
- * Licensed 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
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.observations;
import static com.att.eelf.configuration.Configuration.MDC_BEGIN_TIMESTAMP;
@@ -45,12 +42,12 @@ import static com.att.eelf.configuration.Configuration.MDC_STATUS_CODE;
import static com.att.eelf.configuration.Configuration.MDC_TARGET_ENTITY;
import static com.att.eelf.configuration.Configuration.MDC_TARGET_SERVICE_NAME;
+import com.att.eelf.utils.Stopwatch;
import java.net.InetAddress;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
-
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
@@ -58,191 +55,261 @@ import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response.StatusType;
-
import org.onap.optf.cmso.filters.MessageHeaders.HeadersEnum;
import org.quartz.JobExecutionContext;
import org.slf4j.MDC;
-import com.att.eelf.utils.Stopwatch;
-
/**
- * ECOMP EELF logging MDC fields not defined in the MDC Configuration (i.e.
- * MDC_ALERT_SEVERITY)
+ * ECOMP EELF logging MDC fields not defined in the MDC Configuration (i.e. MDC_ALERT_SEVERITY)
**/
public class Mdc {
- public static final String SERVICE_NAME = "CSS-Scheduler";
- public enum Enum {
- // BeginTimestamp,
- // EndTimeStamp,
- // RequestId,
- // ServiceInstanceId,
- VirtualServerName,
- // ServiceName,
- // PartnerName,
- // StatusCOde,
- // ResponseCode,
- // ResponseDescription,
- // InstanceUUID,
- // AlertSeverity,
- // ServerIPAddress,
- // ElapsedTime,
- // ServerFQDN,
- // RemoteHost,
- ClassName, Unused,
- // ProcessKey,
- CustomField1, CustomField2, CustomField3, CustomField4,
- // TargetVirtualEntity,
- // TargetEntity,
- // TargetServiceName,
- ErrorCode, ErrorDescription, Timer,
- }
-
- public static String getCaller(int back)
- {
- StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
- return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName();
- }
-
- public static void setCaller(int back)
- {
- String caller = MDC.get(Enum.ClassName.name());
- if (caller == null)
- MDC.put(Enum.ClassName.name(), getCaller(back));
- }
-
- public static void setObservation(ObservationInterface o)
- {
- MDC.put(Enum.CustomField4.name(), o.name());
- }
-
- public static void clearCaller()
- {
- MDC.remove(Enum.ClassName.name());
- }
-
- public static void quartzJobBegin(JobExecutionContext context)
- {
- MDC.clear();
- MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(MDC_INSTANCE_UUID, UUID.randomUUID().toString());
- try{ MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName()); } catch (Exception e){ MDC.put(MDC_SERVER_FQDN, e.getMessage());}
- try{ MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress()); } catch (Exception e){ MDC.put(MDC_SERVER_FQDN, e.getMessage());}
- MDC.put(MDC_SERVICE_INSTANCE_ID, "UNKNOWN");
- MDC.put(MDC_SERVICE_NAME, SERVICE_NAME);
- MDC.put(Enum.ClassName.name(), getCaller(3));
- }
-
- public static void quartzJobEnd(JobExecutionContext context)
- {
- MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(Enum.ClassName.name(), getCaller(3));
- }
-
- public static Map<String, String> save()
- {
- Map<String, String> save = MDC.getCopyOfContextMap();
- return save;
- }
-
- public static void restore(Map<String, String> mdcSave)
- {
- MDC.clear();
- for (String name : mdcSave.keySet())
- MDC.put(name, mdcSave.get(name));
- }
-
-
-
- public static void setRequestIdIfNotSet(String requestId) {
- if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals(""))
- {
- setRequestId(requestId);
- }
- }
-
- public static void setRequestId(String requestId) {
- MDC.put(MDC_KEY_REQUEST_ID, requestId);
- }
-
- public static void metricStart(ClientRequestContext requestContext) {
- MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
- setPartnerTargetFromUri(requestContext.getUri());
- }
-
- public static void metricEnd(ClientResponseContext response)
- {
-
- Date now = new Date();
- //MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- setResponseInfo(response.getStatusInfo());
-
- }
- public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest)
- {
- MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
- MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost());
- MDC.put(Enum.ClassName.name(), getCaller(4));
- MultivaluedMap<String, String> headers = requestContext.getHeaders();
- String transactionId = (String) headers.getFirst(HeadersEnum.TransactionID.toString());
- if (transactionId != null)
- {
- setRequestId(transactionId);
- }
- else
- {
- setRequestId(UUID.randomUUID().toString());
- }
-
- }
-
- public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response)
- {
- Date now = new Date();
- //MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- MDC.put(Enum.ClassName.name(), getCaller(4));
-
- setResponseInfo(response.getStatusInfo());
-
- }
-
- private static void setResponseInfo(StatusType statusInfo)
- {
- Integer status = statusInfo.getStatusCode();
- String completed = "ERROR";
- if (status >=200 && status < 300)
- {
- completed = "COMPLETE";
- }
- MDC.put(MDC_RESPONSE_CODE, status.toString());
- MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase());
- MDC.put(MDC_STATUS_CODE, completed);
- }
-
- public static void setEvent(String requestID) {
- MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
- setRequestId(requestID);
- }
-
- private static void setPartnerTargetFromUri(URI uri)
- {
- try
- {
- MDC.put(MDC_PARTNER_NAME, uri.getHost());
- MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort());
- MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath());
- }
- catch (Exception e)
- {
- MDC.put(MDC_PARTNER_NAME, "UNKNOWN");
- MDC.put(MDC_TARGET_ENTITY, "UNKNOWN");
- MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN");
- }
- }
-
-
-} \ No newline at end of file
+
+ /** The Constant SERVICE_NAME. */
+ public static final String SERVICE_NAME = "CSS-Scheduler";
+
+ /**
+ * The Enum Enum.
+ */
+ public enum Enum {
+ // BeginTimestamp,
+ // EndTimeStamp,
+ // RequestId,
+ // ServiceInstanceId,
+ VirtualServerName,
+ // ServiceName,
+ // PartnerName,
+ // StatusCOde,
+ // ResponseCode,
+ // ResponseDescription,
+ // InstanceUUID,
+ // AlertSeverity,
+ // ServerIPAddress,
+ // ElapsedTime,
+ // ServerFQDN,
+ // RemoteHost,
+ ClassName, Unused,
+ // ProcessKey,
+ CustomField1, CustomField2, CustomField3, CustomField4,
+ // TargetVirtualEntity,
+ // TargetEntity,
+ // TargetServiceName,
+ ErrorCode, ErrorDescription, Timer,
+ }
+
+ /**
+ * Gets the caller.
+ *
+ * @param back the back
+ * @return the caller
+ */
+ public static String getCaller(int back) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
+ return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName();
+ }
+
+ /**
+ * Sets the caller.
+ *
+ * @param back the new caller
+ */
+ public static void setCaller(int back) {
+ String caller = MDC.get(Enum.ClassName.name());
+ if (caller == null)
+ {
+ MDC.put(Enum.ClassName.name(), getCaller(back));
+ }
+ }
+
+ /**
+ * Sets the observation.
+ *
+ * @param obs the new observation
+ */
+ public static void setObservation(ObservationInterface obs) {
+ MDC.put(Enum.CustomField4.name(), obs.name());
+ }
+
+ /**
+ * Clear caller.
+ */
+ public static void clearCaller() {
+ MDC.remove(Enum.ClassName.name());
+ }
+
+ /**
+ * Quartz job begin.
+ *
+ * @param context the context
+ */
+ public static void quartzJobBegin(JobExecutionContext context) {
+ MDC.clear();
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_INSTANCE_UUID, UUID.randomUUID().toString());
+ try {
+ MDC.put(MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
+ } catch (Exception e) {
+ MDC.put(MDC_SERVER_FQDN, e.getMessage());
+ }
+ try {
+ MDC.put(MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ MDC.put(MDC_SERVER_FQDN, e.getMessage());
+ }
+ MDC.put(MDC_SERVICE_INSTANCE_ID, "UNKNOWN");
+ MDC.put(MDC_SERVICE_NAME, SERVICE_NAME);
+ MDC.put(Enum.ClassName.name(), getCaller(3));
+ }
+
+ /**
+ * Quartz job end.
+ *
+ * @param context the context
+ */
+ public static void quartzJobEnd(JobExecutionContext context) {
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(Enum.ClassName.name(), getCaller(3));
+ }
+
+ /**
+ * Save.
+ *
+ * @return the map
+ */
+ public static Map<String, String> save() {
+ Map<String, String> save = MDC.getCopyOfContextMap();
+ return save;
+ }
+
+ /**
+ * Restore.
+ *
+ * @param mdcSave the mdc save
+ */
+ public static void restore(Map<String, String> mdcSave) {
+ MDC.clear();
+ for (String name : mdcSave.keySet())
+ {
+ MDC.put(name, mdcSave.get(name));
+ }
+ }
+
+
+
+ /**
+ * Sets the request id if not set.
+ *
+ * @param requestId the new request id if not set
+ */
+ public static void setRequestIdIfNotSet(String requestId) {
+ if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals("")) {
+ setRequestId(requestId);
+ }
+ }
+
+ /**
+ * Sets the request id.
+ *
+ * @param requestId the new request id
+ */
+ public static void setRequestId(String requestId) {
+ MDC.put(MDC_KEY_REQUEST_ID, requestId);
+ }
+
+ /**
+ * Metric start.
+ *
+ * @param requestContext the request context
+ */
+ public static void metricStart(ClientRequestContext requestContext) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setPartnerTargetFromUri(requestContext.getUri());
+ }
+
+ /**
+ * Metric end.
+ *
+ * @param response the response
+ */
+ public static void metricEnd(ClientResponseContext response) {
+
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ /**
+ * Audit start.
+ *
+ * @param requestContext the request context
+ * @param servletRequest the servlet request
+ */
+ public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost());
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId != null) {
+ setRequestId(transactionId);
+ } else {
+ setRequestId(UUID.randomUUID().toString());
+ }
+
+ }
+
+ /**
+ * Audit end.
+ *
+ * @param requestContext the request context
+ * @param response the response
+ */
+ public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response) {
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ private static void setResponseInfo(StatusType statusInfo) {
+ Integer status = statusInfo.getStatusCode();
+ String completed = "ERROR";
+ if (status >= 200 && status < 300) {
+ completed = "COMPLETE";
+ }
+ MDC.put(MDC_RESPONSE_CODE, status.toString());
+ MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase());
+ MDC.put(MDC_STATUS_CODE, completed);
+ }
+
+ /**
+ * Sets the event.
+ *
+ * @param requestId the new event
+ */
+ public static void setEvent(String requestId) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setRequestId(requestId);
+ }
+
+ private static void setPartnerTargetFromUri(URI uri) {
+ try {
+ MDC.put(MDC_PARTNER_NAME, uri.getHost());
+ MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort());
+ MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath());
+ } catch (Exception e) {
+ MDC.put(MDC_PARTNER_NAME, "UNKNOWN");
+ MDC.put(MDC_TARGET_ENTITY, "UNKNOWN");
+ MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN");
+ }
+ }
+
+
+}
diff --git a/cmso-service/src/main/java/org/onap/observations/Observation.java b/cmso-service/src/main/java/org/onap/observations/Observation.java
index 39bc3ca..3d2d176 100644
--- a/cmso-service/src/main/java/org/onap/observations/Observation.java
+++ b/cmso-service/src/main/java/org/onap/observations/Observation.java
@@ -1,126 +1,129 @@
/*
* Copyright © 2019 AT&T Intellectual Property.
- *
- * Licensed 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
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.observations;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import org.apache.log4j.Level;
import org.onap.optf.cmso.Application;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
+/**
+ * The Class Observation.
+ */
+public class Observation {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+ private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
+ private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param execpt the e
+ * @param arguments the arguments
+ */
+ // *************************************************************************************************
+ public static void report(ObservationInterface obs, Exception execpt, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, execpt, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, execpt, arguments);
+ }
+ Level lev = obs.getLevel();
+ switch (lev.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, execpt, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.trace(obs, execpt, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, execpt, arguments);
+ break;
+ default:
+ log.info(obs, execpt, arguments);
+ }
+ Mdc.clearCaller();
+ }
-public class Observation
-{
- private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
- private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
- private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
- private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
- private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
-
- //*************************************************************************************************
- public static void report(ObservationInterface o, Exception e, String ...arguments)
- {
- Mdc.setCaller(4);
- Mdc.setObservation(o);
- if (o.getAudit())
- {
- audit.info(o, e, arguments);
- }
- if (o.getMetric())
- {
- metrics.info(o, e, arguments);
- }
- Level l = o.getLevel();
- switch (l.toInt())
- {
- case Level.WARN_INT:
- errors.warn(o, arguments);
- debug.debug(o, e, arguments);
- break;
- case Level.INFO_INT:
- log.info(o, e, arguments);
- debug.debug(o, e, arguments);
- break;
- case Level.ERROR_INT:
- errors.error(o, arguments);
- debug.debug(o, e, arguments);
- break;
- case Level.TRACE_INT:
- debug.trace(o, e, arguments);
- break;
- case Level.DEBUG_INT:
- debug.debug(o, e, arguments);
- break;
- default:
- log.info(o, e, arguments);
- }
- Mdc.clearCaller();
- }
-
- public static void report(ObservationInterface o, String ...arguments)
- {
- Mdc.setCaller(4);
- Mdc.setObservation(o);
- if (o.getAudit())
- {
- audit.info(o, arguments);
- }
- if (o.getMetric())
- {
- metrics.info(o, arguments);
- }
- Level l = o.getLevel();
- switch (l.toInt())
- {
- case Level.WARN_INT:
- errors.warn(o, arguments);
- debug.debug(o, arguments);
- break;
- case Level.INFO_INT:
- log.info(o, arguments);
- debug.debug(o, arguments);
- break;
- case Level.ERROR_INT:
- errors.error(o, arguments);
- debug.debug(o, arguments);
- break;
- case Level.TRACE_INT:
- debug.debug(o, arguments);
- break;
- case Level.DEBUG_INT:
- debug.debug(o, arguments);
- break;
- default:
- log.info(o, arguments);
- }
- Mdc.clearCaller();
- }
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param arguments the arguments
+ */
+ public static void report(ObservationInterface obs, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, arguments);
+ }
+ Level levl = obs.getLevel();
+ switch (levl.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.debug(obs, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, arguments);
+ break;
+ default:
+ log.info(obs, arguments);
+ }
+ Mdc.clearCaller();
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/observations/ObservationInterface.java b/cmso-service/src/main/java/org/onap/observations/ObservationInterface.java
index 16305bc..0dce93d 100644
--- a/cmso-service/src/main/java/org/onap/observations/ObservationInterface.java
+++ b/cmso-service/src/main/java/org/onap/observations/ObservationInterface.java
@@ -1,48 +1,49 @@
/*
* Copyright © 2019 AT&T Intellectual Property.
- *
- * Licensed 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
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.observations;
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
import javax.ws.rs.core.Response.Status;
-
import org.apache.log4j.Level;
-import com.att.eelf.i18n.EELFResolvableErrorEnum;
+public interface ObservationInterface extends EELFResolvableErrorEnum {
+ public Enum<?> getValue();
+
+ public Level getLevel();
+
+ public String getMessage();
+
+ public Status getStatus();
+
+ public String getDomain();
+
+ public String name();
+
+ public Boolean getAudit();
-public interface ObservationInterface extends EELFResolvableErrorEnum
-{
- public Enum<?> getValue();
- public Level getLevel();
- public String getMessage();
- public Status getStatus();
- public String getDomain();
- public String name();
- public Boolean getAudit();
- public Boolean getMetric();
-} \ No newline at end of file
+ public Boolean getMetric();
+}
diff --git a/cmso-service/src/main/java/org/onap/observations/ObservationObject.java b/cmso-service/src/main/java/org/onap/observations/ObservationObject.java
index 639db76..17bd939 100644
--- a/cmso-service/src/main/java/org/onap/observations/ObservationObject.java
+++ b/cmso-service/src/main/java/org/onap/observations/ObservationObject.java
@@ -1,109 +1,198 @@
/*
* Copyright © 2019 AT&T Intellectual Property.
- *
- * Licensed 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
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.observations;
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
import javax.ws.rs.core.Response.Status;
-
import org.apache.log4j.Level;
-import com.att.eelf.i18n.EELFResolvableErrorEnum;
-import com.att.eelf.i18n.EELFResourceManager;
+/**
+ * The Class ObservationObject.
+ */
+public class ObservationObject implements ObservationInterface {
+
+ // *************************************************************************************************
+ // Interface class that matches the ObservationInteface pattern
+ // This will be used in case we decide to provide external overrides and we need to instantiate
+ // For now, we'll just use the Enum itself.
+ //
+ //
+ private Enum<?> value = null;
+
+ private Level level = null;;
+ private String message = null;
+ private Status status = null;
+ private String domain = null;
+ private Boolean metric = false;
+ private Boolean audit = false;
+
+ /**
+ * Instantiates a new observation object.
+ *
+ * @param obs the o
+ */
+ public ObservationObject(ObservationInterface obs) {
+ this.value = obs.getValue();
+ this.level = obs.getLevel();
+ this.message = obs.getMessage();
+ this.status = obs.getStatus();
+ this.domain = obs.getDomain();
+ this.metric = obs.getMetric();
+ this.audit = obs.getAudit();
+
+ }
+
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ @Override
+ public Enum<?> getValue() {
+ return value;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @return the message
+ */
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
+ @Override
+ public String getDomain() {
+ return domain;
+ }
+
+ /**
+ * Gets the level.
+ *
+ * @return the level
+ */
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ /**
+ * Name.
+ *
+ * @return the string
+ */
+ @Override
+ public String name() {
+ return value.name();
+ }
+
+ /**
+ * Gets the audit.
+ *
+ * @return the audit
+ */
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ /**
+ * Gets the metric.
+ *
+ * @return the metric
+ */
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @param arguments the arguments
+ * @return the message
+ */
+ public String getMessagef(String... arguments) {
+ return EELFResourceManager.format((EELFResolvableErrorEnum) value, arguments);
+ }
+
+ /**
+ * Sets the value.
+ *
+ * @param value the new value
+ */
+ public void setValue(Enum<?> value) {
+ this.value = value;
+ }
+
+ /**
+ * Sets the level.
+ *
+ * @param level the new level
+ */
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ /**
+ * Sets the message.
+ *
+ * @param message the new message
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
-public class ObservationObject implements ObservationInterface
-{
-
- //*************************************************************************************************
- // Interface class that matches the ObservationInteface pattern
- // This will be used in case we decide to provide external overrides and we need to instantiate
- // For now, we'll just use the Enum itself.
- //
- //
- private Enum<?> value = null;
- private Level level = null;;
- private String message = null;
- private Status status = null;
- private String domain = null;
- private Boolean metric = false;
- private Boolean audit = false;
- public ObservationObject(ObservationInterface o)
- {
- this.value = o.getValue();
- this.level = o.getLevel();
- this.message = o.getMessage();
- this.status = o.getStatus();
- this.domain = o.getDomain();
- this.metric = o.getMetric();
- this.audit = o.getAudit();
-
- }
- public Enum<?> getValue() {return value;}
- @Override
- public String getMessage() {return message;}
- @Override
- public Status getStatus() {return status;}
- @Override
- public String getDomain() {return domain;}
-
- @Override
- public Level getLevel() {
- return level;
- }
- @Override
- public String name() {
- return value.name();
- }
- @Override
- public Boolean getAudit() {
- return audit;
- }
- @Override
- public Boolean getMetric() {
- return metric;
- }
-
- public String getMessage(String ...arguments) {
- return EELFResourceManager.format((EELFResolvableErrorEnum)value, arguments);
- }
- public void setValue(Enum<?> value) {
- this.value = value;
- }
- public void setLevel(Level level) {
- this.level = level;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- public void setStatus(Status status) {
- this.status = status;
- }
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
+ public void setStatus(Status status) {
+ this.status = status;
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/Application.java b/cmso-service/src/main/java/org/onap/optf/cmso/Application.java
index f0580bd..42e86f2 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/Application.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/Application.java
@@ -1,33 +1,19 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso;
@@ -97,7 +83,6 @@ public class Application extends SpringBootServletInitializer {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
int port = Integer.parseInt(dispatchPort);
tomcat.addAdditionalTomcatConnectors(createStandardConnector(port));
- org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter ss = null;
return tomcat;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java b/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java
index aad3104..04a93d8 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java
@@ -1,33 +1,19 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed 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.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso;
@@ -41,7 +27,7 @@ import com.att.eelf.configuration.EELFManager;
/**
* This class makes it possible to use @Autowired references in QuartzJobBeans.
- *
+ *
* Also enables @Autowire of the SchedulerFactoryBean the add Triggers
* for @Autowired QuartzJobBeans for ChangeManagement events. Making a big
* investment in SpringBoot Quartz. It had better work ;-)
@@ -50,7 +36,7 @@ import com.att.eelf.configuration.EELFManager;
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
private static EELFLogger log = EELFManager.getInstance().getLogger(AutowiringSpringBeanJobFactory.class);
- private transient AutowireCapableBeanFactory beanFactory;
+ private AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext context) {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java b/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
index e5aca31..2de080e 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
@@ -1,33 +1,19 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso;
@@ -48,7 +34,7 @@ public class CMSEnvironmentPostProcessor implements EnvironmentPostProcessor {
String pwd = environment.getProperty("cmso.database.password");
if (pwd != null) {
pwd = PropertiesManagement.getDecryptedValue(pwd);
- Map<String, Object> map = new HashMap<String, Object>();
+ Map<String, Object> map = new HashMap<>();
map.put("spring.datasource.password", pwd);
MapPropertySource propertySource = new MapPropertySource("abc", map);
MutablePropertySources proeprtySources = environment.getPropertySources();
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java b/cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java
index 9189326..46db256 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java
@@ -40,10 +40,10 @@ import org.glassfish.jersey.logging.LoggingFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.servlet.ServletProperties;
import org.onap.optf.cmso.dispatcher.rs.DispatcherServiceImpl;
-import org.onap.optf.cmso.filters.CMSOContainerFilters;
+import org.onap.optf.cmso.filters.CmsoContainerFilters;
import org.onap.optf.cmso.service.rs.AdminToolImpl;
-import org.onap.optf.cmso.service.rs.CMSOOptimizerCallbackImpl;
-import org.onap.optf.cmso.service.rs.CMSOServiceImpl;
+import org.onap.optf.cmso.service.rs.CmsoOptimizerCallbackImpl;
+import org.onap.optf.cmso.service.rs.CmsoServiceImpl;
import org.onap.optf.cmso.service.rs.HealthCheckImpl;
import org.onap.optf.cmso.test.loopback.SchedulerTestLoopbackServiceImpl;
import org.onap.optf.cmso.test.loopback.TicketMgtLoopbackServiceImpl;
@@ -75,8 +75,8 @@ public class JerseyConfiguration extends ResourceConfig {
@Autowired
public JerseyConfiguration( /* LogRequestFilter lrf */ ) {
- register(CMSOServiceImpl.class);
- register(CMSOOptimizerCallbackImpl.class);
+ register(CmsoServiceImpl.class);
+ register(CmsoOptimizerCallbackImpl.class);
register(SchedulerTestLoopbackServiceImpl.class);
register(TicketMgtLoopbackServiceImpl.class);
register(HealthCheckImpl.class);
@@ -89,7 +89,7 @@ public class JerseyConfiguration extends ResourceConfig {
// TODO: Examine which logging features to enable
register(new LoggingFeature(log));
- register(CMSOContainerFilters.class);
+ register(CmsoContainerFilters.class);
}
@Bean
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
index 25a1e77..f3b36f5 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
@@ -1,32 +1,40 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.optf.cmso
- * ================================================================================
- * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
* Licensed 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
- *
+ *
+ * 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.
- * ============LICENSE_END=========================================================
- */
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.aaf;
import java.io.IOException;
import java.util.List;
-
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
import org.onap.aaf.cadi.CadiWrap;
import org.onap.aaf.cadi.Permission;
import org.onap.observations.Observation;
@@ -39,53 +47,46 @@ import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
/**
- * AAF authorization filter
+ * AAF authorization filter.
*/
@Component
@Profile(SpringProfiles.AAF_AUTHENTICATION)
-public class AafAuthorizationFilter extends OrderedRequestContextFilter {
+public class AafAuthorizationFilter extends OrderedRequestContextFilter {
- @Autowired
- AafUserRoleProperties userRoleProperties;
-
+ @Autowired
+ AafUserRoleProperties userRoleProperties;
+
+ /**
+ * Instantiates a new aaf authorization filter.
+ */
public AafAuthorizationFilter() {
this.setOrder(FilterPriority.AAF_AUTHORIZATION.getPriority());
-
+
}
@Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
- try
- {
- if (request instanceof CadiWrap)
- {
- CadiWrap cw = (CadiWrap)request;
- List<Permission> perms = cw.getPermissions(cw.getUserPrincipal());
- if (userRoleProperties.processPermissions(request, perms))
- {
- filterChain.doFilter(request,response);
- }
- else
- {
- Observation.report(LogMessages.UNAUTHORIZED);
- ResponseFormatter.errorResponse(request, response,
- new CMSException(LogMessages.UNAUTHORIZED.getStatus(),
- LogMessages.UNAUTHORIZED, ""));
- }
- }
- else
- {
- throw new Exception();
- }
- }
- catch (Exception e)
- {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- ResponseFormatter.errorResponse(request, response,
- new CMSException(LogMessages.UNAUTHORIZED.getStatus(),
- LogMessages.UNAUTHORIZED, ""));
- }
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ try {
+ if (request instanceof CadiWrap) {
+ CadiWrap cw = (CadiWrap) request;
+ List<Permission> perms = cw.getPermissions(cw.getUserPrincipal());
+ if (userRoleProperties.processPermissions(request, perms)) {
+ filterChain.doFilter(request, response);
+ } else {
+ Observation.report(LogMessages.UNAUTHORIZED);
+ ResponseFormatter.errorResponse(request, response, new CMSException(
+ LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
+ } else {
+ throw new Exception();
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ ResponseFormatter.errorResponse(request, response,
+ new CMSException(LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
}
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
index 1bdebdd..586822f 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
@@ -1,33 +1,41 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.optf.cmso
- * ================================================================================
- * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
* Licensed 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
+ * 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.
- * ============LICENSE_END=========================================================
- */
-package org.onap.optf.cmso.aaf;
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.aaf;
import java.io.IOException;
import java.util.Properties;
-
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
import org.onap.aaf.cadi.PropAccess;
import org.onap.aaf.cadi.filter.CadiFilter;
import org.onap.observations.Observation;
@@ -40,7 +48,7 @@ import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
/**
- * AAF authentication filter
+ * AAF authentication filter.
*/
@Component
@@ -49,6 +57,12 @@ public class AafFilter extends OrderedRequestContextFilter {
private final CadiFilter cadiFilter;
+ /**
+ * Instantiates a new aaf filter.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws ServletException the servlet exception
+ */
public AafFilter() throws IOException, ServletException {
Properties cadiProperties = new Properties();
cadiProperties.load(Application.class.getClassLoader().getResourceAsStream("cadi.properties"));
@@ -57,13 +71,13 @@ public class AafFilter extends OrderedRequestContextFilter {
}
@Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
cadiFilter.doFilter(request, response, filterChain);
- if(response.getStatus() ==401){
- Observation.report(LogMessages.UNAUTHENTICATED);
- ResponseFormatter.errorResponse(request, response,
- new CMSException(LogMessages.UNAUTHENTICATED.getStatus(),
- LogMessages.UNAUTHENTICATED, ""));
+ if (response.getStatus() == 401) {
+ Observation.report(LogMessages.UNAUTHENTICATED);
+ ResponseFormatter.errorResponse(request, response,
+ new CMSException(LogMessages.UNAUTHENTICATED.getStatus(), LogMessages.UNAUTHENTICATED, ""));
}
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
index ea9d324..db58156 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
@@ -1,78 +1,137 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.optf.cmso
- * ================================================================================
- * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed 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
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * 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
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- * ============LICENSE_END=========================================================
- */
+ ******************************************************************************/
+
package org.onap.optf.cmso.aaf;
import java.util.HashSet;
import java.util.Set;
-
import org.onap.aaf.cadi.aaf.AAFPermission;
-public class AafPerm
-{
- private String type;
- private String instance;
- private String action;
- private Set<String> actions = new HashSet<>();
-
- public String getAction() {
- return action;
- }
- public void setAction(String action) {
- this.action = action;
- String list[] = action.split(",");
- for (String a : list)
- actions.add(a);
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
- public String getInstance() {
- return instance;
- }
- public void setInstance(String instance) {
- this.instance = instance;
- }
-
- public Set<String> getActions() {
- return actions;
- }
- public void setActions(Set<String> actions) {
- this.actions = actions;
- }
- public boolean matches(AAFPermission userPerm)
- {
- if (type.equals(userPerm.getType()))
- {
- if (userPerm.getInstance().equals("*") || instance.equals("*") || userPerm.getInstance().equals(instance))
- {
- for (String userAction : userPerm.getAction().split(","))
- {
- if (userAction.equals("*") || actions.contains("*") || actions.contains(userAction))
- return true;
- }
- }
- }
- return false;
- }
+/**
+ * The Class AafPerm.
+ */
+public class AafPerm {
+ private String type;
+ private String instance;
+ private String action;
+ private Set<String> actions = new HashSet<>();
+
+ /**
+ * Gets the action.
+ *
+ * @return the action
+ */
+ public String getAction() {
+ return action;
+ }
+
+ /**
+ * Sets the action.
+ *
+ * @param action the new action
+ */
+ public void setAction(String action) {
+ this.action = action;
+ String[] list = action.split(",");
+ for (String a : list) {
+ actions.add(a);
+ }
+ }
+
+ /**
+ * Gets the type.
+ *
+ * @return the type
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * Sets the type.
+ *
+ * @param type the new type
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * Gets the single instance of AafPerm.
+ *
+ * @return single instance of AafPerm
+ */
+ public String getInstance() {
+ return instance;
+ }
+
+ /**
+ * Sets the instance.
+ *
+ * @param instance the new instance
+ */
+ public void setInstance(String instance) {
+ this.instance = instance;
+ }
+
+ /**
+ * Gets the actions.
+ *
+ * @return the actions
+ */
+ public Set<String> getActions() {
+ return actions;
+ }
+
+ /**
+ * Sets the actions.
+ *
+ * @param actions the new actions
+ */
+ public void setActions(Set<String> actions) {
+ this.actions = actions;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param userPerm the user perm
+ * @return true, if successful
+ */
+ public boolean matches(AAFPermission userPerm) {
+ if (type.equals(userPerm.getType())) {
+ if (userPerm.getInstance().equals("*") || instance.equals("*") || userPerm.getInstance().equals(instance)) {
+ for (String userAction : userPerm.getAction().split(",")) {
+ if (userAction.equals("*") || actions.contains("*") || actions.contains(userAction)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
index cb00a90..068e6c3 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
@@ -1,32 +1,33 @@
/*
* Copyright © 2019 AT&T Intellectual Property.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* 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.onap.optf.cmso.aaf;
import org.onap.optf.cmso.SpringProfiles;
@@ -43,17 +44,17 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur
@ComponentScan("org.onap.optf")
@Profile(SpringProfiles.AAF_AUTHENTICATION)
public class AafSecurityConfig extends WebSecurityConfigurerAdapter {
-
-
+
+
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
-
+
}
-
+
@Override
protected void configure(HttpSecurity http) throws Exception {
-
+
http.csrf().disable();
-
+
}
} \ No newline at end of file
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
index 762cf3c..f9351b2 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
@@ -1,127 +1,177 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.optf.cmso
- * ================================================================================
- * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed 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
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * https://creativecommons.org/licenses/by/4.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
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- * ============LICENSE_END=========================================================
- */
+ ******************************************************************************/
+
package org.onap.optf.cmso.aaf;
import java.util.ArrayList;
import java.util.List;
-public class AafUserRole
-{
- private String url = "";
- private String pathParts[] = {};
- private String perm = "";
- private String method = "";
- private List<AafPerm> aafPerms = new ArrayList<>();
-
- public AafUserRole(String url, String perm)
- {
- this.setUrl(url);
- this.setPerm(perm);
- pathParts = url.split("\\/");
-
- String[] perms = perm.split(",");
- for (String p : perms)
- {
- String parts[] = p.split(" ");
- if (parts.length == 2)
- method = parts[1];
- else
- method = "ALL";
-
- String[] list = parts[0].split("\\|");
- if (list.length == 3)
- {
- AafPerm aafPerm = new AafPerm();
- aafPerm.setAction(list[2]);
- aafPerm.setInstance(list[1]);
- aafPerm.setType(list[0]);
- aafPerms.add(aafPerm);
- }
- }
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public String getPerm() {
- return perm;
- }
- public void setPerm(String perm) {
- this.perm = perm;
- }
- public List<AafPerm> getAafPerms() {
- return aafPerms;
- }
- public void setAafPerms(List<AafPerm> aafPerms) {
- this.aafPerms = aafPerms;
- }
-
- public boolean matches(String path, String matchMethod)
- {
- if (!this.method.equalsIgnoreCase("ALL")
- && !this.method.equals("*")
- && !this.method.equals(matchMethod))
- return false;
- List<String> inNodes = new ArrayList<>();
- List<String> matchNodes = new ArrayList<>();
- String[] pathList = path.split("\\/");
- for (String n : pathList)
- {
- inNodes.add(n);
- }
- for (String n : pathParts)
- {
- matchNodes.add(n);
- }
-
- while (!inNodes.isEmpty() && !matchNodes.isEmpty())
- {
- String inNode = inNodes.remove(0);
- String matchNode = matchNodes.get(0);
- if (matchNode.equals(inNode) || matchNode.equals("*"))
- {
- matchNodes.remove(0);
- }
- else
- {
- if (!matchNode.equals("**"))
- {
- return false;
- }
- }
- }
-
- //
- if (inNodes.isEmpty() && matchNodes.isEmpty())
- return true;
-
- // We have incoming nodes remaining, see if we can wildcard them
- if (matchNodes.size() == 1)
- {
- if (matchNodes.get(0).equals("**"))
- return true;
- if (inNodes.size() == 1 && matchNodes.get(0).equals("*"))
- return true;
- }
- return false;
- }
+/**
+ * The Class AafUserRole.
+ */
+public class AafUserRole {
+ private String url = "";
+ private String pathParts[] = {};
+ private String perm = "";
+ private String method = "";
+ private List<AafPerm> aafPerms = new ArrayList<>();
+
+ /**
+ * Instantiates a new aaf user role.
+ *
+ * @param url the url
+ * @param perm the perm
+ */
+ public AafUserRole(String url, String perm) {
+ this.setUrl(url);
+ this.setPerm(perm);
+ pathParts = url.split("\\/");
+
+ String[] perms = perm.split(",");
+ for (String p : perms) {
+ String[] parts = p.split(" ");
+ if (parts.length == 2) {
+ method = parts[1];
+ }
+ else {
+ method = "ALL";
+ }
+
+ String[] list = parts[0].split("\\|");
+ if (list.length == 3) {
+ AafPerm aafPerm = new AafPerm();
+ aafPerm.setAction(list[2]);
+ aafPerm.setInstance(list[1]);
+ aafPerm.setType(list[0]);
+ aafPerms.add(aafPerm);
+ }
+ }
+ }
+
+ /**
+ * Gets the url.
+ *
+ * @return the url
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ /**
+ * Sets the url.
+ *
+ * @param url the new url
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * Gets the perm.
+ *
+ * @return the perm
+ */
+ public String getPerm() {
+ return perm;
+ }
+
+ /**
+ * Sets the perm.
+ *
+ * @param perm the new perm
+ */
+ public void setPerm(String perm) {
+ this.perm = perm;
+ }
+
+ /**
+ * Gets the aaf perms.
+ *
+ * @return the aaf perms
+ */
+ public List<AafPerm> getAafPerms() {
+ return aafPerms;
+ }
+
+ /**
+ * Sets the aaf perms.
+ *
+ * @param aafPerms the new aaf perms
+ */
+ public void setAafPerms(List<AafPerm> aafPerms) {
+ this.aafPerms = aafPerms;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param path the path
+ * @param matchMethod the match method
+ * @return true, if successful
+ */
+ public boolean matches(String path, String matchMethod) {
+ if (!this.method.equalsIgnoreCase("ALL") && !this.method.equals("*") && !this.method.equals(matchMethod)) {
+ return false;
+ }
+ List<String> inNodes = new ArrayList<>();
+ List<String> matchNodes = new ArrayList<>();
+ String[] pathList = path.split("\\/");
+ for (String n : pathList) {
+ inNodes.add(n);
+ }
+ for (String n : pathParts) {
+ matchNodes.add(n);
+ }
+
+ while (!inNodes.isEmpty() && !matchNodes.isEmpty()) {
+ String inNode = inNodes.remove(0);
+ String matchNode = matchNodes.get(0);
+ if (matchNode.equals(inNode) || matchNode.equals("*")) {
+ matchNodes.remove(0);
+ } else {
+ if (!matchNode.equals("**")) {
+ return false;
+ }
+ }
+ }
+
+ //
+ if (inNodes.isEmpty() && matchNodes.isEmpty()) {
+ return true;
+ }
+
+ // We have incoming nodes remaining, see if we can wildcard them
+ if (matchNodes.size() == 1) {
+ if (matchNodes.get(0).equals("**")) {
+ return true;
+ }
+ if (inNodes.size() == 1 && matchNodes.get(0).equals("*")) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
index 7a7598d..d9a419d 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
@@ -1,33 +1,43 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.optf.cmso
- * ================================================================================
- * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
* Licensed 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
+ * 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.
- * ============LICENSE_END=========================================================
- */
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.aaf;
+import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
-
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
-
import org.onap.aaf.cadi.Permission;
import org.onap.aaf.cadi.aaf.AAFPermission;
import org.onap.observations.Observation;
@@ -38,91 +48,92 @@ import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
-import com.fasterxml.jackson.databind.ObjectMapper;
/**
- *
- * This class uses a properties file to map URL patterns/method to AAF Permissions (AafPerm)
+ * This class uses a properties file to map URL patterns/method to AAF Permissions (AafPerm).
+ *
* @author jf9860
*
*/
@Component
@Profile(SpringProfiles.AAF_AUTHENTICATION)
-public class AafUserRoleProperties
-{
- @Autowired
- Environment env;
-
- private List<AafUserRole> list = new ArrayList<>();
-
- @PostConstruct
- public void initializePermissions()
- {
- String userRolePropertiesName = env.getProperty("aaf.user.roles", "src/main/resources/aaf/AAFUserRoles.properties");
- Properties props = new Properties();
- try
- {
- props.load(new FileInputStream(new File(userRolePropertiesName)));
- }
- catch (Exception e)
- {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- }
- for (Object url : props.keySet())
- {
- Object value = props.get(url);
- list.add(new AafUserRole((String)url, (String)value));
- }
- }
+public class AafUserRoleProperties {
+ @Autowired
+ Environment env;
+
+ private List<AafUserRole> list = new ArrayList<>();
+
+ /**
+ * Initialize permissions.
+ */
+ @PostConstruct
+ public void initializePermissions() {
+ String userRolePropertiesName =
+ env.getProperty("aaf.user.roles", "src/main/resources/aaf/AAFUserRoles.properties");
+ Properties props = new Properties();
+ try {
+ props.load(new FileInputStream(new File(userRolePropertiesName)));
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ for (Object url : props.keySet()) {
+ Object value = props.get(url);
+ list.add(new AafUserRole((String) url, (String) value));
+ }
+ }
+
+ /**
+ * Gets the for url method.
+ *
+ * @param url the url
+ * @param method the method
+ * @return the for url method
+ */
+ public List<AafUserRole> getForUrlMethod(String url, String method) {
+ List<AafUserRole> userRoleList = new ArrayList<>();
+ for (AafUserRole aur : list) {
+ if (aur.matches(url, method)) {
+ userRoleList.add(aur);
+ }
+ }
+ return userRoleList;
+ }
- public List<AafUserRole> getForUrlMethod(String url, String method)
- {
- List<AafUserRole> userRoleList = new ArrayList<>();
- for (AafUserRole aur : list)
- {
- if (aur.matches(url, method))
- {
- userRoleList.add(aur);
- }
- }
- return userRoleList;
- }
+ /**
+ * Process permissions.
+ *
+ * @param request the request
+ * @param userPerms the user perms
+ * @return true, if successful
+ */
+ public boolean processPermissions(HttpServletRequest request, List<Permission> userPerms) {
+ try {
+ // Get list of perms that match incoming URL. May be more than 1...
+ // Users perms must match all that match URL
+ List<AafUserRole> perms = getForUrlMethod(request.getRequestURI(), request.getMethod());
+ int tested = 0;
+ int passed = 0;
+ for (AafUserRole perm : perms) {
+ for (AafPerm test : perm.getAafPerms()) {
+ tested++;
+ for (Permission userPerm : userPerms) {
- public boolean processPermissions(HttpServletRequest request, List<Permission> userPerms)
- {
- try
- {
- // Get list of perms that match incoming URL. May be more than 1...
- // Users perms must match all that match URL
- List<AafUserRole> perms = getForUrlMethod(request.getRequestURI(), request.getMethod());
- ObjectMapper om = new ObjectMapper();
- int tested = 0;
- int passed = 0;
- for (AafUserRole perm : perms)
- {
- for (AafPerm test : perm.getAafPerms())
- {
- tested++;
- for (Permission userPerm: userPerms)
- {
-
- if (test.matches((AAFPermission)userPerm))
- {
- passed++;
- break;
- }
- }
- }
- }
- // All permissions must be OK
- if (tested > 0 && tested == passed)
- return true;
- else
- return false;
- }
- catch (Exception e)
- {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- }
- return false;
- }
+ if (test.matches((AAFPermission) userPerm)) {
+ passed++;
+ break;
+ }
+ }
+ }
+ }
+ // All permissions must be OK
+ if (tested > 0 && tested == passed) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return false;
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
index 39981c7..e973a4f 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
@@ -1,35 +1,46 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.optf.cmso
- * ================================================================================
- * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
* Licensed 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
+ * 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.
- * ============LICENSE_END=========================================================
- */
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.aaf;
import org.springframework.core.Ordered;
public enum FilterPriority {
- AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE),
- AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1); //higher number = lower priority
-
+ AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE), AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1);
private final int priority;
- FilterPriority(final int p) {
- priority = p;
+ FilterPriority(final int ppri) {
+ priority = ppri;
}
- public int getPriority() { return priority; }
+ public int getPriority() {
+ return priority;
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
index 769262b..e7ddcdf 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
@@ -1,38 +1,45 @@
-/**
- * ============LICENSE_START=======================================================
- * org.onap.optf.cmso
- * ================================================================================
- * Copyright © 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
* Licensed 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
+ * 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.
- * ============LICENSE_END=========================================================
- */
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.aaf;
import java.io.IOException;
-
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.MediaType;
-
import org.onap.optf.cmso.common.exceptions.CMSException;
class ResponseFormatter {
- private static final String ACCEPT_HEADER = "accept";
- static void errorResponse(HttpServletRequest request, HttpServletResponse response, CMSException error) throws IOException {
- String accept = request.getHeader(ACCEPT_HEADER) == null ? MediaType.APPLICATION_JSON : request.getHeader(ACCEPT_HEADER);
+ static void errorResponse(HttpServletRequest request, HttpServletResponse response, CMSException error)
+ throws IOException {
response.setStatus(error.getStatus().getStatusCode());
response.getWriter().write(error.getRequestError().toString());
response.getWriter().flush();
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalStatusEnum.java b/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalStatusEnum.java
index 0069f26..db48437 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalStatusEnum.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalStatusEnum.java
@@ -1,36 +1,34 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+ * Copyright � 2017-2018 AT&T Intellectual Property. Modifications Copyright � 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.common;
+/**
+ * The Enum ApprovalStatusEnum.
+ */
public enum ApprovalStatusEnum {
Accepted("Accepted"), Rejected("Rejected"),;
@@ -40,6 +38,12 @@ public enum ApprovalStatusEnum {
this.text = text;
}
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
public String toString() {
return text;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalTypesEnum.java b/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalTypesEnum.java
index 927dbf1..97e33d5 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalTypesEnum.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/common/ApprovalTypesEnum.java
@@ -1,33 +1,28 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+ * Copyright � 2017-2018 AT&T Intellectual Property. Modifications Copyright � 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.common;
@@ -40,6 +35,7 @@ public enum ApprovalTypesEnum {
this.text = text;
}
+ @Override
public String toString() {
return text;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java b/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
index 25b6583..8b3d3f0 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
@@ -1,33 +1,19 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso.common;
@@ -67,7 +53,7 @@ public class BasicAuthenticatorFilter implements ClientRequestFilter {
throw new IllegalStateException("Cannot encode with UTF-8", ex);
}
}
-
+
public static String getUser(HttpServletRequest request) {
String user = "";
String header = request.getHeader("Authorization");
@@ -86,8 +72,7 @@ public class BasicAuthenticatorFilter implements ClientRequestFilter {
private static String getToken(String auth) {
try {
- String token = new String(DatatypeConverter.parseBase64Binary(auth));
- return token;
+ return new String(DatatypeConverter.parseBase64Binary(auth));
} catch (Exception e) {
return auth;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/common/CMSStatusEnum.java b/cmso-service/src/main/java/org/onap/optf/cmso/common/CMSStatusEnum.java
index de1e701..5b0a539 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/common/CMSStatusEnum.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/common/CMSStatusEnum.java
@@ -1,102 +1,95 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* 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.onap.optf.cmso.common;
public enum CMSStatusEnum {
- PendingSchedule("Pending Schedule",
- "Schedule request as been accepted. Pending determination of recommended schedule."), SchedulingFailed(
- "Scheduling Failed", "Failed to determine recommended schedule."), ScheduleFailed("Schedule Failed",
- "Determination of recommended schedule failed."), OptimizationInProgress(
- "Optimization In Progress",
- "Determination of recommended schedule is in progress."), PendingApproval(
- "Pending Approval",
- "Pending approval of the recommended schedule."), OptimizationFailed(
- "Optimization Failed",
- "Unable to determine recommended schedule."), Accepted("Accepted",
- "Recommended schedule has been accepted."), Scheduled(
- "Scheduled",
- "All approvals received. Recommended schedule is pending execution."), ScheduledImmediate(
- "Scheduled Immediate",
- "All approvals received. Event is scheduled for immediate execution."), Triggered(
- "Triggered",
- "Scheduled event has been triggered."), ApprovalRejected(
- "Approval Rejected",
- "Recommended schedule has been rejected."), PastDue(
- "Past due",
- "Scheduled event time has passed. Queued event was not dispatched."), Error(
- "Error",
- "Attempt to displatch event failed."), Failed(
- "Failed",
- "Triggered event reported a failure."), Rejected(
- "Rejected",
- "Recommended schedule has been rejected."), NotificationsInitiated(
- "Notifications Initiated",
- "Notifications of scheduled events has been initiated."), Completed(
- "Completed",
- "Notification of all scheduled events have been sent."), CompletedWithError(
- "Completed with error(s)",
- "All scheduled events have completed, some with errors."), Deleted(
- "Deleted",
- "Schedule deleted prior to acceptance or after execution."), Cancelled(
- "Cancelled",
- "Scheduled event cancelled before execution."),;
+ PendingSchedule(
+ "Pending Schedule",
+ "Schedule request as been accepted. Pending determination of recommended schedule."),
+ SchedulingFailed("Scheduling Failed", "Failed to determine recommended schedule."),
+ ScheduleFailed("Schedule Failed", "Determination of recommended schedule failed."),
+ OptimizationInProgress(
+ "Optimization In Progress", "Determination of recommended schedule is in progress."),
+ PendingApproval("Pending Approval", "Pending approval of the recommended schedule."),
+ OptimizationFailed("Optimization Failed", "Unable to determine recommended schedule."),
+ Accepted("Accepted", "Recommended schedule has been accepted."),
+ Scheduled("Scheduled", "All approvals received. Recommended schedule is pending execution."),
+ ScheduledImmediate(
+ "Scheduled Immediate", "All approvals received. Event is scheduled for immediate execution."),
+ Triggered("Triggered", "Scheduled event has been triggered."),
+ ApprovalRejected("Approval Rejected", "Recommended schedule has been rejected."),
+ PastDue("Past due", "Scheduled event time has passed. Queued event was not dispatched."),
+ Error("Error", "Attempt to displatch event failed."),
+ Failed("Failed", "Triggered event reported a failure."),
+ Rejected("Rejected", "Recommended schedule has been rejected."),
+ NotificationsInitiated(
+ "Notifications Initiated", "Notifications of scheduled events has been initiated."),
+ Completed("Completed", "Notification of all scheduled events have been sent."),
+ CompletedWithError(
+ "Completed with error(s)", "All scheduled events have completed, some with errors."),
+ Deleted("Deleted", "Schedule deleted prior to acceptance or after execution."),
+ Cancelled("Cancelled", "Scheduled event cancelled before execution."),
+ NotScheduled("Not scheduled by optimizer", "Element not included in the schedule by optimizer."),
+ ;
- private final String text;
- private final String description;
+ private final String text;
+ private final String description;
- private CMSStatusEnum(String text, String description) {
- this.text = text;
- this.description = description;
- }
+ private CMSStatusEnum(String text, String description) {
+ this.text = text;
+ this.description = description;
+ }
- public String toString() {
- return text;
- }
+ @Override
+ public String toString() {
+ return text;
+ }
- public CMSStatusEnum fromString(String text) {
- for (CMSStatusEnum e : CMSStatusEnum.values())
- if (e.text.equals(text))
- return e;
- return null;
- }
-
- // To include in the AID.
- public static void main(String argv[]) {
- StringBuilder sb = new StringBuilder();
- sb.append("<html><body><table border=\"1\">\n");
- for (CMSStatusEnum v : CMSStatusEnum.values())
- sb.append("<tr><td>").append(v.text).append("</td><td>").append(v.description).append("</td></tr>\n");
- sb.append("</table></body></html>\n");
- System.out.println(sb.toString());
- }
+ public CMSStatusEnum fromString(String text) {
+ for (CMSStatusEnum e : CMSStatusEnum.values()) if (e.text.equals(text)) return e;
+ return null;
+ }
+ // To include in the AID.
+ public static void main(String argv[]) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("<html><body><table border=\"1\">\n");
+ for (CMSStatusEnum v : CMSStatusEnum.values())
+ sb.append("<tr><td>")
+ .append(v.text)
+ .append("</td><td>")
+ .append(v.description)
+ .append("</td></tr>\n");
+ sb.append("</table></body></html>\n");
+ System.out.println(sb.toString());
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/common/CmHelpers.java b/cmso-service/src/main/java/org/onap/optf/cmso/common/CmHelpers.java
index 832acb7..c5ff7f0 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/common/CmHelpers.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/common/CmHelpers.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -33,12 +33,13 @@ package org.onap.optf.cmso.common;
import java.util.List;
import org.onap.optf.cmso.model.DomainData;
+import org.onap.optf.cmso.model.ElementData;
import org.onap.optf.cmso.model.Schedule;
import org.onap.optf.cmso.service.rs.models.CmDomainDataEnum;
/**
* Collection of commann static helper methods for CHangeManagement
- *
+ *
* @author jf9860
*
*/
@@ -56,4 +57,16 @@ public class CmHelpers {
return null;
}
+ public static String getEventData(Schedule schedule, CmDomainDataEnum key) {
+ return getDomainData(schedule.getDomainData(), key);
+ }
+
+ public static String getElementData(List<ElementData> eventData, CmDomainDataEnum key) {
+ for (ElementData map : eventData) {
+ if (map.getName().equals(key.toString()))
+ return map.getValue();
+ }
+ return null;
+ }
+
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/common/LogMessages.java b/cmso-service/src/main/java/org/onap/optf/cmso/common/LogMessages.java
index efb4dd0..3fd6cc8 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/common/LogMessages.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/common/LogMessages.java
@@ -1,237 +1,315 @@
/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.common;
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
-
import javax.ws.rs.core.Response.Status;
-
import org.apache.log4j.Level;
import org.onap.observations.ObservationInterface;
-import com.att.eelf.configuration.EELFManager;
-import com.att.eelf.i18n.EELFResourceManager;
-
+/**
+ * The Enum LogMessages.
+ */
public enum LogMessages implements ObservationInterface {
- SEARCH_SCHEDULE_REQUEST_DETAILS("Search Schedule Request Details {0} from {1}: {2}", Status.OK, Level.INFO),
- SEARCH_SCHEDULE_REQUEST("Search Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
- CREATE_SCHEDULE_REQUEST("Create Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
- DELETE_SCHEDULE_REQUEST("Delete Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
- GET_SCHEDULE_REQUEST_INFO("Get Schedule Request Info {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
- PROCESS_OPTIMIZER_CALLBACK("Change management optimizer callback {0} from {1}: {2} ", Status.OK, Level.INFO),
- APPROVE_SCHEDULE_REQUEST("Approve Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
- SCHEDULE_ALREADY_EXISTS("Schedule already exists domain={0} schedule id={1}", Status.OK, Level.INFO),
- SCHEDULE_NOT_FOUND("Schedule not found domain={0} schedule id={1}", Status.BAD_REQUEST, Level.INFO),
- INVALID_ATTRIBUTE("Invalid attribute {0}={1}", Status.BAD_REQUEST, Level.INFO),
- MISSING_REQUIRED_ATTRIBUTE("Missing required attribute '{0}'", Status.BAD_REQUEST, Level.INFO),
- INVALID_REQUEST("The input data structure is incorrect", Status.BAD_REQUEST, Level.INFO),
- REQUEST_TIMED_OUT("Request timed out.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
- UNEXPECTED_EXCEPTION("Unexpected exception encountered during processing. Please contact support : {0}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
- UNDEFINED_DOMAIN_DATA_ATTRIBUTE("Domain data attribute not defined domain={0} name={1} value={2}", Status.BAD_REQUEST, Level.INFO),
- UNDEFINED_FILTER_ATTRIBUTE("Undefined filter attribute {0}", Status.BAD_REQUEST, Level.INFO),
- INVALID_DATE_FILTER("Invalid date filter provided {0}=(1}", Status.BAD_REQUEST, Level.INFO),
- OPTIMIZER_QUARTZ_JOB("Quartz scheduling of OptimizerQuartzJob: {0}", Status.OK, Level.INFO),
- OPTIMIZER_EXCEPTION("Exception making client call to optimizer {0}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
- OPTIMIZER_CALLBACK_STATE_ERROR("Optimizer callback on schedule in invalid state. Should be {0} but was {1}.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
- CHANGE_MANAGEMENT_GROUP_NOT_FOUND("ChangeManagementGroup not found on optimizer callback scheduleId={0} groupId={1}", Status.NOT_FOUND, Level.INFO),
- INCOMING_MESSAGE("Incoming message method={0} path={1}", Status.OK, Level.INFO, true, false),
- INCOMING_MESSAGE_RESPONSE("Message response method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
- OUTGOING_MESSAGE("Outgoing message method={0} path={1}", Status.OK, Level.INFO, true, false),
- OUTGOING_MESSAGE_RETURNED("Outgoing message returned method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
-
- // TODO: Review the status and level of the remaining enums
- UNABLE_TO_ALLOCATE_VNF_TIMESLOTS("Unable to allocate VNF timeslots with Optimizer results startTime={0}, latestStartTime={1}, totalDuration={2}, concurrency={3} nvfs={4}", Status.OK, Level.INFO),
- UNABLE_TO_LOCATE_SCHEDULE_DETAIL("Unable to locate ChangeManagementSchedule for VNF. scheduleId={0}, groupId={1}, vnfName={2}", Status.OK, Level.INFO),
- CM_JOB("Quartz scheduling of CmJob: {0}", Status.OK, Level.INFO),
- CM_QUARTZ_JOB("Quartz scheduling of CmQuartzJob: {0}", Status.OK, Level.INFO),
- NOT_PENDING_APPROVAL("Approval request received for schedule that is not in Pending Approval state: domain={0} scheduleId={1} state={3}", Status.OK, Level.INFO),
- SCHEDULE_PAST_DUE("Attempt to dispatch an event that is Past due scheduleId={0}, vnf={1}, now={2}, startTime={3}", Status.OK, Level.INFO),
- MSO_POLLING_MISSING_SCHEDULE("Attempt to poll MSO for request id {1} for missing ChangeManagementSchedule id={0}", Status.OK, Level.INFO),
- MSO_STATUS_JOB("Polling MSO {0} for requestId={1} for id={2}", Status.OK, Level.INFO),
- UNEXPECTED_RESPONSE("Unexpected response from {0} HTTP Status={1} : {2}", Status.OK, Level.INFO),
- SCHEDULE_STATUS_JOB("Quartz scheduling of ScheduleStatusJob: {0}", Status.OK, Level.INFO),
- CM_TICKET_NOT_APPROVED("Attempt to dispatch a change management event that has no TM Ticket approved. scheduleId={0} VNF Name={1} TM ChangeId={2} Status={3} Approval Status={4}", Status.OK, Level.INFO),
- MULTIPLE_GROUPS_NOT_SUPPORTED("Multiple groups not supported on immediate requests", Status.OK, Level.INFO),
- TM_CREATE_CHANGE_RECORD("TM Create Change Record:{0} : Schedule ID: {1}", Status.OK, Level.INFO),
- TM_LIST("TM list:{0} : URL : {1}", Status.OK, Level.INFO),
- TM_API("TM API Call: URL : {0}", Status.OK, Level.INFO),
- UNABLE_TO_CREATE_CHANGE_TICKET("Unable to create change ticket in TM: Schedule ID: {0} : Reason : {1}", Status.OK, Level.INFO),
- TM_UPDATE_CHECKLIST("TM Fetch Checklist:{0} : Schedule ID: {1} : Change Id : {2} : URL : {3}", Status.OK, Level.INFO),
- OPTIMIZER_REQUEST("Optimi Request:{0} : Schedule ID: {1} : URL : {2}", Status.OK, Level.INFO),
- TM_CLOSE_CHANGE_RECORD("TM Close Change Record:{0} : Schedule ID: {1} : Change Id : {2}", Status.OK, Level.INFO),
- UNABLE_TO_CLOSE_CHANGE_TICKET("Unable to close change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}", Status.OK, Level.INFO),
- CANNOT_CANCEL_IN_PROGRESS("Cannot delete/cancel a schedule with events in progress.", Status.OK, Level.INFO),
- UNABLE_TO_PARSE_SCHEDULING_INFO("Cannot parse scheduling info.", Status.OK, Level.INFO),
- UNABLE_TO_LOCATE_CHANGE_RECORD("Unable to locate TM change record {2} to check status before displacth of {1} for schedulId={0}", Status.OK, Level.INFO),
- INVALID_CHANGE_WINDOW("Change window end time {1} must be after start time {0}", Status.OK, Level.INFO),
- NODE_LIST_CONTAINS_EMTPY_NODE("vnfDetails node list contains at least one empty node.", Status.OK, Level.INFO),
- SO_API("SO Poll Request {0}", Status.OK, Level.INFO),
- EXPECTED_EXCEPTION("Expected exception encountered during processing. {0}", Status.OK, Level.INFO),
- TM_UPDATE_CHANGE_RECORD("TM Update Change Record:{0} : Schedule ID: {1} : Change Id : {2} : URL : {3}", Status.OK, Level.INFO),
- UNABLE_TO_UPDATE_CHANGE_TICKET("Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}", Status.OK, Level.INFO),
- UNAUTHORIZED("Authorization failed.", Status.FORBIDDEN, Level.INFO),
- UNAUTHENTICATED("Authentication failed.", Status.UNAUTHORIZED, Level.INFO),
- UNRECOGNIZED_MSO_STATUS("Unrecognized status returned by MSO {0}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
- UNABLE_TO_PARSE_MSO_RESPONSE("Unable to parse status message from MSO {0} : {1}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
- ;
- private final String defaultId;
- private final String defaultMessage;
- private final String defaultResolution;
- private final String defaultAction;
-
- private final Status status;
- private final Level level;
- private final Boolean audit;
- private final Boolean metric;
-
-
- private LogMessages(String message, Status code, Level l)
- {
- defaultMessage = message;
- level=l;
- status = code;
- this.defaultId = this.name();
- this.defaultResolution = "No resolution needed";
- this.defaultAction = "No action is required";
- this.audit = false;
- this.metric = false;
- }
-
- private LogMessages(String message, Status code, Level l, Boolean audit, Boolean metric)
- {
- defaultMessage = message;
- level=l;
- status = code;
- this.audit = audit;
- this.metric = metric;
- this.defaultId = this.name();
- this.defaultResolution = "No resolution needed";
- this.defaultAction = "No action is required";
- }
-
- private LogMessages(String message, Status code, Level l, String id, String resolution, String action)
- {
- level=l;
- status = code;
- defaultMessage = message;
- this.defaultId = id;
- this.defaultResolution = resolution;
- this.defaultAction = action;
- this.audit = false;
- this.metric = false;
- }
-
- static {
- EELFResourceManager.loadMessageBundle("logmessages");
- }
-
- public String genProperties()
- {
- // Use this to regenerate properties file. The desire to change messages without updating code is
- // well understood, but the developer should be able to code the defaults without having to update 2 different files and
- // get it wrong.
- StringBuilder sb = new StringBuilder();
- sb.append("# Generated from ").append(this.getClass().getName()).append("\n");
- for (LogMessages lm : values())
- {
- sb.append(lm.name());
- sb.append(" ").append(lm.defaultId);
- sb.append("|").append(lm.defaultMessage);
- sb.append("|").append(lm.defaultResolution);
- sb.append("|").append(lm.defaultAction);
- sb.append("\n");
- }
- return sb.toString();
- }
-
-
- // interface methods
- @Override
- public Level getLevel() {return level;}
- @Override
- public String getMessage() {return defaultMessage;}
- @Override
- public Status getStatus() {return status;}
- @Override
- public Enum<?> getValue() {return this;}
- @Override
- public String getDomain() {return this.getClass().getSimpleName();}
- @Override
- public Boolean getAudit() { return audit; }
- @Override
- public Boolean getMetric() { return metric; }
-
- public static void main(String argv[])
- {
- System.out.println(LogMessages.UNEXPECTED_EXCEPTION.genProperties());
- try
- {
- Files.write(Paths.get("src/main/resources/logmessages.properties"), LogMessages.UNEXPECTED_EXCEPTION.genProperties().getBytes());
- }
- catch (IOException e)
- {
- EELFManager.getInstance().getDebugLogger().debug("Failed to update properties file.", e);
-
- }
- StringBuilder sb = new StringBuilder();
- sb.append("<html><body><h1>Cell Site Selection Scheduler mS Observations</h1>\n<table border=\"1\">\n<tr>");
- sb.append("<td>Code</td> ");
- sb.append("<td>Log Level</td> ");
- sb.append("<td>Message</td> ");
- sb.append("</tr>\n");
- for (LogMessages m : LogMessages.values())
- {
- if (m.level == Level.ERROR || m.level == Level.WARN || m.level == Level.FATAL)
- {
- sb.append("<tr>");
- sb.append("<td>").append(m.name()).append("</td> ");
- sb.append("<td>").append(m.level).append("</td> ");
- sb.append("<td>").append(m.defaultMessage).append("</td> ");
- sb.append("</tr>\n");
- }
- }
- try
- {
- Files.write(Paths.get("logmessages.html"), sb.toString().getBytes());
- }
- catch (IOException e)
- {
- EELFManager.getInstance().getDebugLogger().debug("Failed to update properties html file.", e);
-
- }
-
- }
+ SEARCH_SCHEDULE_REQUEST_DETAILS("Search Schedule Request Details {0} from {1}: {2}", Status.OK, Level.INFO),
+ SEARCH_SCHEDULE_REQUEST("Search Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
+ CREATE_SCHEDULE_REQUEST("Create Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
+ DELETE_SCHEDULE_REQUEST("Delete Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
+ GET_SCHEDULE_REQUEST_INFO("Get Schedule Request Info {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
+ PROCESS_OPTIMIZER_CALLBACK("Change management optimizer callback {0} from {1}: {2} ", Status.OK, Level.INFO),
+ APPROVE_SCHEDULE_REQUEST("Approve Schedule Request {0} from {1}: {2} : {3}", Status.OK, Level.INFO),
+ SCHEDULE_ALREADY_EXISTS("Schedule already exists domain={0} schedule id={1}", Status.OK, Level.INFO),
+ SCHEDULE_NOT_FOUND("Schedule not found domain={0} schedule id={1}", Status.BAD_REQUEST, Level.INFO),
+ INVALID_ATTRIBUTE("Invalid attribute {0}={1}", Status.BAD_REQUEST, Level.INFO),
+ MISSING_REQUIRED_ATTRIBUTE("Missing required attribute '{0}'", Status.BAD_REQUEST, Level.INFO),
+ INVALID_REQUEST("The input data structure is incorrect", Status.BAD_REQUEST, Level.INFO),
+ REQUEST_TIMED_OUT("Request timed out.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ UNEXPECTED_EXCEPTION("Unexpected exception encountered during processing. Please contact support : {0}",
+ Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ UNDEFINED_DOMAIN_DATA_ATTRIBUTE("Domain data attribute not defined domain={0} name={1} value={2}",
+ Status.BAD_REQUEST, Level.INFO),
+ UNDEFINED_FILTER_ATTRIBUTE("Undefined filter attribute {0}", Status.BAD_REQUEST, Level.INFO),
+ INVALID_DATE_FILTER("Invalid date filter provided {0}=(1}", Status.BAD_REQUEST, Level.INFO),
+ OPTIMIZER_QUARTZ_JOB("Quartz scheduling of OptimizerQuartzJob: {0}", Status.OK, Level.INFO),
+ OPTIMIZER_EXCEPTION("Exception making client call to optimizer {0}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ OPTIMIZER_CALLBACK_STATE_ERROR("Optimizer callback on schedule in invalid state. Should be {0} but was {1}.",
+ Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ CHANGE_MANAGEMENT_GROUP_NOT_FOUND(
+ "ChangeManagementGroup not found on optimizer callback scheduleId={0} groupId={1}",
+ Status.NOT_FOUND, Level.INFO),
+ INCOMING_MESSAGE("Incoming message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ INCOMING_MESSAGE_RESPONSE("Message response method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE("Outgoing message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE_RETURNED("Outgoing message returned method={0} path={1} status={2}", Status.OK, Level.INFO, true,
+ false),
+
+ // TODO: Review the status and level of the remaining enums
+ UNABLE_TO_ALLOCATE_VNF_TIMESLOTS(
+ "Unable to allocate VNF timeslots with Optimizer results startTime={0},"
+ + " latestStartTime={1}, totalDuration={2}, concurrency={3} nvfs={4}",
+ Status.OK, Level.INFO),
+ UNABLE_TO_LOCATE_SCHEDULE_DETAIL(
+ "Unable to locate ChangeManagementSchedule for VNF. scheduleId={0}, groupId={1}, vnfName={2}",
+ Status.OK, Level.INFO),
+ CM_JOB("Quartz scheduling of CmJob: {0}", Status.OK, Level.INFO),
+ CM_QUARTZ_JOB("Quartz scheduling of CmQuartzJob: {0}", Status.OK, Level.INFO),
+ NOT_PENDING_APPROVAL(
+ "Approval request received for schedule that is not in Pending Approval state:"
+ + " domain={0} scheduleId={1} state={3}",
+ Status.OK, Level.INFO),
+ SCHEDULE_PAST_DUE("Attempt to dispatch an event that is Past due scheduleId={0}, vnf={1}, now={2}, startTime={3}",
+ Status.OK, Level.INFO),
+ MSO_POLLING_MISSING_SCHEDULE("Attempt to poll MSO for request id {1} for missing ChangeManagementSchedule id={0}",
+ Status.OK, Level.INFO),
+ MSO_STATUS_JOB("Polling MSO {0} for requestId={1} for id={2}", Status.OK, Level.INFO),
+ UNEXPECTED_RESPONSE("Unexpected response from {0} HTTP Status={1} : {2}", Status.OK, Level.INFO),
+ SCHEDULE_STATUS_JOB("Quartz scheduling of ScheduleStatusJob: {0}", Status.OK, Level.INFO),
+ CM_TICKET_NOT_APPROVED(
+ "Attempt to dispatch a change management event that has no TM Ticket approved."
+ + "scheduleId={0} VNF Name={1} TM ChangeId={2} Status={3} Approval Status={4}",
+ Status.OK, Level.INFO),
+ MULTIPLE_GROUPS_NOT_SUPPORTED("Multiple groups not supported on immediate requests", Status.OK, Level.INFO),
+ TM_CREATE_CHANGE_RECORD("TM Create Change Record:{0} : Schedule ID: {1}", Status.OK, Level.INFO),
+ TM_LIST("TM list:{0} : URL : {1}", Status.OK, Level.INFO),
+ TM_API("TM API Call: URL : {0}", Status.OK, Level.INFO),
+ UNABLE_TO_CREATE_CHANGE_TICKET("Unable to create change ticket in TM: Schedule ID: {0} : Reason : {1}", Status.OK,
+ Level.INFO),
+ TM_UPDATE_CHECKLIST("TM Fetch Checklist:{0} : Schedule ID: {1} : Change Id : {2} : URL : {3}", Status.OK,
+ Level.INFO),
+ OPTIMIZER_REQUEST("Optimi Request:{0} : Schedule ID: {1} : URL : {2}", Status.OK, Level.INFO),
+ TM_CLOSE_CHANGE_RECORD("TM Close Change Record:{0} : Schedule ID: {1} : Change Id : {2}", Status.OK, Level.INFO),
+ UNABLE_TO_CLOSE_CHANGE_TICKET(
+ "Unable to close change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}", Status.OK,
+ Level.INFO),
+ CANNOT_CANCEL_IN_PROGRESS("Cannot delete/cancel a schedule with events in progress.", Status.OK, Level.INFO),
+ UNABLE_TO_PARSE_SCHEDULING_INFO("Cannot parse scheduling info.", Status.OK, Level.INFO),
+ UNABLE_TO_LOCATE_CHANGE_RECORD(
+ "Unable to locate TM change record {2} to check status before displacth of {1} for schedulId={0}",
+ Status.OK, Level.INFO),
+ INVALID_CHANGE_WINDOW("Change window end time {1} must be after start time {0}", Status.OK, Level.INFO),
+ NODE_LIST_CONTAINS_EMTPY_NODE("vnfDetails node list contains at least one empty node.", Status.OK, Level.INFO),
+ SO_API("SO Poll Request {0}", Status.OK, Level.INFO),
+ EXPECTED_EXCEPTION("Expected exception encountered during processing. {0}", Status.OK, Level.INFO),
+ TM_UPDATE_CHANGE_RECORD("TM Update Change Record:{0} : Schedule ID: {1} : Change Id : {2} : URL : {3}", Status.OK,
+ Level.INFO),
+ UNABLE_TO_UPDATE_CHANGE_TICKET(
+ "Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}", Status.OK,
+ Level.INFO),
+ UNAUTHORIZED("Authorization failed.", Status.FORBIDDEN, Level.INFO),
+ UNAUTHENTICATED("Authentication failed.", Status.UNAUTHORIZED, Level.INFO),
+ UNRECOGNIZED_MSO_STATUS("Unrecognized status returned by MSO {0}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ UNABLE_TO_PARSE_MSO_RESPONSE("Unable to parse status message from MSO {0} : {1}", Status.INTERNAL_SERVER_ERROR,
+ Level.ERROR),
+ MISSING_VALID_GROUP_FOR_ELEMENT("Element {0} returned by optimizer has invalid group id",
+ Status.INTERNAL_SERVER_ERROR, Level.ERROR),;
+ private final String defaultId;
+ private final String defaultMessage;
+ private final String defaultResolution;
+ private final String defaultAction;
+
+ private final Status status;
+ private final Level level;
+ private final Boolean audit;
+ private final Boolean metric;
+
+
+ private LogMessages(String message, Status code, Level lev) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ this.audit = false;
+ this.metric = false;
+ }
+
+ private LogMessages(String message, Status code, Level lev, Boolean audit, Boolean metric) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.audit = audit;
+ this.metric = metric;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ }
+
+ private LogMessages(String message, Status code, Level lev, String id, String resolution, String action) {
+ level = lev;
+ status = code;
+ defaultMessage = message;
+ this.defaultId = id;
+ this.defaultResolution = resolution;
+ this.defaultAction = action;
+ this.audit = false;
+ this.metric = false;
+ }
+
+ static {
+ EELFResourceManager.loadMessageBundle("logmessages");
+ }
+
+ /**
+ * Gen properties.
+ *
+ * @return the string
+ */
+ public String genProperties() {
+ // Use this to regenerate properties file. The desire to change messages without updating code is
+ // well understood, but the developer should be able to code the defaults without having to update 2
+ // different files and
+ // get it wrong.
+ StringBuilder sb = new StringBuilder();
+ sb.append("# Generated from ").append(this.getClass().getName()).append("\n");
+ for (LogMessages lm : values()) {
+ sb.append(lm.name());
+ sb.append(" ").append(lm.defaultId);
+ sb.append("|").append(lm.defaultMessage);
+ sb.append("|").append(lm.defaultResolution);
+ sb.append("|").append(lm.defaultAction);
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+
+ /**
+ * Gets the level.
+ *
+ * @return the level
+ */
+ // interface methods
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @return the message
+ */
+ @Override
+ public String getMessage() {
+ return defaultMessage;
+ }
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ @Override
+ public Enum<?> getValue() {
+ return this;
+ }
+
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
+ @Override
+ public String getDomain() {
+ return this.getClass().getSimpleName();
+ }
+
+ /**
+ * Gets the audit.
+ *
+ * @return the audit
+ */
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ /**
+ * Gets the metric.
+ *
+ * @return the metric
+ */
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * The main method.
+ *
+ * @param argv the arguments
+ */
+ public static void main(String[] argv) {
+ System.out.println(LogMessages.UNEXPECTED_EXCEPTION.genProperties());
+ try {
+ Files.write(Paths.get("src/main/resources/logmessages.properties"),
+ LogMessages.UNEXPECTED_EXCEPTION.genProperties().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties file.", e);
+
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("<html><body><h1>Cell Site Selection Scheduler mS Observations</h1>\n<table border=\"1\">\n<tr>");
+ sb.append("<td>Code</td> ");
+ sb.append("<td>Log Level</td> ");
+ sb.append("<td>Message</td> ");
+ sb.append("</tr>\n");
+ for (LogMessages m : LogMessages.values()) {
+ if (m.level == Level.ERROR || m.level == Level.WARN || m.level == Level.FATAL) {
+ sb.append("<tr>");
+ sb.append("<td>").append(m.name()).append("</td> ");
+ sb.append("<td>").append(m.level).append("</td> ");
+ sb.append("<td>").append(m.defaultMessage).append("</td> ");
+ sb.append("</tr>\n");
+ }
+ }
+ try {
+ Files.write(Paths.get("logmessages.html"), sb.toString().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties html file.", e);
+
+ }
+
+ }
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CMSOClient.java b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CMSOClient.java
index 19927ad..d726107 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CMSOClient.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CMSOClient.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,6 +31,10 @@
package org.onap.optf.cmso.dispatcher;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
@@ -42,16 +46,14 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
import org.onap.optf.cmso.common.CMSStatusEnum;
-import org.onap.optf.cmso.common.CmHelpers;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.PropertiesManagement;
-import org.onap.optf.cmso.filters.CMSOClientFilters;
+import org.onap.optf.cmso.filters.CmsoClientFilters;
import org.onap.optf.cmso.model.ChangeManagementSchedule;
import org.onap.optf.cmso.model.Schedule;
import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
import org.onap.optf.cmso.model.dao.ScheduleDAO;
-import org.onap.optf.cmso.service.rs.models.CmDomainDataEnum;
import org.onap.optf.cmso.ticketmgt.TmClient;
import org.onap.optf.cmso.wf.bean.WfChangeManagementResponse;
import org.onap.optf.cmso.wf.bean.WfVidCmResponse;
@@ -60,10 +62,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
@Component
public class CMSOClient {
@@ -81,6 +79,7 @@ public class CMSOClient {
@Autowired
ScheduleDAO scheduleDAO;
+
@Autowired
Environment env;
@@ -97,13 +96,13 @@ public class CMSOClient {
if (!url.endsWith("/"))
url += "/";
url = url + "schedule/" + cmSchedule.getVnfName();
- String callbackData = CmHelpers.getDomainData(schedule, CmDomainDataEnum.CallbackData);
+ String callbackData = cmSchedule.getRequest();
String user = env.getProperty("so.user", "");
String pass = pm.getProperty("so.pass", "");
Client client = ClientBuilder.newClient();
if (!user.equals(""))
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(new CMSOClientFilters());
+ client.register(new CmsoClientFilters());
WebTarget target = client.target(url);
ObjectMapper om = new ObjectMapper();
JsonNode jsonEntity = om.readTree(callbackData);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CmJob.java b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CmJob.java
index 880566a..8766eee 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CmJob.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/CmJob.java
@@ -32,6 +32,7 @@
package org.onap.optf.cmso.dispatcher;
import java.util.Map;
+import java.util.UUID;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
@@ -45,7 +46,7 @@ import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.PropertiesManagement;
import org.onap.optf.cmso.eventq.DispatchedEventList;
-import org.onap.optf.cmso.filters.CMSOClientFilters;
+import org.onap.optf.cmso.filters.CmsoClientFilters;
import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
import org.onap.optf.cmso.model.dao.ScheduleDAO;
@@ -103,19 +104,19 @@ public class CmJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
Mdc.quartzJobBegin(context);
debug.debug(LogMessages.CM_JOB, "Entered");
- Integer id = context.getJobDetail().getJobDataMap().getInt("key");
+ String id = context.getJobDetail().getJobDataMap().getString("key");
try {
// Hand this off to a transactional service
loopback(id);
} catch (Exception e) {
log.warn("Unexpected exception", e);
} finally {
- dispatchedEventList.remove(id);
+ dispatchedEventList.remove(UUID.fromString(id));
}
debug.debug(LogMessages.CM_JOB, "Exited");
}
- public void loopback(Integer id) {
+ public void loopback(String id) {
Map<String, String> mdcSave = Mdc.save();
try {
String url = env.getProperty("cmso.dispatch.url", "http://localhost:8089");
@@ -125,7 +126,7 @@ public class CmJob implements Job {
String pass = pm.getProperty("mechid.pass", "");
Client client = ClientBuilder.newClient();
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(new CMSOClientFilters());
+ client.register(new CmsoClientFilters());
WebTarget target = client.target(url);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = null;
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/DispatchJob.java b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/DispatchJob.java
index cb8597f..60d8bdb 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/DispatchJob.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/DispatchJob.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,8 @@ import java.net.InetAddress;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
+import java.util.UUID;
+
import org.onap.optf.cmso.common.CMSStatusEnum;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.model.ChangeManagementGroup;
@@ -52,6 +54,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
+
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.att.eelf.i18n.EELFResourceManager;
@@ -86,15 +89,15 @@ public class DispatchJob {
@Autowired
Environment env;
- public void execute(Integer id) throws JobExecutionException {
+ public void execute(UUID id) throws JobExecutionException {
debug.debug(LogMessages.CM_JOB, "Entered");
try {
// No other instance can read this cmso until we are done.
ChangeManagementSchedule cmSchedule = cmScheduleDAO.lockOne(id);
cmSchedule.setDispatcherInstance(InetAddress.getLocalHost().getHostAddress());
- ChangeManagementGroup group = cmGroupDAO.findById(cmSchedule.getChangeManagementGroupsId()).orElse(null);
+ ChangeManagementGroup group = cmGroupDAO.findById(cmSchedule.getChangeManagementGroupUuid()).orElse(null);
if (group != null) {
- Schedule schedule = scheduleDAO.findById(group.getSchedulesId()).orElse(null);
+ Schedule schedule = scheduleDAO.findById(group.getSchedulesUuid()).orElse(null);
if (schedule != null) {
schedule.setStatus(CMSStatusEnum.NotificationsInitiated.toString());
if (safeToDispatch(cmSchedule, schedule))
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispacherService.java b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispacherService.java
index adc3260..3c53759 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispacherService.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispacherService.java
@@ -59,7 +59,7 @@ public interface DispacherService {
@ApiOperation(value = "", notes = "Does dispsatch of provided cm schedule id.", response = Integer.class)
@ApiResponses(
value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Request failed")})
- public Response dispatchSchedule(@ApiParam(value = "Identifier", allowMultiple = false) @PathParam("id") Integer id,
+ public Response dispatchSchedule(@ApiParam(value = "Identifier", allowMultiple = false) @PathParam("id") String id,
@Context UriInfo uri, @Context HttpServletRequest request);
// ******************************************************************
@@ -70,7 +70,7 @@ public interface DispacherService {
@ApiResponses(
value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Request failed")})
public Response dispatchOptimizer(
- @ApiParam(value = "Identifier", allowMultiple = false) @PathParam("id") Integer id, @Context UriInfo uri,
+ @ApiParam(value = "Identifier", allowMultiple = false) @PathParam("id") String id, @Context UriInfo uri,
@Context HttpServletRequest request);
// ******************************************************************
@@ -81,7 +81,7 @@ public interface DispacherService {
@ApiResponses(
value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Request failed")})
public Response dispatchScheduleStatus(
- @ApiParam(value = "Identifier", allowMultiple = false) @PathParam("id") Integer id, @Context UriInfo uri,
+ @ApiParam(value = "Identifier", allowMultiple = false) @PathParam("id") String id, @Context UriInfo uri,
@Context HttpServletRequest request);
// ******************************************************************
@@ -91,7 +91,7 @@ public interface DispacherService {
@ApiOperation(value = "", notes = "Does dispsatch of provided cm schedule id.", response = Integer.class)
@ApiResponses(
value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Request failed")})
- public Response dispatchSoStatus(@ApiParam(value = "Identifier", allowMultiple = true) @PathParam("id") Integer id,
+ public Response dispatchSoStatus(@ApiParam(value = "Identifier", allowMultiple = true) @PathParam("id") String id,
@Context UriInfo uri, @Context HttpServletRequest request);
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispatcherServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispatcherServiceImpl.java
index 67a69cb..e612734 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispatcherServiceImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/dispatcher/rs/DispatcherServiceImpl.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,25 +31,23 @@
package org.onap.optf.cmso.dispatcher.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.dispatcher.DispatchJob;
-import org.onap.optf.cmso.optimizer.CMSOptimizerClient;
+import org.onap.optf.cmso.optimizer.CmsoOptimizerClient;
import org.onap.optf.cmso.sostatus.MsoStatusClient;
import org.onap.optf.cmso.ticketmgt.TmStatusClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
@Controller
public class DispatcherServiceImpl implements DispacherService {
- private static EELFLogger log = EELFManager.getInstance().getLogger(DispatcherServiceImpl.class);
private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@@ -58,7 +56,7 @@ public class DispatcherServiceImpl implements DispacherService {
DispatchJob dispatchJob;
@Autowired
- CMSOptimizerClient optimizerClient;
+ CmsoOptimizerClient optimizerClient;
@Autowired
TmStatusClient tmStatusClient;
@@ -68,10 +66,11 @@ public class DispatcherServiceImpl implements DispacherService {
@Override
@Transactional
- public Response dispatchSchedule(Integer id, UriInfo uri, HttpServletRequest request) {
+ public Response dispatchSchedule(String id, UriInfo uri, HttpServletRequest request) {
debug.debug("dispatchSchedule entered {}" , id);
try {
- dispatchJob.execute(id);
+ UUID uuid = UUID.fromString(id);
+ dispatchJob.execute(uuid);
} catch (Exception e) {
errors.error(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
debug.error(e.getMessage(), e);
@@ -82,22 +81,23 @@ public class DispatcherServiceImpl implements DispacherService {
@Override
@Transactional
- public Response dispatchOptimizer(Integer id, UriInfo uri, HttpServletRequest request) {
+ public Response dispatchOptimizer(String id, UriInfo uri, HttpServletRequest request) {
debug.debug("dispatchOptimizer entered {}", id);
try {
- optimizerClient.scheduleOptimization(id);
+ UUID uuid = UUID.fromString(id);
+ optimizerClient.scheduleOptimization(uuid);
} catch (Exception e) {
errors.error(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
debug.error(e.getMessage(), e);
}
Response response = Response.ok().build();
- audit.info("dispatchSNIRO");
+ audit.info("dispatchOptimizer");
return response;
}
@Override
@Transactional
- public Response dispatchScheduleStatus(Integer id, UriInfo uri, HttpServletRequest request) {
+ public Response dispatchScheduleStatus(String id, UriInfo uri, HttpServletRequest request) {
debug.debug("dispatchScheduleStatus entered {}", id);
try {
tmStatusClient.checkStatus(id);
@@ -111,7 +111,7 @@ public class DispatcherServiceImpl implements DispacherService {
@Override
@Transactional
- public Response dispatchSoStatus(Integer id, UriInfo uri, HttpServletRequest request) {
+ public Response dispatchSoStatus(String id, UriInfo uri, HttpServletRequest request) {
debug.debug("dispatchSoStatus entered {}", id);
try {
msoStatusClient.execute(id);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CMSQueueJob.java b/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CMSQueueJob.java
index 59df59f..86fa038 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CMSQueueJob.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CMSQueueJob.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -61,7 +61,6 @@ import com.att.eelf.configuration.EELFManager;
*/
@Component
public class CMSQueueJob {
- private static EELFLogger log = EELFManager.getInstance().getLogger(CMSQueueJob.class);
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
@@ -87,9 +86,9 @@ public class CMSQueueJob {
return false;
for (ChangeManagementSchedule schedule : schedules) {
try {
- if (!dispatchedEventList.isAlreadyDispatched(schedule.getId())) {
+ if (!dispatchedEventList.isAlreadyDispatched(schedule.getUuid())) {
scheduleCmJob(schedule);
- dispatchedEventList.addToDispathcedEventList(schedule.getId());
+ dispatchedEventList.addToDispathcedEventList(schedule.getUuid());
}
} catch (org.quartz.SchedulerException e) {
debug.debug(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
@@ -118,7 +117,7 @@ public class CMSQueueJob {
dispatchTime = startTime - dispatherLeadTime;
JobDetail jobDetail = JobBuilder.newJob(CmJob.class).build();
- jobDetail.getJobDataMap().put("key", schedule.getId());
+ jobDetail.getJobDataMap().put("key", schedule.getUuid().toString());
TriggerBuilder<Trigger> tb = TriggerBuilder.newTrigger().forJob(jobDetail);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CmQuartzJob.java b/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CmQuartzJob.java
index f3d98b3..9e1159a 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CmQuartzJob.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/eventq/CmQuartzJob.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2018 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -52,7 +52,6 @@ import com.att.eelf.configuration.EELFManager;
@Component
@DisallowConcurrentExecution
public class CmQuartzJob extends QuartzJobBean {
- private static EELFLogger log = EELFManager.getInstance().getLogger(CmQuartzJob.class);
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/eventq/DispatchedEventList.java b/cmso-service/src/main/java/org/onap/optf/cmso/eventq/DispatchedEventList.java
index 0c346d3..3e02cd1 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/eventq/DispatchedEventList.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/eventq/DispatchedEventList.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,6 +33,8 @@ package org.onap.optf.cmso.eventq;
import java.util.HashSet;
import java.util.Set;
+import java.util.UUID;
+
import org.springframework.stereotype.Component;
/**
@@ -45,18 +47,18 @@ import org.springframework.stereotype.Component;
@Component
public class DispatchedEventList {
- private Set<Integer> list = new HashSet<>();
+ private Set<UUID> list = new HashSet<>();
- public synchronized void addToDispathcedEventList(Integer id) {
+ public synchronized void addToDispathcedEventList(UUID id) {
list.add(id);
}
- public synchronized void remove(Integer id) {
+ public synchronized void remove(UUID id) {
list.remove(id);
}
- public synchronized boolean isAlreadyDispatched(Integer id) {
- return list.contains(id);
+ public synchronized boolean isAlreadyDispatched(UUID uuid) {
+ return list.contains(uuid);
}
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/filters/CMSOClientFilters.java b/cmso-service/src/main/java/org/onap/optf/cmso/filters/CmsoClientFilters.java
index 5e29607..3f040ae 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/filters/CMSOClientFilters.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/filters/CmsoClientFilters.java
@@ -1,91 +1,83 @@
-/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.filters;
-
-import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
-
-import java.io.IOException;
-
-import javax.ws.rs.client.ClientRequestContext;
-import javax.ws.rs.client.ClientRequestFilter;
-import javax.ws.rs.client.ClientResponseContext;
-import javax.ws.rs.client.ClientResponseFilter;
-import javax.ws.rs.core.MultivaluedMap;
-
-import org.onap.observations.Mdc;
-import org.onap.observations.Observation;
-import org.onap.optf.cmso.common.LogMessages;
-import org.onap.optf.cmso.filters.MessageHeaders.HeadersEnum;
-import org.onap.optf.cmso.service.rs.CMSOServiceImpl;
-import org.slf4j.MDC;
-import org.springframework.stereotype.Component;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
-@Component
-public class CMSOClientFilters implements ClientRequestFilter, ClientResponseFilter {
-
- private static EELFLogger log = EELFManager.getInstance().getLogger(CMSOServiceImpl.class);
- private static String appId = "cmso";
-
- @Override
- public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
- // On the way back
- Mdc.metricEnd(responseContext);
- Mdc.setCaller(17);
- Observation.report(LogMessages.OUTGOING_MESSAGE_RETURNED,
- requestContext.getMethod(),
- requestContext.getUri().getPath().toString(),
- responseContext.getStatusInfo().toString());
- }
-
- @Override
- public void filter(ClientRequestContext requestContext) throws IOException {
- // On the way out
- Mdc.metricStart(requestContext);
- Mdc.setCaller(17);
- Observation.report(LogMessages.OUTGOING_MESSAGE,
- requestContext.getMethod(),
- requestContext.getUri().getPath().toString());
- MultivaluedMap<String, Object> headers = requestContext.getHeaders();
-
- String transactionId = (String) headers.getFirst(MessageHeaders.HeadersEnum.TransactionID.toString());
- String mdcId = MDC.get(MDC_KEY_REQUEST_ID);
- if (transactionId == null || transactionId.equals(""))
- if (mdcId != null)
- headers.add(HeadersEnum.TransactionID.toString(), mdcId);
- headers.add(HeadersEnum.FromAppID.toString(), appId);
- }
-
-}
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.filters;
+
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+import java.io.IOException;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.client.ClientResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import org.onap.observations.Mdc;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.filters.MessageHeaders.HeadersEnum;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Component;
+
+// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+@Component
+public class CmsoClientFilters implements ClientRequestFilter, ClientResponseFilter {
+
+ private static String appId = "cmso";
+
+ @Override
+ public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
+ // On the way back
+ Mdc.metricEnd(responseContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE_RETURNED,
+ requestContext.getMethod(),
+ requestContext.getUri().getPath().toString(),
+ responseContext.getStatusInfo().toString());
+ }
+
+ @Override
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ // On the way out
+ Mdc.metricStart(requestContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE,
+ requestContext.getMethod(),
+ requestContext.getUri().getPath().toString());
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+
+ String transactionId = (String) headers.getFirst(MessageHeaders.HeadersEnum.TransactionID.toString());
+ String mdcId = MDC.get(MDC_KEY_REQUEST_ID);
+ if (transactionId == null || transactionId.equals(""))
+ if (mdcId != null)
+ headers.add(HeadersEnum.TransactionID.toString(), mdcId);
+ headers.add(HeadersEnum.FromAppID.toString(), appId);
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/filters/CMSOContainerFilters.java b/cmso-service/src/main/java/org/onap/optf/cmso/filters/CmsoContainerFilters.java
index 8b37a71..4c44163 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/filters/CMSOContainerFilters.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/filters/CmsoContainerFilters.java
@@ -1,141 +1,141 @@
-/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.filters;
-
-import java.io.IOException;
-import java.util.UUID;
-
-import javax.annotation.Priority;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.container.ContainerRequestContext;
-import javax.ws.rs.container.ContainerRequestFilter;
-import javax.ws.rs.container.ContainerResponseContext;
-import javax.ws.rs.container.ContainerResponseFilter;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.ext.Provider;
-
-import org.onap.observations.Mdc;
-import org.onap.observations.Observation;
-import org.onap.optf.cmso.common.LogMessages;
-import org.onap.optf.cmso.filters.MessageHeaders.HeadersEnum;
-import org.springframework.stereotype.Component;
-
-@Priority(1)
-@Provider
-@Component
-public class CMSOContainerFilters implements ContainerRequestFilter, ContainerResponseFilter {
-
-
- @Context
- private HttpServletRequest servletRequest;
-
- @Override
- public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
- throws IOException {
- try {
- Mdc.auditEnd(requestContext, responseContext);
- Observation.report(LogMessages.INCOMING_MESSAGE_RESPONSE,
- requestContext.getMethod(),
- requestContext.getUriInfo().getPath().toString(),
- responseContext.getStatusInfo().toString());
- MultivaluedMap<String, String> reqHeaders = requestContext.getHeaders();
- MultivaluedMap<String, Object> respHeaders = responseContext.getHeaders();
- String minorVersion = (String) reqHeaders.getFirst(HeadersEnum.MinorVersion.toString());
- respHeaders.add(HeadersEnum.MinorVersion.toString(), minorVersion);
- respHeaders.add(HeadersEnum.LatestVersion.toString(), MessageHeaders.latestVersion);
- respHeaders.add(HeadersEnum.PatchVersion.toString(), MessageHeaders.patchVersion);
-
- } catch (Exception e) {
- if (e instanceof WebApplicationException) {
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
- } else {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
- }
- }
- }
-
- @Override
- public void filter(ContainerRequestContext requestContext) throws IOException {
- try {
- // On the way in
- Mdc.auditStart(requestContext, servletRequest);
- Observation.report(LogMessages.INCOMING_MESSAGE,
- requestContext.getMethod(),
- requestContext.getUriInfo().getPath().toString());
-
- String majorVersion = requestContext.getUriInfo().getPath();
- if (majorVersion != null) {
-
- if (majorVersion.startsWith("dispatch/"))
- return;
- majorVersion = majorVersion.replaceAll("/.*$", "");
- }
- if (!MessageHeaders.validateMajorVersion(majorVersion)) {
- ResponseBuilder builder = null;
- String response = "Unsupported Major version";
- builder = Response.status(Response.Status.NOT_FOUND).entity(response);
- throw new WebApplicationException(builder.build());
- }
- MultivaluedMap<String, String> headers = requestContext.getHeaders();
- String transactionId = (String) headers.getFirst(HeadersEnum.TransactionID.toString());
- if (transactionId == null) {
- transactionId = UUID.randomUUID().toString();
- headers.add(HeadersEnum.TransactionID.toString(), transactionId);
- }
- String minorVersion = (String) headers.getFirst(HeadersEnum.MinorVersion.toString());
- if (minorVersion == null) {
- minorVersion = MessageHeaders.supportedMajorVersions.get(majorVersion);
- headers.add(HeadersEnum.MinorVersion.toString(), minorVersion);
- }
- if (!MessageHeaders.validateMajorMinorVersion(majorVersion, minorVersion)) {
- ResponseBuilder builder = null;
- String response = "Unsupported API version";
- builder = Response.status(Response.Status.NOT_FOUND).entity(response);
- throw new WebApplicationException(builder.build());
-
- }
- } catch (Exception e) {
- if (e instanceof WebApplicationException) {
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
- throw e;
- } else {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
- }
- }
-
- }
-
-}
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.filters;
+
+import java.io.IOException;
+import java.util.UUID;
+
+import javax.annotation.Priority;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.ext.Provider;
+
+import org.onap.observations.Mdc;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.filters.MessageHeaders.HeadersEnum;
+import org.springframework.stereotype.Component;
+
+@Priority(1)
+@Provider
+@Component
+public class CmsoContainerFilters implements ContainerRequestFilter, ContainerResponseFilter {
+
+
+ @Context
+ private HttpServletRequest servletRequest;
+
+ @Override
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+ try {
+ Mdc.auditEnd(requestContext, responseContext);
+ Observation.report(LogMessages.INCOMING_MESSAGE_RESPONSE,
+ requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString(),
+ responseContext.getStatusInfo().toString());
+ MultivaluedMap<String, String> reqHeaders = requestContext.getHeaders();
+ MultivaluedMap<String, Object> respHeaders = responseContext.getHeaders();
+ String minorVersion = (String) reqHeaders.getFirst(HeadersEnum.MinorVersion.toString());
+ respHeaders.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ respHeaders.add(HeadersEnum.LatestVersion.toString(), MessageHeaders.latestVersion);
+ respHeaders.add(HeadersEnum.PatchVersion.toString(), MessageHeaders.patchVersion);
+
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+ }
+
+ @Override
+ public void filter(ContainerRequestContext requestContext) throws IOException {
+ try {
+ // On the way in
+ Mdc.auditStart(requestContext, servletRequest);
+ Observation.report(LogMessages.INCOMING_MESSAGE,
+ requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString());
+
+ String majorVersion = requestContext.getUriInfo().getPath();
+ if (majorVersion != null) {
+
+ if (majorVersion.startsWith("dispatch/"))
+ return;
+ majorVersion = majorVersion.replaceAll("/.*$", "");
+ }
+ if (!MessageHeaders.validateMajorVersion(majorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported Major version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+ }
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = (String) headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId == null) {
+ transactionId = UUID.randomUUID().toString();
+ headers.add(HeadersEnum.TransactionID.toString(), transactionId);
+ }
+ String minorVersion = (String) headers.getFirst(HeadersEnum.MinorVersion.toString());
+ if (minorVersion == null) {
+ minorVersion = MessageHeaders.supportedMajorVersions.get(majorVersion);
+ headers.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ }
+ if (!MessageHeaders.validateMajorMinorVersion(majorVersion, minorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported API version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+
+ }
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ throw e;
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ApprovalType.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ApprovalType.java
index 121774b..677f5ce 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ApprovalType.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ApprovalType.java
@@ -1,48 +1,42 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model;
import java.io.Serializable;
+import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
/**
* The persistent class for the approval_types database table.
- *
+ *
*/
@Entity
@Table(name = "APPROVAL_TYPES")
@@ -51,8 +45,7 @@ public class ApprovalType implements Serializable {
private static final long serialVersionUID = 1L;
@Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
+ private UUID uuid;
@Column(name = "approval_count")
private Integer approvalCount;
@@ -64,36 +57,82 @@ public class ApprovalType implements Serializable {
@Column(name = "domain")
private String domain;
+ /**
+ * Instantiates a new approval type.
+ */
public ApprovalType() {}
- public Integer getId() {
- return this.id;
+
+ /**
+ * Gets the uuid.
+ *
+ * @return the uuid
+ */
+ public UUID getUuid() {
+ return uuid;
}
- public void setId(Integer id) {
- this.id = id;
+
+ /**
+ * Sets the uuid.
+ *
+ * @param uuid the new uuid
+ */
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
}
+
+ /**
+ * Gets the approval count.
+ *
+ * @return the approval count
+ */
public Integer getApprovalCount() {
return this.approvalCount;
}
+ /**
+ * Sets the approval count.
+ *
+ * @param approvalCount the new approval count
+ */
public void setApprovalCount(Integer approvalCount) {
this.approvalCount = approvalCount;
}
+ /**
+ * Gets the approval type.
+ *
+ * @return the approval type
+ */
public String getApprovalType() {
return this.approvalType;
}
+ /**
+ * Sets the approval type.
+ *
+ * @param approvalType the new approval type
+ */
public void setApprovalType(String approvalType) {
this.approvalType = approvalType;
}
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
public String getDomain() {
return domain;
}
+ /**
+ * Sets the domain.
+ *
+ * @param domain the new domain
+ */
public void setDomain(String domain) {
this.domain = domain;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementChangeWindow.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementChangeWindow.java
index 7224508..f0b1da1 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementChangeWindow.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementChangeWindow.java
@@ -1,54 +1,48 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
+import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.joda.time.format.ISODateTimeFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
/**
* The persistent class for the change_management_change_windows database table.
- *
+ *
*/
@Entity
@Table(name = "CHANGE_MANAGEMENT_CHANGE_WINDOWS")
@@ -59,8 +53,7 @@ public class ChangeManagementChangeWindow implements Serializable {
@JsonIgnore
@Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
+ private UUID uuid;
@JsonIgnore
@Column(name = "finish_time")
@@ -81,55 +74,127 @@ public class ChangeManagementChangeWindow implements Serializable {
private String startTime;
@JsonIgnore
- @Column(name = "change_management_groups_id")
- private Integer changeManagementGroupsId;
+ @Column(name = "change_management_group_uuid")
+ private UUID changeManagementGroupUuid;
+ /**
+ * Instantiates a new change management change window.
+ */
public ChangeManagementChangeWindow() {}
- public Integer getId() {
- return this.id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
+ /**
+ * Gets the finish time.
+ *
+ * @return the finish time
+ */
public String getFinishTime() {
- if (finishTimeMillis != null)
+ if (finishTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(this.finishTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the finish time.
+ *
+ * @param finishTime the new finish time
+ */
public void setFinishTime(String finishTime) {}
+ /**
+ * Gets the start time.
+ *
+ * @return the start time
+ */
public String getStartTime() {
- if (startTimeMillis != null)
+ if (startTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(this.startTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the start time.
+ *
+ * @param startTime the new start time
+ */
public void setStartTime(String startTime) {}
- public Integer getChangeManagementGroupsId() {
- return changeManagementGroupsId;
+
+ /**
+ * Gets the uuid.
+ *
+ * @return the uuid
+ */
+ public UUID getUuid() {
+ return uuid;
}
- public void setChangeManagementGroupsId(Integer changeManagementGroupsId) {
- this.changeManagementGroupsId = changeManagementGroupsId;
+
+ /**
+ * Sets the uuid.
+ *
+ * @param uuid the new uuid
+ */
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
}
+
+
+ /**
+ * Gets the change management group uuid.
+ *
+ * @return the change management group uuid
+ */
+ public UUID getChangeManagementGroupUuid() {
+ return changeManagementGroupUuid;
+ }
+
+
+ /**
+ * Sets the change management group uuid.
+ *
+ * @param changeManagementGroupUuid the new change management group uuid
+ */
+ public void setChangeManagementGroupUuid(UUID changeManagementGroupUuid) {
+ this.changeManagementGroupUuid = changeManagementGroupUuid;
+ }
+
+
+ /**
+ * Gets the finish time millis.
+ *
+ * @return the finish time millis
+ */
public Long getFinishTimeMillis() {
return finishTimeMillis;
}
+ /**
+ * Sets the finish time millis.
+ *
+ * @param finishTimeMillis the new finish time millis
+ */
public void setFinishTimeMillis(Long finishTimeMillis) {
this.finishTimeMillis = finishTimeMillis;
}
+ /**
+ * Gets the start time millis.
+ *
+ * @return the start time millis
+ */
public Long getStartTimeMillis() {
return startTimeMillis;
}
+ /**
+ * Sets the start time millis.
+ *
+ * @param startTimeMillis the new start time millis
+ */
public void setStartTimeMillis(Long startTimeMillis) {
this.startTimeMillis = startTimeMillis;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementDetail.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementDetail.java
index 31c4a2b..304eb03 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementDetail.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementDetail.java
@@ -1,49 +1,46 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Transient;
import org.joda.time.format.ISODateTimeFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
+/**
+ * The Class ChangeManagementDetail.
+ */
@Entity
// @NamedNativeQueries({
@@ -55,12 +52,11 @@ import io.swagger.annotations.ApiModelProperty;
// ),
// })
@ApiModel(value = "Change Management Details",
- description = "VNF information returned for Change Management Schedule Search request")
+ description = "VNF information returned for Change Management Schedule Search request")
public class ChangeManagementDetail {
@Id
@JsonIgnore
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
+ private UUID uuid;
@ApiModelProperty(value = "Name of the VNF.")
@Column(name = "vnf_name")
@@ -91,7 +87,9 @@ public class ChangeManagementDetail {
private Long startTimeMillis;
@ApiModelProperty(
- value = "Start time of this VNF workflow assigned by Scheduler based upon the group start time returned by the optimizer and concurrency.")
+ value = "Start time of this VNF workflow"
+ + " assigned by Scheduler based upon the"
+ + " group start time returned by the optimizer and concurrency.")
@JsonProperty
@Transient
private String startTime;
@@ -168,206 +166,482 @@ public class ChangeManagementDetail {
private String msoTime;
@JsonIgnore
- private Integer schedules_id;
-
+ @Column(name = "schedules_uuid")
+ private UUID schedulesUuid;
+
+ /**
+ * Gets the vnf name.
+ *
+ * @return the vnf name
+ */
public String getVnfName() {
return vnfName;
}
+ /**
+ * Sets the vnf name.
+ *
+ * @param vnfName the new vnf name
+ */
public void setVnfName(String vnfName) {
this.vnfName = vnfName;
}
+ /**
+ * Gets the vnf id.
+ *
+ * @return the vnf id
+ */
public String getVnfId() {
return vnfId;
}
+ /**
+ * Sets the vnf id.
+ *
+ * @param vnfId the new vnf id
+ */
public void setVnfId(String vnfId) {
this.vnfId = vnfId;
}
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
public String getStatus() {
return status;
}
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
public void setStatus(String status) {
this.status = status;
}
+ /**
+ * Gets the tm change id.
+ *
+ * @return the tm change id
+ */
public String getTmChangeId() {
return tmChangeId;
}
+ /**
+ * Sets the tm change id.
+ *
+ * @param tmChangeId the new tm change id
+ */
public void setTmChangeId(String tmChangeId) {
this.tmChangeId = tmChangeId;
}
+ /**
+ * Gets the start time.
+ *
+ * @return the start time
+ */
public String getStartTime() {
if (startTimeMillis != null)
return ISODateTimeFormat.dateTimeNoMillis().print(startTimeMillis);
return null;
}
+ /**
+ * Sets the start time.
+ *
+ * @param startTime the new start time
+ */
public void setStartTime(String startTime) {}
+ /**
+ * Gets the finish time.
+ *
+ * @return the finish time
+ */
public String getFinishTime() {
if (finishTimeMillis != null)
return ISODateTimeFormat.dateTimeNoMillis().print(finishTimeMillis);
return null;
}
+ /**
+ * Sets the finish time.
+ *
+ * @param finishTime the new finish time
+ */
public void setFinishTime(String finishTime) {}
+ /**
+ * Gets the group id.
+ *
+ * @return the group id
+ */
public String getGroupId() {
return groupId;
}
+ /**
+ * Sets the group id.
+ *
+ * @param groupId the new group id
+ */
public void setGroupId(String groupId) {
this.groupId = groupId;
}
+ /**
+ * Gets the last instance start time.
+ *
+ * @return the last instance start time
+ */
public String getLastInstanceStartTime() {
- if (lastInstanceStartTimeMillis != null)
+ if (lastInstanceStartTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(lastInstanceStartTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the last instance start time.
+ *
+ * @param lastInstanceStartTime the new last instance start time
+ */
public void setLastInstanceStartTime(String lastInstanceStartTime) {}
+ /**
+ * Gets the policy id.
+ *
+ * @return the policy id
+ */
public String getPolicyId() {
return policyId;
}
+ /**
+ * Sets the policy id.
+ *
+ * @param policyId the new policy id
+ */
public void setPolicyId(String policyId) {
this.policyId = policyId;
}
- public Integer getSchedulesId() {
- return schedules_id;
+
+ /**
+ * Gets the uuid.
+ *
+ * @return the uuid
+ */
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ /**
+ * Sets the uuid.
+ *
+ * @param uuid the new uuid
+ */
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+
+
+ /**
+ * Gets the schedules uuid.
+ *
+ * @return the schedules uuid
+ */
+ public UUID getSchedulesUuid() {
+ return schedulesUuid;
}
- public void setSchedulesId(Integer schedules_id) {
- this.schedules_id = schedules_id;
+ /**
+ * Sets the schedules uuid.
+ *
+ * @param schedulesUuid the new schedules uuid
+ */
+ public void setSchedulesUuid(UUID schedulesUuid) {
+ this.schedulesUuid = schedulesUuid;
}
+ /**
+ * Gets the start time millis.
+ *
+ * @return the start time millis
+ */
public Long getStartTimeMillis() {
return startTimeMillis;
}
+ /**
+ * Sets the start time millis.
+ *
+ * @param startTimeMillis the new start time millis
+ */
public void setStartTimeMillis(Long startTimeMillis) {
this.startTimeMillis = startTimeMillis;
}
+ /**
+ * Gets the finish time millis.
+ *
+ * @return the finish time millis
+ */
public Long getFinishTimeMillis() {
return finishTimeMillis;
}
+ /**
+ * Sets the finish time millis.
+ *
+ * @param finishTimeMillis the new finish time millis
+ */
public void setFinishTimeMillis(Long finishTimeMillis) {
this.finishTimeMillis = finishTimeMillis;
}
+ /**
+ * Gets the last instance start time millis.
+ *
+ * @return the last instance start time millis
+ */
public Long getLastInstanceStartTimeMillis() {
return lastInstanceStartTimeMillis;
}
+ /**
+ * Sets the last instance start time millis.
+ *
+ * @param lastInstanceStartTimeMillis the new last instance start time millis
+ */
public void setLastInstanceStartTimeMillis(Long lastInstanceStartTimeMillis) {
this.lastInstanceStartTimeMillis = lastInstanceStartTimeMillis;
}
+ /**
+ * Gets the tm status.
+ *
+ * @return the tm status
+ */
public String getTmStatus() {
return tmStatus;
}
+ /**
+ * Sets the tm status.
+ *
+ * @param tmStatus the new tm status
+ */
public void setTmStatus(String tmStatus) {
this.tmStatus = tmStatus;
}
+ /**
+ * Gets the tm approval status.
+ *
+ * @return the tm approval status
+ */
public String getTmApprovalStatus() {
return tmApprovalStatus;
}
+ /**
+ * Sets the tm approval status.
+ *
+ * @param tmApprovalStatus the new tm approval status
+ */
public void setTmApprovalStatus(String tmApprovalStatus) {
this.tmApprovalStatus = tmApprovalStatus;
}
+ /**
+ * Gets the mso request id.
+ *
+ * @return the mso request id
+ */
public String getMsoRequestId() {
return msoRequestId;
}
+ /**
+ * Sets the mso request id.
+ *
+ * @param msoRequestId the new mso request id
+ */
public void setMsoRequestId(String msoRequestId) {
this.msoRequestId = msoRequestId;
}
+ /**
+ * Gets the mso status.
+ *
+ * @return the mso status
+ */
public String getMsoStatus() {
return msoStatus;
}
+ /**
+ * Sets the mso status.
+ *
+ * @param msoStatus the new mso status
+ */
public void setMsoStatus(String msoStatus) {
this.msoStatus = msoStatus;
}
+ /**
+ * Gets the mso message.
+ *
+ * @return the mso message
+ */
public String getMsoMessage() {
return msoMessage;
}
+ /**
+ * Sets the mso message.
+ *
+ * @param msoMessage the new mso message
+ */
public void setMsoMessage(String msoMessage) {
this.msoMessage = msoMessage;
}
+ /**
+ * Gets the dispatch time millis.
+ *
+ * @return the dispatch time millis
+ */
public Long getDispatchTimeMillis() {
return dispatchTimeMillis;
}
+ /**
+ * Sets the dispatch time millis.
+ *
+ * @param dispatchTimeMillis the new dispatch time millis
+ */
public void setDispatchTimeMillis(Long dispatchTimeMillis) {
this.dispatchTimeMillis = dispatchTimeMillis;
}
+ /**
+ * Gets the dispatch time.
+ *
+ * @return the dispatch time
+ */
public String getDispatchTime() {
- if (dispatchTimeMillis != null)
+ if (dispatchTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(dispatchTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the dispatch time.
+ *
+ * @param dispatchTime the new dispatch time
+ */
public void setDispatchTime(String dispatchTime) {}
+ /**
+ * Gets the execution completed time millis.
+ *
+ * @return the execution completed time millis
+ */
public Long getExecutionCompletedTimeMillis() {
return executionCompletedTimeMillis;
}
+ /**
+ * Sets the execution completed time millis.
+ *
+ * @param executionCompletedTimeMillis the new execution completed time millis
+ */
public void setExecutionCompletedTimeMillis(Long executionCompletedTimeMillis) {
this.executionCompletedTimeMillis = executionCompletedTimeMillis;
}
+ /**
+ * Gets the execution completed time.
+ *
+ * @return the execution completed time
+ */
public String getExecutionCompletedTime() {
- if (executionCompletedTimeMillis != null)
+ if (executionCompletedTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(executionCompletedTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the execution completed time.
+ *
+ * @param executionCompletedTime the new execution completed time
+ */
public void setExecutionCompletedTime(String executionCompletedTime) {}
+ /**
+ * Gets the status message.
+ *
+ * @return the status message
+ */
public String getStatusMessage() {
return statusMessage;
}
+ /**
+ * Sets the status message.
+ *
+ * @param statusMessage the new status message
+ */
public void setStatusMessage(String statusMessage) {
this.statusMessage = statusMessage;
}
+ /**
+ * Gets the mso time millis.
+ *
+ * @return the mso time millis
+ */
public Long getMsoTimeMillis() {
return msoTimeMillis;
}
+ /**
+ * Sets the mso time millis.
+ *
+ * @param msoTimeMillis the new mso time millis
+ */
public void setMsoTimeMillis(Long msoTimeMillis) {
this.msoTimeMillis = msoTimeMillis;
}
+ /**
+ * Gets the mso time.
+ *
+ * @return the mso time
+ */
public String getMsoTime() {
- if (msoTimeMillis != null)
+ if (msoTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(msoTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the mso time.
+ *
+ * @param msoTime the new mso time
+ */
public void setMsoTime(String msoTime) {}
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementGroup.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementGroup.java
index 6aeb325..2d4790d 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementGroup.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementGroup.java
@@ -1,55 +1,49 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.List;
+import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.joda.time.format.ISODateTimeFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
/**
* The persistent class for the change_management_groups database table.
- *
+ *
*/
@Entity
@Table(name = "CHANGE_MANAGEMENT_GROUPS")
@@ -60,8 +54,7 @@ public class ChangeManagementGroup implements Serializable {
@JsonIgnore
@Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
+ private UUID uuid;
@JsonIgnore
@Column(name = "finish_time")
@@ -95,8 +88,8 @@ public class ChangeManagementGroup implements Serializable {
private String startTime;
@JsonIgnore
- @Column(name = "schedules_id")
- private Integer schedulesId;
+ @Column(name = "schedules_uuid")
+ private UUID schedulesUuid;
@Column(name = "additional_duration_in_secs")
@ApiModelProperty(value = "Time added to the workflow interval to allow for rollback in case of failure.")
@@ -111,7 +104,8 @@ public class ChangeManagementGroup implements Serializable {
private Integer normalDurationInSecs;
@ApiModelProperty(
- value = "The name of the schedule optimization policy used by the change management schedule optimizer.")
+ value = "The name of the schedule optimization policy "
+ + "used by the change management schedule optimizer.")
@Column(name = "policy_id")
private String policyId;
@@ -120,118 +114,270 @@ public class ChangeManagementGroup implements Serializable {
@Transient
private List<ChangeManagementSchedule> changeManagementSchedules;
+ /**
+ * Instantiates a new change management group.
+ */
public ChangeManagementGroup() {}
- public Integer getId() {
- return this.id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
+ /**
+ * Gets the finish time.
+ *
+ * @return the finish time
+ */
public String getFinishTime() {
- if (finishTimeMillis != null)
+ if (finishTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(this.finishTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the finish time.
+ *
+ * @param finishTime the new finish time
+ */
public void setFinishTime(String finishTime) {}
+ /**
+ * Gets the group id.
+ *
+ * @return the group id
+ */
public String getGroupId() {
return this.groupId;
}
+ /**
+ * Sets the group id.
+ *
+ * @param groupId the new group id
+ */
public void setGroupId(String groupId) {
this.groupId = groupId;
}
+ /**
+ * Gets the last instance start time.
+ *
+ * @return the last instance start time
+ */
public String getLastInstanceStartTime() {
- if (lastInstanceStartTimeMillis != null)
+ if (lastInstanceStartTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(this.lastInstanceStartTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the last instance start time.
+ *
+ * @param lastInstanceStartTime the new last instance start time
+ */
public void setLastInstanceStartTime(String lastInstanceStartTime) {}
+ /**
+ * Gets the start time.
+ *
+ * @return the start time
+ */
public String getStartTime() {
- if (startTimeMillis != null)
+ if (startTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(this.startTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the start time.
+ *
+ * @param startTime the new start time
+ */
public void setStartTime(String startTime) {}
- public Integer getSchedulesId() {
- return schedulesId;
- }
-
- public void setSchedulesId(Integer schedulesId) {
- this.schedulesId = schedulesId;
- }
+ /**
+ * Gets the additional duration in secs.
+ *
+ * @return the additional duration in secs
+ */
public Integer getAdditionalDurationInSecs() {
return additionalDurationInSecs;
}
+ /**
+ * Sets the additional duration in secs.
+ *
+ * @param additionalDurationInSecs the new additional duration in secs
+ */
public void setAdditionalDurationInSecs(Integer additionalDurationInSecs) {
this.additionalDurationInSecs = additionalDurationInSecs;
}
+ /**
+ * Gets the concurrency limit.
+ *
+ * @return the concurrency limit
+ */
public Integer getConcurrencyLimit() {
return concurrencyLimit;
}
+ /**
+ * Sets the concurrency limit.
+ *
+ * @param concurrencyLimit the new concurrency limit
+ */
public void setConcurrencyLimit(Integer concurrencyLimit) {
this.concurrencyLimit = concurrencyLimit;
}
+ /**
+ * Gets the normal duration in secs.
+ *
+ * @return the normal duration in secs
+ */
public Integer getNormalDurationInSecs() {
return normalDurationInSecs;
}
+ /**
+ * Sets the normal duration in secs.
+ *
+ * @param normalDurationInSecs the new normal duration in secs
+ */
public void setNormalDurationInSecs(Integer normalDurationInSecs) {
this.normalDurationInSecs = normalDurationInSecs;
}
+ /**
+ * Gets the policy id.
+ *
+ * @return the policy id
+ */
public String getPolicyId() {
return policyId;
}
+ /**
+ * Sets the policy id.
+ *
+ * @param policyId the new policy id
+ */
public void setPolicyId(String policyId) {
this.policyId = policyId;
}
+ /**
+ * Gets the finish time millis.
+ *
+ * @return the finish time millis
+ */
public Long getFinishTimeMillis() {
return finishTimeMillis;
}
+ /**
+ * Sets the finish time millis.
+ *
+ * @param finishTimeMillis the new finish time millis
+ */
public void setFinishTimeMillis(Long finishTimeMillis) {
this.finishTimeMillis = finishTimeMillis;
}
+ /**
+ * Gets the last instance start time millis.
+ *
+ * @return the last instance start time millis
+ */
public Long getLastInstanceStartTimeMillis() {
return lastInstanceStartTimeMillis;
}
+ /**
+ * Sets the last instance start time millis.
+ *
+ * @param lastInstanceStartTimeMillis the new last instance start time millis
+ */
public void setLastInstanceStartTimeMillis(Long lastInstanceStartTimeMillis) {
this.lastInstanceStartTimeMillis = lastInstanceStartTimeMillis;
}
+ /**
+ * Gets the start time millis.
+ *
+ * @return the start time millis
+ */
public Long getStartTimeMillis() {
return startTimeMillis;
}
+ /**
+ * Sets the start time millis.
+ *
+ * @param startTimeMillis the new start time millis
+ */
public void setStartTimeMillis(Long startTimeMillis) {
this.startTimeMillis = startTimeMillis;
}
+ /**
+ * Gets the change management schedules.
+ *
+ * @return the change management schedules
+ */
public List<ChangeManagementSchedule> getChangeManagementSchedules() {
return changeManagementSchedules;
}
+ /**
+ * Sets the change management schedules.
+ *
+ * @param changeManagementSchedules the new change management schedules
+ */
public void setChangeManagementSchedules(List<ChangeManagementSchedule> changeManagementSchedules) {
this.changeManagementSchedules = changeManagementSchedules;
}
+
+ /**
+ * Gets the uuid.
+ *
+ * @return the uuid
+ */
+ public UUID getUuid() {
+ return uuid;
+ }
+
+
+ /**
+ * Sets the uuid.
+ *
+ * @param uuid the new uuid
+ */
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+
+ /**
+ * Gets the schedules uuid.
+ *
+ * @return the schedules uuid
+ */
+ public UUID getSchedulesUuid() {
+ return schedulesUuid;
+ }
+
+
+ /**
+ * Sets the schedules uuid.
+ *
+ * @param schedulesUuid the new schedules uuid
+ */
+ public void setSchedulesUuid(UUID schedulesUuid) {
+ this.schedulesUuid = schedulesUuid;
+ }
+
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementSchedule.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementSchedule.java
index 9690290..f9dd418 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementSchedule.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ChangeManagementSchedule.java
@@ -1,55 +1,49 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
+import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.joda.time.format.ISODateTimeFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
/**
* The persistent class for the change_management_schedules database table.
- *
+ *
*/
@Entity
@Table(name = "CHANGE_MANAGEMENT_SCHEDULES")
@@ -61,8 +55,7 @@ public class ChangeManagementSchedule implements Serializable {
@JsonIgnore
@Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
+ private UUID uuid;
@ApiModelProperty(value = "TM Change Id")
@Column(name = "tm_change_id")
@@ -90,7 +83,9 @@ public class ChangeManagementSchedule implements Serializable {
private Long startTimeMillis;
@ApiModelProperty(
- value = "Start time of this VNF workflow assigned by Scheduler based upon the group start time returned by the optimizer and concurrency.")
+ value = "Start time of this VNF workflow assigned by "
+ + "Scheduler based upon the group start"
+ + " time returned by the optimizer and concurrency.")
@JsonProperty
@Transient
private String startTime;
@@ -107,9 +102,9 @@ public class ChangeManagementSchedule implements Serializable {
@Column(name = "vnf_name")
private String vnfName;
- @Column(name = "change_management_groups_id")
+ @Column(name = "change_management_group_uuid")
@JsonIgnore
- private Integer changeManagementGroupsId;
+ private UUID changeManagementGroupUuid;
@JsonIgnore
@Column(name = "dispatch_time")
@@ -160,190 +155,448 @@ public class ChangeManagementSchedule implements Serializable {
@Transient
private String msoTime;
- public ChangeManagementSchedule() {}
-
- public Integer getId() {
- return this.id;
- }
+ @ApiModelProperty(value = "Change equest.")
+ @Lob
+ @Column(name = "request")
+ private String request;
- public void setId(Integer id) {
- this.id = id;
- }
+ /**
+ * Instantiates a new change management schedule.
+ */
+ public ChangeManagementSchedule() {}
+ /**
+ * Gets the finish time.
+ *
+ * @return the finish time
+ */
public String getFinishTime() {
- if (finishTimeMillis != null)
+ if (finishTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(finishTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the finish time.
+ *
+ * @param finishTime the new finish time
+ */
public void setFinishTime(String finishTime) {}
+ /**
+ * Gets the start time.
+ *
+ * @return the start time
+ */
public String getStartTime() {
- if (startTimeMillis != null)
+ if (startTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(startTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the start time.
+ *
+ * @param startTime the new start time
+ */
public void setStartTime(String startTime) {}
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
public String getStatus() {
return this.status;
}
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
public void setStatus(String status) {
this.status = status;
}
+ /**
+ * Gets the vnf id.
+ *
+ * @return the vnf id
+ */
public String getVnfId() {
return this.vnfId;
}
+ /**
+ * Sets the vnf id.
+ *
+ * @param vnfId the new vnf id
+ */
public void setVnfId(String vnfId) {
this.vnfId = vnfId;
}
+ /**
+ * Gets the vnf name.
+ *
+ * @return the vnf name
+ */
public String getVnfName() {
return this.vnfName;
}
+ /**
+ * Sets the vnf name.
+ *
+ * @param vnfName the new vnf name
+ */
public void setVnfName(String vnfName) {
this.vnfName = vnfName;
}
+ /**
+ * Gets the tm change id.
+ *
+ * @return the tm change id
+ */
public String getTmChangeId() {
return tmChangeId;
}
+ /**
+ * Sets the tm change id.
+ *
+ * @param tmChangeId the new tm change id
+ */
public void setTmChangeId(String tmChangeId) {
this.tmChangeId = tmChangeId;
}
- public Integer getChangeManagementGroupsId() {
- return changeManagementGroupsId;
+
+ /**
+ * Gets the uuid.
+ *
+ * @return the uuid
+ */
+ public UUID getUuid() {
+ return uuid;
}
- public void setChangeManagementGroupsId(Integer changeManagementGroupsId) {
- this.changeManagementGroupsId = changeManagementGroupsId;
+ /**
+ * Sets the uuid.
+ *
+ * @param uuid the new uuid
+ */
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+
+ /**
+ * Gets the change management group uuid.
+ *
+ * @return the change management group uuid
+ */
+ public UUID getChangeManagementGroupUuid() {
+ return changeManagementGroupUuid;
}
+ /**
+ * Sets the change management group uuid.
+ *
+ * @param changeManagementGroupUuid the new change management group uuid
+ */
+ public void setChangeManagementGroupUuid(UUID changeManagementGroupUuid) {
+ this.changeManagementGroupUuid = changeManagementGroupUuid;
+ }
+
+ /**
+ * Gets the dispatch time.
+ *
+ * @return the dispatch time
+ */
public String getDispatchTime() {
- if (dispatchTimeMillis != null)
+ if (dispatchTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(dispatchTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the dispatch time.
+ *
+ * @param dispatchTime the new dispatch time
+ */
public void setDispatchTime(String dispatchTime) {}
+ /**
+ * Gets the dispatcher instance.
+ *
+ * @return the dispatcher instance
+ */
public String getDispatcherInstance() {
return dispatcherInstance;
}
+ /**
+ * Sets the dispatcher instance.
+ *
+ * @param dispatcherInstance the new dispatcher instance
+ */
public void setDispatcherInstance(String dispatcherInstance) {
this.dispatcherInstance = dispatcherInstance;
}
+ /**
+ * Gets the execution completed time.
+ *
+ * @return the execution completed time
+ */
public String getExecutionCompletedTime() {
- if (executionCompletedTimeMillis != null)
+ if (executionCompletedTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(executionCompletedTimeMillis);
+ }
return null;
}
+ /**
+ * Sets the execution completed time.
+ *
+ * @param executionCompletedTime the new execution completed time
+ */
public void setExecutionCompletedTime(String executionCompletedTime) {}
+ /**
+ * Gets the mso request id.
+ *
+ * @return the mso request id
+ */
public String getMsoRequestId() {
return msoRequestId;
}
+ /**
+ * Sets the mso request id.
+ *
+ * @param msoRequestId the new mso request id
+ */
public void setMsoRequestId(String msoRequestId) {
this.msoRequestId = msoRequestId;
}
+ /**
+ * Gets the status message.
+ *
+ * @return the status message
+ */
public String getStatusMessage() {
return statusMessage;
}
+ /**
+ * Sets the status message.
+ *
+ * @param statusMessage the new status message
+ */
public void setStatusMessage(String statusMessage) {
this.statusMessage = statusMessage;
}
+ /**
+ * Gets the finish time millis.
+ *
+ * @return the finish time millis
+ */
public Long getFinishTimeMillis() {
return finishTimeMillis;
}
+ /**
+ * Sets the finish time millis.
+ *
+ * @param finishTimeMillis the new finish time millis
+ */
public void setFinishTimeMillis(Long finishTimeMillis) {
this.finishTimeMillis = finishTimeMillis;
}
+ /**
+ * Gets the start time millis.
+ *
+ * @return the start time millis
+ */
public Long getStartTimeMillis() {
return startTimeMillis;
}
+ /**
+ * Sets the start time millis.
+ *
+ * @param startTimeMillis the new start time millis
+ */
public void setStartTimeMillis(Long startTimeMillis) {
this.startTimeMillis = startTimeMillis;
}
+ /**
+ * Gets the dispatch time millis.
+ *
+ * @return the dispatch time millis
+ */
public Long getDispatchTimeMillis() {
return dispatchTimeMillis;
}
+ /**
+ * Sets the dispatch time millis.
+ *
+ * @param dispatchTimeMillis the new dispatch time millis
+ */
public void setDispatchTimeMillis(Long dispatchTimeMillis) {
this.dispatchTimeMillis = dispatchTimeMillis;
}
+ /**
+ * Gets the execution completed time millis.
+ *
+ * @return the execution completed time millis
+ */
public Long getExecutionCompletedTimeMillis() {
return executionCompletedTimeMillis;
}
+ /**
+ * Sets the execution completed time millis.
+ *
+ * @param executionCompletedTimeMillis the new execution completed time millis
+ */
public void setExecutionCompletedTimeMillis(Long executionCompletedTimeMillis) {
this.executionCompletedTimeMillis = executionCompletedTimeMillis;
}
+ /**
+ * Gets the mso status.
+ *
+ * @return the mso status
+ */
public String getMsoStatus() {
return msoStatus;
}
+ /**
+ * Sets the mso status.
+ *
+ * @param msoStatus the new mso status
+ */
public void setMsoStatus(String msoStatus) {
this.msoStatus = msoStatus;
}
+ /**
+ * Gets the mso message.
+ *
+ * @return the mso message
+ */
public String getMsoMessage() {
return msoMessage;
}
+ /**
+ * Sets the mso message.
+ *
+ * @param msoMessage the new mso message
+ */
public void setMsoMessage(String msoMessage) {
this.msoMessage = msoMessage;
}
+ /**
+ * Gets the mso time millis.
+ *
+ * @return the mso time millis
+ */
public Long getMsoTimeMillis() {
return msoTimeMillis;
}
+ /**
+ * Sets the mso time millis.
+ *
+ * @param msoTimeMillis the new mso time millis
+ */
public void setMsoTimeMillis(Long msoTimeMillis) {
this.msoTimeMillis = msoTimeMillis;
}
+ /**
+ * Gets the mso time.
+ *
+ * @return the mso time
+ */
public String getMsoTime() {
- if (msoTimeMillis != null)
+ if (msoTimeMillis != null) {
return ISODateTimeFormat.dateTimeNoMillis().print(msoTimeMillis);
+ }
return null;
}
protected void setMsoTime(String msoTime) {}
+ /**
+ * Gets the tm status.
+ *
+ * @return the tm status
+ */
public String getTmStatus() {
return tmStatus;
}
+ /**
+ * Sets the tm status.
+ *
+ * @param tmStatus the new tm status
+ */
public void setTmStatus(String tmStatus) {
this.tmStatus = tmStatus;
}
+ /**
+ * Gets the tm approval status.
+ *
+ * @return the tm approval status
+ */
public String getTmApprovalStatus() {
return tmApprovalStatus;
}
+ /**
+ * Sets the tm approval status.
+ *
+ * @param tmApprovalStatus the new tm approval status
+ */
public void setTmApprovalStatus(String tmApprovalStatus) {
this.tmApprovalStatus = tmApprovalStatus;
}
+ /**
+ * Gets the request.
+ *
+ * @return the request
+ */
+ public String getRequest() {
+ return request;
+ }
+
+ /**
+ * Sets the request.
+ *
+ * @param request the new request
+ */
+ public void setRequest(String request) {
+ this.request = request;
+ }
+
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/Domain.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/Domain.java
index c7af7c5..c8f7e85 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/Domain.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/Domain.java
@@ -1,33 +1,28 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright � 2017-2018 AT&T Intellectual Property. Modifications Copyright � 2018 IBM.
*
- * Licensed 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
+ * Licensed 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
+ * 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.
+ * 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.
*
*
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * https://creativecommons.org/licenses/by/4.0/
+ * https://creativecommons.org/licenses/by/4.0/
*
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.model;
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/DomainData.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/DomainData.java
index fc86964..b08bde9 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/DomainData.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/DomainData.java
@@ -1,47 +1,41 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
*
- * Licensed 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
+ * Licensed 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
+ * 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.
+ * 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.
*
*
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * https://creativecommons.org/licenses/by/4.0/
+ * https://creativecommons.org/licenses/by/4.0/
*
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
import java.io.Serializable;
+import java.util.UUID;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import io.swagger.annotations.ApiModel;
/**
* The persistent class for the domain_data database table.
@@ -56,28 +50,30 @@ public class DomainData implements Serializable {
@JsonIgnore
@Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
+ private UUID uuid;
private String name;
private String value;
@ManyToOne(optional = true)
- @JoinColumn(name = "schedules_id", nullable = false, updatable = false)
+ @JoinColumn(name = "schedules_uuid", nullable = false, updatable = false)
@JsonIgnore
private Schedule schedule;
public DomainData() {}
- public Integer getId() {
- return this.id;
+
+ public UUID getUuid() {
+ return uuid;
}
- public void setId(Integer id) {
- this.id = id;
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
}
+
public String getName() {
return this.name;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ElementData.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ElementData.java
new file mode 100644
index 0000000..b4114a8
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ElementData.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import java.util.UUID;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+
+/**
+ * The persistent class for the domain_data database table.
+ *
+ */
+@Entity
+@Table(name = "ELEMENT_DATA")
+@NamedQuery(name = "ElementData.findAll", query = "SELECT d FROM ElementData d")
+@ApiModel(value = "Element data", description = "Element data represented as name/value pairs")
+public class ElementData implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @JsonIgnore
+ @Id
+ private UUID uuid;
+
+ private String name;
+
+ private String value;
+
+ private UUID changeManagementSchedulesUuid;
+
+ public ElementData() {}
+
+
+ public UUID getUuid() {
+ return uuid;
+ }
+
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+
+ public String getName() {
+ return this.name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+ public UUID getChangeManagementSchedulesUuid() {
+ return changeManagementSchedulesUuid;
+ }
+
+
+ public void setChangeManagementSchedulesUuid(UUID changeManagementSchedulesUuid) {
+ this.changeManagementSchedulesUuid = changeManagementSchedulesUuid;
+ }
+
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/Schedule.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/Schedule.java
index d6fe4f9..200e641 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/Schedule.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/Schedule.java
@@ -1,44 +1,41 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
*
- * Licensed 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
+ * Licensed 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
+ * 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.
+ * 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.
*
*
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * https://creativecommons.org/licenses/by/4.0/
+ * https://creativecommons.org/licenses/by/4.0/
*
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
+import java.util.UUID;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.NamedQuery;
@@ -48,9 +45,6 @@ import javax.persistence.Transient;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.joda.time.format.ISODateTimeFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModelProperty;
/**
* The persistent class for the schedules database table.
@@ -64,8 +58,7 @@ public class Schedule implements Serializable {
@JsonIgnore
@Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
+ private UUID uuid;
@JsonIgnore
@Column(name = "create_date_time")
@@ -160,12 +153,20 @@ public class Schedule implements Serializable {
public Schedule() {}
- public Integer getId() {
- return this.id;
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ public void setDomainData(List<DomainData> domainData) {
+ this.domainData = domainData;
}
- public void setId(Integer id) {
- this.id = id;
+ public void setScheduleApprovals(List<ScheduleApproval> scheduleApprovals) {
+ this.scheduleApprovals = scheduleApprovals;
}
public String getCreateDateTime() {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleApproval.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleApproval.java
index dee3c42..588aede 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleApproval.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleApproval.java
@@ -1,41 +1,39 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
*
- * Licensed 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
+ * Licensed 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
+ * 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.
+ * 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.
*
*
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * https://creativecommons.org/licenses/by/4.0/
+ * https://creativecommons.org/licenses/by/4.0/
*
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.model;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
+import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@@ -43,10 +41,6 @@ import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
import org.joda.time.format.ISODateTimeFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
/**
* The persistent class for the schedule_approvals database table.
@@ -60,9 +54,8 @@ public class ScheduleApproval implements Serializable {
private static final long serialVersionUID = 1L;
@Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
@JsonIgnore
- private Integer id;
+ private UUID uuid;
@JsonIgnore
@Column(name = "approval_date_time")
@@ -82,23 +75,16 @@ public class ScheduleApproval implements Serializable {
private String userId;
@ManyToOne(optional = true)
- @JoinColumn(name = "schedules_id", nullable = false, updatable = false)
+ @JoinColumn(name = "schedules_uuid", nullable = false, updatable = false)
@JsonIgnore
private Schedule schedule;
@JsonIgnore
- @Column(name = "approval_type_id")
- private Integer approvalTypeId;
+ @Column(name = "approval_types_uuid")
+ private UUID approvalTypesUuid;
public ScheduleApproval() {}
- public Integer getId() {
- return this.id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
public String getApprovalDateTime() {
if (approvalDateTimeMillis != null)
@@ -124,13 +110,6 @@ public class ScheduleApproval implements Serializable {
this.userId = userId;
}
- public Integer getApprovalTypeId() {
- return approvalTypeId;
- }
-
- public void setApprovalTypeId(Integer approvalTypeId) {
- this.approvalTypeId = approvalTypeId;
- }
public void setSchedule(Schedule schedule) {
this.schedule = schedule;
@@ -148,4 +127,26 @@ public class ScheduleApproval implements Serializable {
this.approvalDateTimeMillis = approvalDateTimeMillis;
}
+
+ public UUID getUuid() {
+ return uuid;
+ }
+
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+
+ public UUID getApprovalTypesUuid() {
+ return approvalTypesUuid;
+ }
+
+
+ public void setApprovalTypesUuid(UUID approvalTypesUuid) {
+ this.approvalTypesUuid = approvalTypesUuid;
+ }
+
+
+
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleEvent.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleEvent.java
deleted file mode 100644
index 46cb46e..0000000
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleEvent.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-import org.joda.time.format.ISODateTimeFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * The persistent class for the schedule_events database table.
- *
- */
-@Entity
-@Table(name = "SCHEDULE_EVENTS")
-@NamedQuery(name = "ScheduleEvent.findAll", query = "SELECT s FROM ScheduleEvent s")
-public class ScheduleEvent implements Serializable {
- private static final long serialVersionUID = 1L;
-
- @Id
- @GeneratedValue(strategy=GenerationType.IDENTITY)
- private Integer id;
-
- private String domain;
-
- @Lob
- @Column(name = "event_text")
- private String eventText;
-
- @JsonIgnore
- @Column(name = "event_time")
- private Long eventTimeMillis;
-
- @JsonProperty
- @Transient
- private String eventTime;
-
- @JsonIgnore
- @Column(name = "reminder_time")
- private Long reminderTimeMillis;
-
- @JsonProperty
- @Transient
- private String reminderTime;
-
- @Column(name = "schedules_id")
- private Integer schedulesId;
-
- private String status;
-
- public ScheduleEvent() {}
-
- public Integer getId() {
- return this.id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getDomain() {
- return this.domain;
- }
-
- public void setDomain(String domain) {
- this.domain = domain;
- }
-
- public String getEventText() {
- return this.eventText;
- }
-
- public void setEventText(String eventText) {
- this.eventText = eventText;
- }
-
- public Integer getSchedulesId() {
- return this.schedulesId;
- }
-
- public void setSchedulesId(Integer schedulesId) {
- this.schedulesId = schedulesId;
- }
-
- public String getStatus() {
- return this.status;
- }
-
- public void setStatus(String status) {
- this.status = status;
- }
-
- public Long getEventTimeMillis() {
- return eventTimeMillis;
- }
-
- public void setEventTimeMillis(Long eventTimeMillis) {
- this.eventTimeMillis = eventTimeMillis;
- }
-
- public String getEventTime() {
- if (eventTimeMillis != null)
- return ISODateTimeFormat.dateTimeNoMillis().print(this.eventTimeMillis);
- return null;
- }
-
- public void setEventTime(String eventTime) {}
-
- public Long getReminderTimeMillis() {
- return reminderTimeMillis;
- }
-
- public void setReminderTimeMillis(Long reminderTimeMillis) {
- this.reminderTimeMillis = reminderTimeMillis;
- }
-
- public String getReminderTime() {
- if (reminderTimeMillis != null)
- return ISODateTimeFormat.dateTimeNoMillis().print(this.reminderTimeMillis);
- return null;
- }
-
- public void setReminderTime(String reminderTime) {}
-
-}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleQuery.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleQuery.java
index 84d3e5c..24caf1e 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleQuery.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/ScheduleQuery.java
@@ -1,36 +1,32 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
*
- * Licensed 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
+ * Licensed 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
+ * 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.
+ * 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.
*
*
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * https://creativecommons.org/licenses/by/4.0/
+ * https://creativecommons.org/licenses/by/4.0/
*
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.model;
+import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@@ -38,15 +34,16 @@ import javax.persistence.Id;
@Entity
public class ScheduleQuery {
@Id
- @Column(name = "id")
- private Integer id;
+ @Column(name = "uuid")
+ private UUID uuid;
- public Integer getId() {
- return id;
+ public UUID getUuid() {
+ return uuid;
}
- public void setId(Integer id) {
- this.id = id;
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
}
+
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ApprovalTypeDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ApprovalTypeDAO.java
index 7eb2430..9e4b546 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ApprovalTypeDAO.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ApprovalTypeDAO.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,12 +33,14 @@ package org.onap.optf.cmso.model.dao;
import java.util.List;
import java.util.Optional;
+import java.util.UUID;
+
import org.onap.optf.cmso.model.ApprovalType;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
-public interface ApprovalTypeDAO extends PagingAndSortingRepository<ApprovalType, Integer> {
- Optional<ApprovalType> findById(Integer id);
+public interface ApprovalTypeDAO extends PagingAndSortingRepository<ApprovalType, UUID> {
+ Optional<ApprovalType> findById(UUID id);
ApprovalType save(ApprovalType persisted);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementChangeWindowDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementChangeWindowDAO.java
index 293209e..303be20 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementChangeWindowDAO.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementChangeWindowDAO.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,24 +33,26 @@ package org.onap.optf.cmso.model.dao;
import java.util.List;
import java.util.Optional;
+import java.util.UUID;
+
import org.onap.optf.cmso.model.ChangeManagementChangeWindow;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface ChangeManagementChangeWindowDAO
- extends PagingAndSortingRepository<ChangeManagementChangeWindow, Integer> {
- Optional<ChangeManagementChangeWindow> findById(Integer id);
+ extends PagingAndSortingRepository<ChangeManagementChangeWindow, UUID> {
+ Optional<ChangeManagementChangeWindow> findById(UUID id);
ChangeManagementChangeWindow save(ChangeManagementChangeWindow persisted);
void delete(ChangeManagementChangeWindow toDelete);
- @Query(value = "SELECT d FROM ChangeManagementChangeWindow d WHERE d.changeManagementGroupsId = ?1")
- List<ChangeManagementChangeWindow> findByGroupsID(Integer id);
+ @Query(value = "SELECT d FROM ChangeManagementChangeWindow d WHERE d.changeManagementGroupUuid = ?1")
+ List<ChangeManagementChangeWindow> findByGroupsUUID(UUID id);
@Modifying
- @Query(value = "DELETE FROM ChangeManagementChangeWindow d WHERE d.changeManagementGroupsId = ?1")
- int deleteByChangeManagementGroupId(int id);
+ @Query(value = "DELETE FROM ChangeManagementChangeWindow d WHERE d.changeManagementGroupUuid = ?1")
+ int deleteByChangeManagementGroupUuid(UUID id);
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementDetailDAOImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementDetailDAOImpl.java
index 2c083d6..2543c77 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementDetailDAOImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementDetailDAOImpl.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -46,7 +46,7 @@ public class ChangeManagementDetailDAOImpl implements ChangeManagementDetailDAO
@Override
public List<ChangeManagementDetail> searchScheduleDetails(String where, int limit) {
StringBuilder sql = new StringBuilder();
- sql.append("select distinct" + " s.id as id," + " s.vnf_name as vnf_name," + " s.vnf_id as vnf_id,"
+ sql.append("select distinct" + " s.uuid as uuid," + " s.vnf_name as vnf_name," + " s.vnf_id as vnf_id,"
+ " s.status as status," + " s.tm_change_id as tm_change_Id," + " s.start_time as start_time,"
+ " s.finish_time as finish_time," + " s.mso_request_id as mso_request_id,"
+ " s.mso_status as mso_status," + " s.mso_message as mso_message," + " s.mso_time as mso_time,"
@@ -54,22 +54,24 @@ public class ChangeManagementDetailDAOImpl implements ChangeManagementDetailDAO
+ " s.status_message as status_message," + " s.tm_approval_status as tm_approval_status,"
+ " s.tm_status as tm_status," + " g.group_id as group_id,"
+ " g.last_instance_start_time as last_instance_start_time," + " g.policy_id as policy_id,"
- + " g.schedules_id as schedules_id"
+ + " g.schedules_uuid as schedules_uuid"
// + " ss.schedule_id as scheduleId,"
// + " dd.name"
+ " from" + " CHANGE_MANAGEMENT_SCHEDULES s"
- + " inner join CHANGE_MANAGEMENT_GROUPS g on s.change_management_groups_id = g.id"
- + " inner join SCHEDULES ss on g.schedules_id = ss.id "
- + " left outer join DOMAIN_DATA dd on ss.id = dd.schedules_id"
- + " left outer join SCHEDULE_APPROVALS sa on ss.id = sa.schedules_id"
- + " left outer join APPROVAL_TYPES at on sa.approval_type_id = at.id ");
+ + " inner join CHANGE_MANAGEMENT_GROUPS g on s.change_management_group_uuid = g.uuid"
+ + " inner join SCHEDULES ss on g.schedules_uuid = ss.uuid "
+ + " left outer join DOMAIN_DATA dd on ss.uuid = dd.schedules_uuid"
+ + " left outer join SCHEDULE_APPROVALS sa on ss.uuid = sa.schedules_uuid"
+ + " left outer join APPROVAL_TYPES at on sa.approval_types_uuid = at.uuid ");
sql.append(where);
- sql.append(" order by id ");
- if (limit > 0)
+ sql.append(" order by uuid ");
+ if (limit > 0) {
sql.append("LIMIT " + limit);
+ }
- Query q = manager.createNativeQuery(sql.toString(), ChangeManagementDetail.class);
- List<ChangeManagementDetail> list = q.getResultList();
+ Query query = manager.createNativeQuery(sql.toString(), ChangeManagementDetail.class);
+ @SuppressWarnings("unchecked")
+ List<ChangeManagementDetail> list = query.getResultList();
return list;
}
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementGroupDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementGroupDAO.java
index 39f4baa..7acc228 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementGroupDAO.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementGroupDAO.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,21 +33,23 @@ package org.onap.optf.cmso.model.dao;
import java.util.List;
import java.util.Optional;
+import java.util.UUID;
+
import org.onap.optf.cmso.model.ChangeManagementGroup;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
-public interface ChangeManagementGroupDAO extends PagingAndSortingRepository<ChangeManagementGroup, Integer> {
- Optional<ChangeManagementGroup> findById(Integer id);
+public interface ChangeManagementGroupDAO extends PagingAndSortingRepository<ChangeManagementGroup, UUID> {
+ Optional<ChangeManagementGroup> findById(UUID id);
ChangeManagementGroup save(ChangeManagementGroup persisted);
void delete(ChangeManagementGroup toDelete);
- @Query(value = "SELECT d FROM ChangeManagementGroup d WHERE d.schedulesId = ?1")
- List<ChangeManagementGroup> findBySchedulesID(Integer id);
+ @Query(value = "SELECT d FROM ChangeManagementGroup d WHERE d.schedulesUuid = ?1")
+ List<ChangeManagementGroup> findBySchedulesID(UUID id);
- @Query(value = "SELECT d FROM ChangeManagementGroup d WHERE d.schedulesId = ?1 AND d.groupId = ?2")
- ChangeManagementGroup findOneBySchedulesIDGroupID(Integer id, String groupId);
+ @Query(value = "SELECT d FROM ChangeManagementGroup d WHERE d.schedulesUuid = ?1 AND d.groupId = ?2")
+ ChangeManagementGroup findOneBySchedulesIDGroupID(UUID id, String groupId);
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementScheduleDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementScheduleDAO.java
index a089c2b..27a5029 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementScheduleDAO.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ChangeManagementScheduleDAO.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -33,6 +33,7 @@ package org.onap.optf.cmso.model.dao;
import java.util.List;
import java.util.Optional;
+import java.util.UUID;
import javax.persistence.LockModeType;
import org.onap.optf.cmso.model.ChangeManagementSchedule;
import org.springframework.data.jpa.repository.Lock;
@@ -40,22 +41,33 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
-public interface ChangeManagementScheduleDAO extends PagingAndSortingRepository<ChangeManagementSchedule, Integer> {
- Optional<ChangeManagementSchedule> findById(Integer id);
+public interface ChangeManagementScheduleDAO extends PagingAndSortingRepository<ChangeManagementSchedule, UUID> {
+ @Override
+ Optional<ChangeManagementSchedule> findById(UUID id);
+ @Override
ChangeManagementSchedule save(ChangeManagementSchedule persisted);
+ @Override
void delete(ChangeManagementSchedule toDelete);
- @Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE d.changeManagementGroupsId = ?1")
- List<ChangeManagementSchedule> findByChangeManagementGroupId(Integer id);
+ @Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE d.changeManagementGroupUuid = ?1")
+ List<ChangeManagementSchedule> findByChangeManagementGroupId(UUID id);
@Modifying
- @Query(value = "DELETE FROM ChangeManagementSchedule d WHERE d.changeManagementGroupsId = ?1")
- public int deleteByChangeManagementGroupsId(Integer id);
+ @Query(value = "DELETE FROM ChangeManagementSchedule d WHERE d.changeManagementGroupUuid = ?1")
+ public int deleteByChangeManagementGroupsId(UUID id);
+
+ @Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE d.changeManagementGroupUuid = ?1 AND d.vnfName = ?2")
+ ChangeManagementSchedule findOneByGroupUuidAndVnfName(UUID id, String vnfName);
+
+ @Query(value = "SELECT d FROM ChangeManagementSchedule d, ChangeManagementGroup g"
+ + " WHERE g.schedulesUuid = ?1"
+ + " AND g.groupId = ?2"
+ + " AND d.changeManagementGroupUuid = g.uuid"
+ + " AND d.vnfName = ?3")
+ ChangeManagementSchedule findOneByScheduleUUIDGroupIdAndVnfName(UUID id, String groupId, String vnfName);
- @Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE d.changeManagementGroupsId = ?1 AND d.vnfName = ?2")
- ChangeManagementSchedule findOneByGroupIDAndVnfName(Integer id, String vnfName);
@Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE (d.status = ?1 AND d.startTimeMillis <= ?2) or d.status = 'Scheduled Immediate' order by d.startTimeMillis")
List<ChangeManagementSchedule> findByStatusAndEndTime(String status, Long date);
@@ -70,8 +82,8 @@ public interface ChangeManagementScheduleDAO extends PagingAndSortingRepository<
@Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE d.tmApprovalStatus = 'Pending Approval'")
List<ChangeManagementSchedule> findAllAwaitingTmApproval();
- @Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE d.id = ?1")
+ @Query(value = "SELECT d FROM ChangeManagementSchedule d WHERE d.uuid = ?1")
@Lock(LockModeType.PESSIMISTIC_WRITE)
- ChangeManagementSchedule lockOne(Integer id);
+ ChangeManagementSchedule lockOne(UUID id);
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/DomainDataDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/DomainDataDAO.java
index 9556938..75299a1 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/DomainDataDAO.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/DomainDataDAO.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,11 +32,13 @@
package org.onap.optf.cmso.model.dao;
import java.util.Optional;
+import java.util.UUID;
+
import org.onap.optf.cmso.model.DomainData;
import org.springframework.data.repository.PagingAndSortingRepository;
-public interface DomainDataDAO extends PagingAndSortingRepository<DomainData, Integer> {
- Optional<DomainData> findById(Integer id);
+public interface DomainDataDAO extends PagingAndSortingRepository<DomainData, UUID> {
+ Optional<DomainData> findById(UUID id);
DomainData save(DomainData persisted);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/HelloWorld.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ElementDataDAO.java
index ed09ad7..dada4e1 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/HelloWorld.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ElementDataDAO.java
@@ -1,58 +1,49 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model;
-
-public class HelloWorld {
-
- private String message;
-
- public HelloWorld() {
- // needed for deserializer
- }
-
- public HelloWorld(String message) {
- this.message = message;
- }
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
- @Override
- public String toString() {
- return "message = " + getMessage();
- }
-}
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.model.dao;
+
+import java.util.Optional;
+import java.util.UUID;
+import org.onap.optf.cmso.model.ElementData;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+public interface ElementDataDAO extends PagingAndSortingRepository<ElementData, UUID> {
+ @Override
+ Optional<ElementData> findById(UUID id);
+
+ @Override
+ ElementData save(ElementData persisted);
+
+ @Override
+ void delete(ElementData toDelete);
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleApprovalDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleApprovalDAO.java
index d9badd0..3fabd63 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleApprovalDAO.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleApprovalDAO.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,11 +32,13 @@
package org.onap.optf.cmso.model.dao;
import java.util.Optional;
+import java.util.UUID;
+
import org.onap.optf.cmso.model.ScheduleApproval;
import org.springframework.data.repository.PagingAndSortingRepository;
-public interface ScheduleApprovalDAO extends PagingAndSortingRepository<ScheduleApproval, Integer> {
- Optional<ScheduleApproval> findById(Integer id);
+public interface ScheduleApprovalDAO extends PagingAndSortingRepository<ScheduleApproval, UUID> {
+ Optional<ScheduleApproval> findById(UUID id);
ScheduleApproval save(ScheduleApproval persisted);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleDAO.java
index f68fd22..90843c4 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleDAO.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleDAO.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,14 +33,17 @@ package org.onap.optf.cmso.model.dao;
import java.util.List;
import java.util.Optional;
+import java.util.UUID;
+
import javax.persistence.LockModeType;
+
import org.onap.optf.cmso.model.Schedule;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
-public interface ScheduleDAO extends PagingAndSortingRepository<Schedule, Integer> {
- Optional<Schedule> findById(Integer id);
+public interface ScheduleDAO extends PagingAndSortingRepository<Schedule, UUID> {
+ Optional<Schedule> findById(UUID id);
Schedule save(Schedule persited);
@@ -58,9 +61,9 @@ public interface ScheduleDAO extends PagingAndSortingRepository<Schedule, Intege
@Query(value = "SELECT s FROM Schedule s WHERE s.domain = ?1 AND s.status = 'Notifications Initiated'")
List<Schedule> findAllInProgress(String string);
- @Query(value = "SELECT d FROM Schedule d WHERE d.id = ?1")
+ @Query(value = "SELECT d FROM Schedule d WHERE d.uuid = ?1")
@Lock(LockModeType.PESSIMISTIC_WRITE)
- Schedule lockOne(Integer id);
+ Schedule lockOne(UUID id);
@Query(value = "SELECT s FROM Schedule s WHERE s.optimizerTransactionId= ?1")
@Lock(LockModeType.PESSIMISTIC_WRITE)
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleEventDAO.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleEventDAO.java
deleted file mode 100644
index c3c2483..0000000
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleEventDAO.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.model.dao;
-
-import java.util.List;
-import java.util.Optional;
-import org.onap.optf.cmso.model.ScheduleEvent;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.PagingAndSortingRepository;
-
-public interface ScheduleEventDAO extends PagingAndSortingRepository<ScheduleEvent, Integer> {
- Optional<ScheduleEvent> findById(Integer id);
-
- ScheduleEvent save(ScheduleEvent persisted);
-
- void delete(ScheduleEvent toDelete);
-
- @Query(value = "SELECT d FROM ScheduleEvent d WHERE d.schedulesId = ?1")
- List<ScheduleEvent> findByScheduleId(Integer id);
-
- @Query(value = "SELECT d FROM ScheduleEvent d WHERE d.status = ?1 AND d.reminderTimeMillis <= ?2")
- List<ScheduleEvent> findByStatusAndEndTime(String status, Long date);
-
-}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleQueryDAOImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleQueryDAOImpl.java
index 37fbf52..80bb7f0 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleQueryDAOImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/model/dao/ScheduleQueryDAOImpl.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,14 +46,14 @@ public class ScheduleQueryDAOImpl implements ScheduleQueryDAO {
@Override
public List<ScheduleQuery> searchSchedules(String where, int limit) {
StringBuilder sql = new StringBuilder();
- sql.append("select distinct" + " ss.id as id" + " from" + " SCHEDULES ss"
- + " left outer join CHANGE_MANAGEMENT_GROUPS g on ss.id = g.schedules_id"
- + " left outer join CHANGE_MANAGEMENT_SCHEDULES s on g.id = s.change_management_groups_id"
- + " left outer join DOMAIN_DATA dd on ss.id = dd.schedules_id"
- + " left outer join SCHEDULE_APPROVALS sa on ss.id = sa.schedules_id"
- + " left outer join APPROVAL_TYPES at on sa.approval_type_id = at.id ");
+ sql.append("select distinct" + " ss.uuid as uuid" + " from" + " SCHEDULES ss"
+ + " left outer join CHANGE_MANAGEMENT_GROUPS g on ss.uuid = g.schedules_uuid"
+ + " left outer join CHANGE_MANAGEMENT_SCHEDULES s on g.uuid = s.change_management_group_uuid"
+ + " left outer join DOMAIN_DATA dd on ss.uuid = dd.schedules_uuid"
+ + " left outer join SCHEDULE_APPROVALS sa on ss.uuid = sa.schedules_uuid"
+ + " left outer join APPROVAL_TYPES at on sa.approval_types_uuid = at.uuid ");
sql.append(where);
- sql.append(" order by id ");
+ sql.append(" order by uuid ");
if (limit > 0)
sql.append("LIMIT " + limit);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CMSOptimizerClient.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CmsoOptimizerClient.java
index 9feea2d..4fd0164 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CMSOptimizerClient.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CmsoOptimizerClient.java
@@ -1,373 +1,423 @@
-/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.optimizer;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.ws.rs.ProcessingException;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.ResponseProcessingException;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.onap.observations.Mdc;
-import org.onap.observations.Observation;
-import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
-import org.onap.optf.cmso.common.CMSStatusEnum;
-import org.onap.optf.cmso.common.LogMessages;
-import org.onap.optf.cmso.common.PropertiesManagement;
-import org.onap.optf.cmso.filters.CMSOClientFilters;
-import org.onap.optf.cmso.model.Schedule;
-import org.onap.optf.cmso.model.dao.ScheduleDAO;
-import org.onap.optf.cmso.optimizer.bean.CMOptimizerRequest;
-import org.onap.optf.cmso.optimizer.bean.CMRequestInfo;
-import org.onap.optf.cmso.optimizer.bean.CMSchedulingInfo;
-import org.onap.optf.cmso.optimizer.bean.CMVnfDetails;
-import org.onap.optf.cmso.service.rs.models.CMSInfo;
-import org.onap.optf.cmso.service.rs.models.ChangeWindowMessage;
-import org.onap.optf.cmso.service.rs.models.HealthCheckComponent;
-import org.onap.optf.cmso.service.rs.models.VnfDetailsMessage;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-@Component
-public class CMSOptimizerClient {
- private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
-
- @Autowired
- ScheduleDAO scheduleDAO;
-
- @Autowired
- Environment env;
-
- @Autowired
- PropertiesManagement pm;
-
- public boolean scheduleOptimization(Integer id) {
- Map<String, String> mdcSave = Mdc.save();
- try {
- String optimizerurl = env.getProperty("cmso.optimizer.url");
- String optimizercallbackurl = env.getProperty("cmso.optimizer.callbackurl");
- String username = env.getProperty("mechid.user");
- Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
-
- // Ensure that only one cmso is requsting this call to optimizer
- Schedule schedule = scheduleDAO.lockOne(id);
- if (!schedule.getStatus().equals(CMSStatusEnum.PendingSchedule.toString()))
- return false;
-
- String password = pm.getProperty("mechid.pass", "");
- //
- // Only 'successfully' process one schedule per invocation
- // If a schedule attemp fails and it could be because of the data in the
- // message, try the next one. We don't want bad data to
- //
- if (schedule.getOptimizerAttemptsToSchedule() >= maxAttempts) {
- schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
- schedule.setOptimizerMessage("Maximum number of attempts exceeded " + maxAttempts);
- updateScheduleStatus(schedule);
- return true;
- }
- CMOptimizerRequest cmReq = new CMOptimizerRequest();
- try {
- CMSInfo info = reconstituteMessage(schedule);
- if (info == null) {
- return true;
- }
- buildRequest(cmReq, info, schedule, optimizercallbackurl);
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
- schedule.setOptimizerMessage("Unexpected exception: " + e.getMessage());
- updateScheduleStatus(schedule);
- return true;
- }
-
- // This service will call SNIO for each PendingOptimiztion
- // If the request is successfully scheduled in optimizer, status will be
- // updated to OptimizationInProgress.
- Client client = ClientBuilder.newClient();
- client.register(new BasicAuthenticatorFilter(username, password));
- client.register(new CMSOClientFilters());
- WebTarget optimizerTarget = client.target(optimizerurl);
- Invocation.Builder invocationBuilder = optimizerTarget.request(MediaType.APPLICATION_JSON);
- try {
- //
- // First, push OptimizationInProgress to the DB (flush()) assuming a 202 status,
- // in case the optimizer callback is received prior to the
- // commit of this transaction.
- // optimizer Callback will throw an error if it receives a response in the incorrect
- // state.
- //
- schedule.setOptimizerTransactionId(cmReq.getRequestInfo().getTransactionId());
- schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
- schedule.setStatus(CMSStatusEnum.OptimizationInProgress.toString());
- updateScheduleStatus(schedule);
- debug.debug("optimizer url / user: " + optimizerurl + " / " + username);
- debug.debug("optimizer Request: " + new ObjectMapper().writeValueAsString(cmReq));
- Observation.report(LogMessages.OPTIMIZER_REQUEST, "Begin", schedule.getScheduleId(), optimizerurl);
- Response response = invocationBuilder.post(Entity.json(cmReq));
- Observation.report(LogMessages.OPTIMIZER_REQUEST, "End", schedule.getScheduleId(), optimizerurl);
- switch (response.getStatus()) {
- case 202:
- debug.debug("Successfully scheduled optimization: " + schedule.getScheduleId());
- // Scheduled with optimizer
- break;
- case 400: // Bad request
- {
- schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
- schedule.setOptimizerStatus("HTTP Status: " + response.getStatus());
- String message = response.readEntity(String.class);
- schedule.setOptimizerMessage(message);
- schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
- // Need to understand the cause of this error. May be teh same as optimizer
- // down.
- int tries = schedule.getOptimizerAttemptsToSchedule();
- tries++;
- schedule.setOptimizerAttemptsToSchedule(tries);
- updateScheduleStatus(schedule);
- Observation.report(LogMessages.OPTIMIZER_EXCEPTION, message);
- return true;
- }
-
- case 500:
- default: {
- String message = response.readEntity(String.class);
- // SHould probably track the number of retries.
- schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
- int tries = schedule.getOptimizerAttemptsToSchedule();
- tries++;
- schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
- schedule.setOptimizerAttemptsToSchedule(tries);
- schedule.setOptimizerMessage(message);
- updateScheduleStatus(schedule);
- /// Got processing error response
- // may be transient, wait for next cycle.
- Observation.report(LogMessages.OPTIMIZER_EXCEPTION, message);
- // Wait until next cycle and try again.
- return false;
- }
-
- }
- //
- return true;
- } catch (ResponseProcessingException e) {
- schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
- schedule.setOptimizerStatus("Failed to parse optimizer response");
- schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
- // Need to understand the cause of this error. May be teh same as optimizer down.
- int tries = schedule.getOptimizerAttemptsToSchedule();
- tries++;
- schedule.setOptimizerAttemptsToSchedule(tries);
- updateScheduleStatus(schedule);
- // Getting invalid response from optimizer.
- // May be data related.
- Observation.report(LogMessages.OPTIMIZER_EXCEPTION, e, e.getMessage());
- return false;
-
- } catch (ProcessingException e) {
- // Don't track number of retries on IO error (optimizer is down)
- schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
- schedule.setStatus(CMSStatusEnum.PendingSchedule.toString());
- updateScheduleStatus(schedule);
- /// Cannot connect to optimizer
- Observation.report(LogMessages.OPTIMIZER_EXCEPTION, e, e.getMessage());
- // Wait until next cycle
- return false;
- }
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
-
- } finally {
- Mdc.restore(mdcSave);
- }
- return false;
- }
-
- private void buildRequest(CMOptimizerRequest cmReq, CMSInfo info, Schedule schedule, String optimizercallbackurl) {
-
- // TODO: Need to get optimizer to accept ChangeManagementSchedulingInfo
- // This is to support 1707 optimizer interface
- CMRequestInfo reqInfo = cmReq.getRequestInfo();
- CMSchedulingInfo schInfo = cmReq.getSchedulingInfo();
-
- UUID uuid = UUID.randomUUID();
- reqInfo.setCallbackUrl(optimizercallbackurl);
- reqInfo.setOptimizer(new String[] {"scheduling"});
- reqInfo.setTransactionId(schedule.getOptimizerTransactionId());
- reqInfo.setRequestId("CM-" + uuid.toString());
- reqInfo.setSourceId("cmso");
-
- String[] policyArray = new String[1];
- policyArray[0] = info.getPolicyId();
- schInfo.setPolicyId(policyArray);
- schInfo.setAdditionalDurationInSecs(info.getAdditionalDurationInSeconds());
- schInfo.setConcurrencyLimit(info.getConcurrencyLimit());
- schInfo.setNormalDurationInSecs(info.getNormalDurationInSeconds());
- schInfo.setScheduleId(schedule.getScheduleId());
- List<CMVnfDetails> list = new ArrayList<CMVnfDetails>();
- String startTime = "";
- String endTime = "";
-
- for (VnfDetailsMessage vnf : info.getVnfDetails()) {
- String groupId = vnf.getGroupId();
- for (String node : vnf.getNode()) {
- CMVnfDetails d = new CMVnfDetails(vnf.getGroupId());
- d.setNode(node);
- list.add(d);
- }
- if (startTime.equals("")) {
- // Only supporting 1 CW for 1710
- ChangeWindowMessage cw = vnf.getChangeWindow().get(0);
- startTime = cw.getStartTime();
- endTime = cw.getEndTime();
- }
- }
- schInfo.setStartTime(startTime);
- schInfo.setEndTime(endTime);
- schInfo.setVnfDetails(list.toArray(new CMVnfDetails[list.size()]));
-
- }
-
- private CMSInfo reconstituteMessage(Schedule schedule) {
- String request = schedule.getScheduleInfo();
- ObjectMapper om = new ObjectMapper();
- try {
- CMSInfo info = om.readValue(request, CMSInfo.class);
- return info;
- } catch (Exception e) {
- // Parsing should work here because this was a toString on the original object.
- // We may have an issue when upgrading....
- // Perhaps We create ChangeManagementSchedulingInfoV1, ...V2, etc.
- // ANd try them one after another....
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, "Unable to parse message. Format changed?");
- schedule.setOptimizerStatus("Failed to parse optimizer request");
- schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
- schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
- scheduleDAO.save(schedule);
- }
- return null;
- }
-
- @Transactional
- public void updateScheduleStatus(Schedule schedule) {
- scheduleDAO.save(schedule);
-
- }
-
- public HealthCheckComponent healthCheck() {
- Map<String, String> mdcSave = Mdc.save();
- HealthCheckComponent hcc = new HealthCheckComponent();
- hcc.setName("OPtimizer Interface");
- String optimizerurl = env.getProperty("cmso.optimizer.url");
- String optimizercallbackurl = env.getProperty("cmso.optimizer.callbackurl");
- String username = env.getProperty("mechid.user");
- String password = pm.getProperty("mechid.pass", "");
- hcc.setUrl(optimizerurl);
- try {
- UUID uuid = UUID.randomUUID();
- // Build a bogus request should fail policy validation
- CMRequestInfo requestInfo = new CMRequestInfo();
- CMSchedulingInfo schedulingInfo = new CMSchedulingInfo();
- CMOptimizerRequest cmReq = new CMOptimizerRequest();
- cmReq.setRequestInfo(requestInfo);
- cmReq.setSchedulingInfo(schedulingInfo);
- requestInfo.setCallbackUrl("http://callbackurl.onap.org:8080/healthcheck");
- requestInfo.setOptimizer(new String[] {"scheduling"});
- requestInfo.setTransactionId(uuid.toString());
- requestInfo.setRequestId("CM-" + uuid.toString());
- requestInfo.setSourceId("cmso");
- schedulingInfo.setAdditionalDurationInSecs(10);
- schedulingInfo.setConcurrencyLimit(10);
- schedulingInfo.setNormalDurationInSecs(10);
- schedulingInfo.setPolicyId(new String[] {"healthcheck"});
- schedulingInfo.setScheduleId(uuid.toString());
- CMVnfDetails details = new CMVnfDetails();
- details.setGroupId("");
- details.setNode("healtcheck");
- schedulingInfo.setVnfDetails(new CMVnfDetails[] {details});
- schedulingInfo.setStartTime("2017-12-11T15:23:24Z");
- schedulingInfo.setEndTime("2017-12-11T22:23:24Z");
-
- Client client = ClientBuilder.newClient();
- client.register(new BasicAuthenticatorFilter(username, password));
- client.register(new CMSOClientFilters());
-
- WebTarget optimizerTarget = client.target(optimizerurl);
- Invocation.Builder invocationBuilder = optimizerTarget.request(MediaType.APPLICATION_JSON);
- debug.debug("Optimizer url / user: " + optimizerurl + " / " + username);
- Observation.report(LogMessages.OPTIMIZER_REQUEST, "Begin", "healthcheck", optimizerurl);
- Response response = invocationBuilder.post(Entity.json(cmReq));
- Observation.report(LogMessages.OPTIMIZER_REQUEST, "End", "healthcheck", optimizerurl);
- String message = response.getStatus() + ":" + response.readEntity(String.class);
- switch (response.getStatus()) {
- case 202:
- debug.debug("Successful optimizer healthcheck");
- hcc.setHealthy(true);
- break;
- case 400:
- // Expecting policy not found.
- if (message.contains("Cannot fetch policy")) {
- debug.debug("Successful optimizer healthcheck");
- hcc.setHealthy(true);
- hcc.setStatus("OK");
- } else {
- hcc.setStatus(message);
- }
- break;
- default:
- hcc.setStatus(message);
- break;
- }
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.toString());
- hcc.setStatus(e.toString());
- } finally {
- Mdc.restore(mdcSave);
- }
- return hcc;
-
- }
-}
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.ws.rs.ProcessingException;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.ResponseProcessingException;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.observations.Mdc;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
+import org.onap.optf.cmso.common.CMSStatusEnum;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.onap.optf.cmso.filters.CmsoClientFilters;
+import org.onap.optf.cmso.model.DomainData;
+import org.onap.optf.cmso.model.Schedule;
+import org.onap.optf.cmso.model.dao.ScheduleDAO;
+import org.onap.optf.cmso.optimizer.model.OptimizerElementInfo;
+import org.onap.optf.cmso.optimizer.model.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.model.OptimizerResponse;
+import org.onap.optf.cmso.service.rs.models.HealthCheckComponent;
+import org.onap.optf.cmso.service.rs.models.v2.ElementInfo;
+import org.onap.optf.cmso.service.rs.models.v2.NameValue;
+import org.onap.optf.cmso.service.rs.models.v2.SchedulingData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * The Class CmsoOptimizerClient.
+ */
+@Component
+public class CmsoOptimizerClient {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ ScheduleDAO scheduleDAO;
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ PropertiesManagement pm;
+
+ @Autowired
+ CmsoOptimizerHandler optimizerHandler;
+
+ /**
+ * Schedule optimization.
+ *
+ * @param uuid - non empty
+ */
+ public void scheduleOptimization(UUID uuid) {
+ Map<String, String> mdcSave = Mdc.save();
+ try {
+ // Ensure that only one cmso is requsting this call to optimizer
+ Schedule schedule = scheduleDAO.lockOne(uuid);
+ if (schedule.getStatus().equals(CMSStatusEnum.PendingSchedule.toString())) {
+ scheduleNewOptimization(schedule);
+ }
+ if (schedule.getStatus().equals(CMSStatusEnum.OptimizationInProgress.toString())) {
+ pollOptimizer(schedule);
+ }
+ return;
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ } finally {
+ Mdc.restore(mdcSave);
+ }
+ }
+
+ /**
+ * Schedule New Optimization.
+ *
+ * @param schedule - schedule
+ */
+ public void scheduleNewOptimization(Schedule schedule) {
+ try {
+ Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
+ //
+ // Only 'successfully' process one schedule per invocation
+ // If a schedule attemp fails and it could be because of the data in the
+ // message, try the next one. We don't want bad data to
+ //
+ if (schedule.getOptimizerAttemptsToSchedule() >= maxAttempts) {
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ schedule.setOptimizerMessage("Maximum number of attempts exceeded " + maxAttempts);
+ updateScheduleStatus(schedule);
+ return;
+ }
+ OptimizerRequest cmReq = null;
+ try {
+ cmReq = buildRequestMessage(schedule);
+ if (cmReq == null) {
+ return;
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ schedule.setOptimizerMessage("Unexpected exception: " + e.getMessage());
+ updateScheduleStatus(schedule);
+ return;
+ }
+ initiateOptimization(schedule, cmReq);
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+
+ private void initiateOptimization(Schedule schedule, OptimizerRequest cmReq) {
+ try {
+ String optimizerurl = env.getProperty("cmso.optimizer.request.url");
+ String username = env.getProperty("mechid.user");
+ String password = pm.getProperty("mechid.pass", "");
+ // This service will call optimizer for each PendingSchedule
+ // If the request is successfully scheduled in optimizer, status will be
+ // updated to OptimizationInProgress.
+ Client client = ClientBuilder.newClient();
+ client.register(new BasicAuthenticatorFilter(username, password));
+ client.register(new CmsoClientFilters());
+ WebTarget optimizerTarget = client.target(optimizerurl);
+ Invocation.Builder invocationBuilder = optimizerTarget.request(MediaType.APPLICATION_JSON);
+ try {
+ //
+ // First, push OptimizationInProgress to the DB (flush()) assuming a 202 status,
+ // in case the optimizer callback is received prior to the
+ // commit of this transaction.
+ // optimizer Callback will throw an error if it receives a response in the incorrect
+ // state.
+ //
+ schedule.setOptimizerTransactionId(cmReq.getRequestId());
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ schedule.setStatus(CMSStatusEnum.OptimizationInProgress.toString());
+ updateScheduleStatus(schedule);
+ debug.debug("optimizer url / user: " + optimizerurl + " / " + username);
+ debug.debug("optimizer Request: " + new ObjectMapper().writeValueAsString(cmReq));
+ Observation.report(LogMessages.OPTIMIZER_REQUEST, "Begin", schedule.getScheduleId(), optimizerurl);
+ Response response = invocationBuilder.post(Entity.json(cmReq));
+ Observation.report(LogMessages.OPTIMIZER_REQUEST, "End", schedule.getScheduleId(), optimizerurl);
+ switch (response.getStatus()) {
+ case 202:
+ debug.debug("Successfully scheduled optimization: " + schedule.getScheduleId());
+ // Scheduled with optimizer
+ break;
+ case 200:
+ String optimizerResponseString = response.readEntity(String.class);
+ ObjectMapper om = new ObjectMapper();
+ OptimizerResponse optimizerResponse =
+ om.readValue(optimizerResponseString, OptimizerResponse.class);
+ debug.debug("Successfully retrieved optimization: " + schedule.getScheduleId());
+ optimizerHandler.handleOptimizerResponse(optimizerResponse, schedule);
+ break;
+ case 400: {
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ schedule.setOptimizerStatus("HTTP Status: " + response.getStatus());
+ String message = response.readEntity(String.class);
+ schedule.setOptimizerMessage(message);
+ schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
+ // Need to understand the cause of this error. May be teh same as optimizer
+ // down.
+ int tries = schedule.getOptimizerAttemptsToSchedule();
+ tries++;
+ schedule.setOptimizerAttemptsToSchedule(tries);
+ updateScheduleStatus(schedule);
+ Observation.report(LogMessages.OPTIMIZER_EXCEPTION, message);
+ }
+ break;
+ case 500:
+ default: {
+ String message = response.readEntity(String.class);
+ // SHould probably track the number of retries.
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ int tries = schedule.getOptimizerAttemptsToSchedule();
+ tries++;
+ schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
+ schedule.setOptimizerAttemptsToSchedule(tries);
+ schedule.setOptimizerMessage(message);
+ updateScheduleStatus(schedule);
+ /// Got processing error response
+ // may be transient, wait for next cycle.
+ Observation.report(LogMessages.OPTIMIZER_EXCEPTION, message);
+ // Wait until next cycle and try again.
+ }
+ }
+ } catch (ResponseProcessingException e) {
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ schedule.setOptimizerStatus("Failed to parse optimizer response");
+ schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
+ // Need to understand the cause of this error. May be teh same as optimizer down.
+ int tries = schedule.getOptimizerAttemptsToSchedule();
+ tries++;
+ schedule.setOptimizerAttemptsToSchedule(tries);
+ updateScheduleStatus(schedule);
+ // Getting invalid response from optimizer.
+ // May be data related.
+ Observation.report(LogMessages.OPTIMIZER_EXCEPTION, e, e.getMessage());
+ } catch (ProcessingException e) {
+ // Don't track number of retries on IO error (optimizer is down)
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ schedule.setStatus(CMSStatusEnum.PendingSchedule.toString());
+ updateScheduleStatus(schedule);
+ /// Cannot connect to optimizer
+ Observation.report(LogMessages.OPTIMIZER_EXCEPTION, e, e.getMessage());
+ // Wait until next cycle
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+
+ }
+
+ /**
+ * Poll the optimizer.
+ *
+ * @param schedule - schedule
+ */
+ public void pollOptimizer(Schedule schedule) {
+ try {
+ String optimizerurl = env.getProperty("cmso.optimizer.status.url");
+ String username = env.getProperty("mechid.user");
+ String password = pm.getProperty("mechid.pass", "");
+ Long timeout = env.getProperty("cmso.optimizer.request.timeout.secs", Long.class);
+ if (timeout == null) {
+ timeout = 3600L;
+ }
+ if (!optimizerurl.endsWith("/")) {
+ optimizerurl += "/";
+ }
+ Long now = System.currentTimeMillis();
+ if (now > schedule.getOptimizerDateTimeMillis() + (timeout * 1000)) {
+ schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
+ updateScheduleStatus(schedule);
+ return;
+ }
+
+ optimizerurl += schedule.getOptimizerTransactionId();
+ // This service will call optimizer for each PendingSchedule
+ // If the request is successfully scheduled in optimizer, status will be
+ // updated to OptimizationInProgress.
+ Client client = ClientBuilder.newClient();
+ client.register(new BasicAuthenticatorFilter(username, password));
+ client.register(new CmsoClientFilters());
+ WebTarget optimizerTarget = client.target(optimizerurl);
+ Invocation.Builder invocationBuilder = optimizerTarget.request(MediaType.APPLICATION_JSON);
+ debug.debug("optimizer url / user: " + optimizerurl + " / " + username);
+ Observation.report(LogMessages.OPTIMIZER_REQUEST, "Begin", schedule.getScheduleId(), optimizerurl);
+ Response response = invocationBuilder.get();
+ Observation.report(LogMessages.OPTIMIZER_REQUEST, "End", schedule.getScheduleId(), optimizerurl);
+ switch (response.getStatus()) {
+ case 200:
+
+ String optimizerResponseString = response.readEntity(String.class);
+ ObjectMapper om = new ObjectMapper();
+ OptimizerResponse optimizerResponse =
+ om.readValue(optimizerResponseString, OptimizerResponse.class);
+ debug.debug("Successfully retrieved optimization: " + schedule.getScheduleId());
+ optimizerHandler.handleOptimizerResponse(optimizerResponse, schedule);
+ break;
+ default: {
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ schedule.setOptimizerStatus("HTTP Status: " + response.getStatus());
+ String message = response.readEntity(String.class);
+ schedule.setOptimizerMessage(message);
+ schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
+ updateScheduleStatus(schedule);
+ Observation.report(LogMessages.OPTIMIZER_EXCEPTION, message);
+ }
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ schedule.setOptimizerMessage(e.getMessage());
+ schedule.setStatus(CMSStatusEnum.ScheduleFailed.toString());
+ updateScheduleStatus(schedule);
+ }
+ }
+
+ private OptimizerRequest buildRequestMessage(Schedule schedule) {
+ String request = schedule.getScheduleInfo();
+ ObjectMapper om = new ObjectMapper();
+ try {
+ SchedulingData info = om.readValue(request, SchedulingData.class);
+ OptimizerRequest orequest = new OptimizerRequest();
+ orequest.setChangeWindows(info.getChangeWindows());
+ orequest.setPolicies(info.getPolicies());
+ orequest.setRequestId(schedule.getScheduleId());
+ orequest.setCommonData(marshallCommonData(schedule));
+ orequest.setElements(marshallElements(info));
+ orequest.setAdditionalDuration(info.getAdditionalDurationInSeconds());
+ orequest.setNormalDuration(info.getNormalDurationInSeconds());
+ orequest.setConcurrencyLimit(info.getConcurrencyLimit());
+ return orequest;
+ } catch (Exception e) {
+ // Parsing should work here because this was a toString on the original object.
+ // We may have an issue when upgrading....
+ // Perhaps We create ChangeManagementSchedulingInfoV1, ...V2, etc.
+ // ANd try them one after another....
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, "Unable to parse message. Format changed?");
+ schedule.setOptimizerStatus("Failed to parse optimizer request");
+ schedule.setOptimizerDateTimeMillis(System.currentTimeMillis());
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ scheduleDAO.save(schedule);
+ }
+ return null;
+ }
+
+ private List<OptimizerElementInfo> marshallElements(SchedulingData info) {
+ List<OptimizerElementInfo> list = new ArrayList<>();
+ List<ElementInfo> elementList = info.getElements();
+ for (ElementInfo element : elementList) {
+ OptimizerElementInfo optElement = new OptimizerElementInfo();
+ optElement.setElementData(element.getElementData());
+ optElement.setElementId(element.getElementId());
+ optElement.setGroupId(element.getGroupId());
+ list.add(optElement);
+ }
+ return list;
+ }
+
+ private List<NameValue> marshallCommonData(Schedule schedule) {
+ List<NameValue> nvList = new ArrayList<>();
+ List<DomainData> ddList = schedule.getDomainData();
+ for (DomainData dd : ddList) {
+ NameValue nv = new NameValue();
+ nv.setName(dd.getName());
+ // TODO: handle other than String values
+ nv.setValue(dd.getValue());
+ nvList.add(nv);
+ }
+ return nvList;
+ }
+
+ /**
+ * Update schedule status.
+ *
+ * @param schedule the schedule
+ */
+ @Transactional
+ public void updateScheduleStatus(Schedule schedule) {
+ scheduleDAO.save(schedule);
+ }
+
+ /**
+ * Health check.
+ *
+ * @return
+ */
+ public HealthCheckComponent healthCheck() {
+ Map<String, String> mdcSave = Mdc.save();
+ HealthCheckComponent hcc = new HealthCheckComponent();
+ hcc.setName("OPtimizer Interface");
+ String optimizerurl = env.getProperty("cmso.optimizer.health.url");
+ String username = env.getProperty("mechid.user");
+ String password = pm.getProperty("mechid.pass", "");
+ hcc.setUrl(optimizerurl);
+ try {
+ Client client = ClientBuilder.newClient();
+ client.register(new BasicAuthenticatorFilter(username, password));
+ client.register(new CmsoClientFilters());
+
+ WebTarget optimizerTarget = client.target(optimizerurl);
+ Invocation.Builder invocationBuilder = optimizerTarget.request(MediaType.APPLICATION_JSON);
+ debug.debug("Optimizer url / user: " + optimizerurl + " / " + username);
+ Response response = invocationBuilder.get();
+ Observation.report(LogMessages.OPTIMIZER_REQUEST, "End", "healthcheck", optimizerurl);
+ String message = response.getStatus() + ":" + response.readEntity(String.class);
+ switch (response.getStatus()) {
+ case 200:
+ debug.debug("Successful optimizer healthcheck");
+ hcc.setHealthy(true);
+ break;
+ case 400:
+ default:
+ hcc.setStatus(message);
+ break;
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.toString());
+ hcc.setStatus(e.toString());
+ } finally {
+ Mdc.restore(mdcSave);
+ }
+ return hcc;
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CmsoOptimizerHandler.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CmsoOptimizerHandler.java
new file mode 100644
index 0000000..ea78df1
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/CmsoOptimizerHandler.java
@@ -0,0 +1,262 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.ws.rs.core.Response.Status;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.CMSStatusEnum;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.common.exceptions.CMSException;
+import org.onap.optf.cmso.model.ChangeManagementGroup;
+import org.onap.optf.cmso.model.ChangeManagementSchedule;
+import org.onap.optf.cmso.model.Schedule;
+import org.onap.optf.cmso.model.dao.ChangeManagementChangeWindowDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementDetailDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
+import org.onap.optf.cmso.model.dao.ScheduleDAO;
+import org.onap.optf.cmso.optimizer.model.OptimizerResponse;
+import org.onap.optf.cmso.optimizer.model.OptimizerScheduleInfo;
+import org.onap.optf.cmso.optimizer.model.ScheduledElement;
+import org.onap.optf.cmso.optimizer.model.UnScheduledElement;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class CmsoOptimizerHandler.
+ */
+@Component
+public class CmsoOptimizerHandler {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ ChangeManagementScheduleDAO cmScheduleDAO;
+
+ @Autowired
+ ScheduleDAO scheduleDAO;
+
+ @Autowired
+ ChangeManagementGroupDAO cmGroupDAO;
+
+ @Autowired
+ ChangeManagementChangeWindowDAO cmChangeWindowDAO;
+
+ @Autowired
+ ChangeManagementDetailDAO cmDetailsDAO;
+
+ /**
+ * Handle optimizer response.
+ *
+ * @param response the response
+ * @param schedule the schedule
+ */
+ public void handleOptimizerResponse(OptimizerResponse response, Schedule schedule) {
+ try {
+ // Note that transaction ID and schedule ID are currently the same value.
+
+ String id = response.getRequestId();
+ CMSStatusEnum status = CMSStatusEnum.PendingApproval.fromString(schedule.getStatus());
+ debug.debug("Status at time of optimizer status is " + status.toString() + " for " + id);
+ switch (status) {
+ // PendingSchedule may be a valid status in the cases where SNIRO async call
+ // returns before
+ // We have committed the OptimizationInProgress status
+ // The dispatch logic ensures that we only every dispatch once.
+ case OptimizationInProgress:
+ processResponse(response, schedule);
+ scheduleDAO.save(schedule);
+ break;
+ default:
+ throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.OPTIMIZER_CALLBACK_STATE_ERROR,
+ CMSStatusEnum.OptimizationInProgress.toString(), schedule.getStatus().toString());
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+
+ private void processResponse(OptimizerResponse response, Schedule schedule) {
+ try {
+ schedule.setOptimizerReturnDateTimeMillis(System.currentTimeMillis());
+ schedule.setOptimizerStatus(response.getStatus().toString());
+ schedule.setOptimizerMessage(response.getErrorMessage());
+ switch (response.getStatus()) {
+ case COMPLETED:
+ saveSchedules(response, schedule);
+ break;
+ case FAILED:
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ break;
+ case PENDING_OPTIMIZER:
+ case PENDING_TICKETS:
+ case PENDING_TOPOLOGY:
+ // Leave status as In progress
+ break;
+ default:
+ break;
+ }
+ scheduleDAO.save(schedule);
+ } catch (CMSException e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ schedule.setOptimizerStatus(e.getStatus().toString());
+ schedule.setOptimizerMessage(e.getLocalizedMessage());
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ schedule.setOptimizerStatus("Exception");
+ schedule.setOptimizerMessage(e.getLocalizedMessage());
+ }
+ }
+
+ private void saveSchedules(OptimizerResponse response, Schedule schedule) throws CMSException {
+
+ // TODO: Persist the list of schedules in the DB
+
+ // For Dublin we choose the best schedule.
+ // and only request Accept on that one.
+ // FOr the future, the user will get to choose one of the persisted schedules
+ List<OptimizerScheduleInfo> schedules = response.getSchedules();
+
+ OptimizerScheduleInfo osi = chooseSchedule(schedules);
+ if (osi == null) {
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ schedule.setOptimizerMessage("No schedules returned for COMPLETED status");
+ return;
+ }
+ if (osi.getScheduledElements().size() == 0) {
+ schedule.setStatus(CMSStatusEnum.OptimizationFailed.toString());
+ schedule.setOptimizerMessage("No elements scheduled for COMPLETED status");
+ return;
+ }
+
+ List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(schedule.getUuid());
+ Map<String, ChangeManagementGroup> updatedGroups = new HashMap<>();
+
+ for (ScheduledElement element : osi.getScheduledElements()) {
+ updateGroup(element, groups, updatedGroups);
+ String groupId = element.getGroupId();
+ String vnfName = element.getElementId();
+ ChangeManagementSchedule cms =
+ cmScheduleDAO.findOneByScheduleUUIDGroupIdAndVnfName(schedule.getUuid(), groupId, vnfName);
+ cms.setStartTimeMillis(element.getStartTime().getTime());
+ cms.setFinishTimeMillis(element.getEndTime().getTime());
+ cms.setStatus(CMSStatusEnum.PendingApproval.toString());
+ cmScheduleDAO.save(cms);
+ }
+ if (osi.getUnScheduledElements() != null) {
+ for (UnScheduledElement element : osi.getUnScheduledElements()) {
+ String groupId = element.getGroupId();
+ String vnfName = element.getElementId();
+ ChangeManagementSchedule cms = cmScheduleDAO.findOneByScheduleUUIDGroupIdAndVnfName(schedule.getUuid(),
+ groupId, vnfName);
+ cms.setStatus(CMSStatusEnum.NotScheduled.toString());
+ cmScheduleDAO.save(cms);
+
+ }
+ }
+
+ // Save any changes to the groups
+ for (ChangeManagementGroup cmg : updatedGroups.values()) {
+ cmGroupDAO.save(cmg);
+ }
+ schedule.setStatus(CMSStatusEnum.PendingApproval.toString());
+ }
+
+ private void updateGroup(ScheduledElement element, List<ChangeManagementGroup> groups,
+ Map<String, ChangeManagementGroup> updatedGroups) {
+
+ // For Dublin the contents of CMG are not functional
+ // since were are doing individual scheduling.
+ // We log the not found exception, but do not
+ // throw it at this time.
+ try {
+ ChangeManagementGroup cmg = updatedGroups.get(element.getGroupId());
+ if (cmg == null) {
+ for (ChangeManagementGroup group : groups) {
+ if (group.getGroupId().equals(element.getGroupId())) {
+ cmg = group;
+ break;
+ }
+ }
+ }
+ if (cmg == null) {
+ throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.MISSING_VALID_GROUP_FOR_ELEMENT,
+ element.getElementId());
+ }
+ Long elementStartTime = element.getStartTime().getTime();
+ Long elementFinishTime = element.getEndTime().getTime();
+ if (cmg.getStartTimeMillis() == null || cmg.getStartTimeMillis() > elementStartTime) {
+ cmg.setStartTimeMillis(elementStartTime);
+ updatedGroups.put(cmg.getGroupId(), cmg);
+ }
+ if (cmg.getFinishTime() == null || cmg.getFinishTimeMillis() < elementFinishTime) {
+ cmg.setFinishTimeMillis(elementFinishTime);
+ updatedGroups.put(cmg.getGroupId(), cmg);
+ }
+ if (cmg.getLastInstanceStartTimeMillis() == null
+ || cmg.getLastInstanceStartTimeMillis() < elementStartTime) {
+ cmg.setLastInstanceStartTimeMillis(elementStartTime);
+ updatedGroups.put(cmg.getGroupId(), cmg);
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+
+ private OptimizerScheduleInfo chooseSchedule(List<OptimizerScheduleInfo> schedules) {
+ // The most scheduled elements is the priority
+ //
+ OptimizerScheduleInfo chosenOne = null;
+ for (OptimizerScheduleInfo osi : schedules) {
+ if (chosenOne == null || osi.getScheduledElements().size() > chosenOne.getScheduledElements().size()) {
+ chosenOne = osi;
+ } else {
+ // Same number of scheduled elements.
+ // What is the policy.
+ if (betterSchedule(osi, chosenOne)) {
+ chosenOne = osi;
+ }
+ }
+ }
+ return chosenOne;
+ }
+
+ private boolean betterSchedule(OptimizerScheduleInfo osi, OptimizerScheduleInfo chosenOne) {
+ // TODO Create a more sophisticated choosing process -
+ return true;
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/OptimizerQuartzJob.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/OptimizerQuartzJob.java
index 39d590b..71a2092 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/OptimizerQuartzJob.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/OptimizerQuartzJob.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,22 +31,24 @@
package org.onap.optf.cmso.optimizer;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.onap.observations.Mdc;
import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
import org.onap.optf.cmso.common.CMSStatusEnum;
import org.onap.optf.cmso.common.DomainsEnum;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.PropertiesManagement;
-import org.onap.optf.cmso.filters.CMSOClientFilters;
+import org.onap.optf.cmso.filters.CmsoClientFilters;
import org.onap.optf.cmso.model.Schedule;
import org.onap.optf.cmso.model.dao.ScheduleDAO;
import org.quartz.DisallowConcurrentExecution;
@@ -57,8 +59,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
@Component
@DisallowConcurrentExecution
@@ -66,10 +66,9 @@ public class OptimizerQuartzJob extends QuartzJobBean {
private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerQuartzJob.class);
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
- private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
@Autowired
- ScheduleDAO scheduleDAO;
+ ScheduleDAO scheduleDao;
@Autowired
PropertiesManagement pm;
@@ -88,15 +87,21 @@ public class OptimizerQuartzJob extends QuartzJobBean {
// return;
try {
- // This job will look at the schedules waiting to go to SNIRO
- // (PendingSchedule),
+ // This job will look at the schedules waiting to go to Optimizer or waiting on response from
+ // optimizer
+ // (PendingSchedule, PendingOptimizer),
// schedule the request and update the status to PendingSchedule
// and update the state to OptimizationInProgress
- List<Schedule> schedules = scheduleDAO.findByDomainStatus(DomainsEnum.ChangeManagement.toString(),
- CMSStatusEnum.PendingSchedule.toString());
+ List<Schedule> schedules = scheduleDao.findByDomainStatus(DomainsEnum.ChangeManagement.toString(),
+ CMSStatusEnum.PendingSchedule.toString());
for (Schedule s : schedules) {
scheduleOptimization(s);
}
+ List<Schedule> inProgressSchedules = scheduleDao.findByDomainStatus(DomainsEnum.ChangeManagement.toString(),
+ CMSStatusEnum.OptimizationInProgress.toString());
+ for (Schedule s : inProgressSchedules) {
+ scheduleOptimization(s);
+ }
} catch (Exception e) {
debug.debug(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
@@ -107,7 +112,7 @@ public class OptimizerQuartzJob extends QuartzJobBean {
}
public void scheduleOptimization(Schedule s) {
- Integer id = s.getId();
+ UUID id = s.getUuid();
Map<String, String> mdcSave = Mdc.save();
try {
String url = env.getProperty("cmso.dispatch.url", "http://localhost:8089");
@@ -117,7 +122,7 @@ public class OptimizerQuartzJob extends QuartzJobBean {
String pass = pm.getProperty("mechid.pass", "");
Client client = ClientBuilder.newClient();
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(new CMSOClientFilters());
+ client.register(new CmsoClientFilters());
WebTarget target = client.target(url);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = null;
@@ -130,7 +135,7 @@ public class OptimizerQuartzJob extends QuartzJobBean {
default: {
throw new SchedulerException(
- "Invalid return from dispach service: " + url + " : " + response.toString());
+ "Invalid return from dispach service: " + url + " : " + response.toString());
}
}
} catch (Exception e) {
@@ -143,19 +148,18 @@ public class OptimizerQuartzJob extends QuartzJobBean {
}
/**
- * According to the documentation I read, Quartz would queue a job without
- * waiting for the completion of the job with @DisallowConcurrentExecution to
- * complete so that there would be a backlog of triggers to process
- *
- * This was designed to spin though these stale triggers. When this didn't work,
- * I discovered that the behavior is that Quartz will wait for the appropriate
- * interval after @DisallowConcurrentExecution jobs complete.
- *
+ * According to the documentation I read, Quartz would queue a job without waiting for the
+ * completion of the job with @DisallowConcurrentExecution to complete so that there would be a
+ * backlog of triggers to process
+ *
+ * This was designed to spin though these stale triggers. When this didn't work, I discovered that
+ * the behavior is that Quartz will wait for the appropriate interval
+ * after @DisallowConcurrentExecution jobs complete.
+ *
* I tested by adding a sleep for an interval > the trigger interval
- *
- * QUartz appears to do what makes sense. Leaving this here in case issues
- * arise...
- *
+ *
+ * QUartz appears to do what makes sense. Leaving this here in case issues arise...
+ *
*/
@SuppressWarnings("unused")
private boolean isStale(JobExecutionContext context) {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerElementInfo.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerElementInfo.java
new file mode 100644
index 0000000..50c5621
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerElementInfo.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.model;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.service.rs.models.v2.NameValue;
+
+@ApiModel(value = "Optimizer Element", description = "Element to be scheduled.")
+public class OptimizerElementInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerElementInfo.class);
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ @ApiModelProperty(value = "VNF group identifier.")
+ public String groupId;
+
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerRequest.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerRequest.java
new file mode 100644
index 0000000..47449f0
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerRequest.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.model;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.service.rs.models.v2.ChangeWindow;
+import org.onap.optf.cmso.service.rs.models.v2.NameValue;
+import org.onap.optf.cmso.service.rs.models.v2.PolicyInfo;
+
+@ApiModel(value = "Optimizer Request",
+ description = "Request to provide an \"conflict free\" schedule for passed elements.")
+public class OptimizerRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerRequest.class);
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "Concurrency limit for this request")
+ private Integer concurrencyLimit;
+
+ @ApiModelProperty(value = "Expected duration of normal change")
+ private Integer normalDuration;
+
+ @ApiModelProperty(value = "Additional duration for failed change")
+ private Integer additionalDuration;
+
+ @ApiModelProperty(value = "Implementation specific name value pairs.")
+ private List<NameValue> commonData;
+
+ @ApiModelProperty(value = "Lists of desired change windows to schedule the elements.")
+ private List<ChangeWindow> changeWindows = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the elements to schedule.")
+ private List<OptimizerElementInfo> elements = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the policies to control optimization.")
+ private List<PolicyInfo> policies = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+
+ public List<PolicyInfo> getPolicies() {
+ return policies;
+ }
+
+
+ public void setPolicies(List<PolicyInfo> policies) {
+ this.policies = policies;
+ }
+
+
+ public List<NameValue> getCommonData() {
+ return commonData;
+ }
+
+
+ public void setCommonData(List<NameValue> commonData) {
+ this.commonData = commonData;
+ }
+
+
+ public List<OptimizerElementInfo> getElements() {
+ return elements;
+ }
+
+
+ public void setElements(List<OptimizerElementInfo> elements) {
+ this.elements = elements;
+ }
+
+
+ public List<ChangeWindow> getChangeWindows() {
+ return changeWindows;
+ }
+
+
+ public void setChangeWindows(List<ChangeWindow> changeWindows) {
+ this.changeWindows = changeWindows;
+ }
+
+
+ public Integer getConcurrencyLimit() {
+ return concurrencyLimit;
+ }
+
+
+ public void setConcurrencyLimit(Integer concurrencyLimit) {
+ this.concurrencyLimit = concurrencyLimit;
+ }
+
+
+ public Integer getNormalDuration() {
+ return normalDuration;
+ }
+
+
+ public void setNormalDuration(Integer normalDuration) {
+ this.normalDuration = normalDuration;
+ }
+
+
+ public Integer getAdditionalDuration() {
+ return additionalDuration;
+ }
+
+
+ public void setAdditionalDuration(Integer additionalDuration) {
+ this.additionalDuration = additionalDuration;
+ }
+
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerResponse.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerResponse.java
new file mode 100644
index 0000000..9971595
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerResponse.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.model;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Optimizer Response", description = "Response to optimizer request for the requested elements.")
+public class OptimizerResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerResponse.class);
+
+ public enum OptimizeScheduleStatus {
+ CREATED, PENDING_TOPOLOGY, PENDING_TICKETS, PENDING_OPTIMIZER, COMPLETED, FAILED, DELETED,
+ }
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "Status of the optimization")
+ private OptimizeScheduleStatus status;
+
+ @ApiModelProperty(value = "Message for failed optimization")
+ private String errorMessage;
+
+
+ @ApiModelProperty(value = "List of schedules returned by the optimizer.")
+ private List<OptimizerScheduleInfo> schedules = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+
+ public List<OptimizerScheduleInfo> getSchedules() {
+ return schedules;
+ }
+
+ public void setSchedules(List<OptimizerScheduleInfo> schedules) {
+ this.schedules = schedules;
+ }
+
+ public OptimizeScheduleStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(OptimizeScheduleStatus status) {
+ this.status = status;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerScheduleInfo.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerScheduleInfo.java
new file mode 100644
index 0000000..92ce981
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/OptimizerScheduleInfo.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.model;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Optimizer Schedule Info", description = "Schedule Information returned from optimizer request.")
+public class OptimizerScheduleInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizerScheduleInfo.class);
+
+ @ApiModelProperty(value = "Lists of elements with start times.")
+ private List<ScheduledElement> scheduledElements = new ArrayList<>();
+
+ @ApiModelProperty(value = "Lists of elements that were not able to be scheduled.")
+ private List<UnScheduledElement> unScheduledElements = new ArrayList<>();
+
+
+ public List<ScheduledElement> getScheduledElements() {
+ return scheduledElements;
+ }
+
+
+ public void setScheduledElements(List<ScheduledElement> scheduledElements) {
+ this.scheduledElements = scheduledElements;
+ }
+
+
+ public List<UnScheduledElement> getUnScheduledElements() {
+ return unScheduledElements;
+ }
+
+
+ public void setUnScheduledElements(List<UnScheduledElement> unScheduledElements) {
+ this.unScheduledElements = unScheduledElements;
+ }
+
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/ScheduledElement.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/ScheduledElement.java
new file mode 100644
index 0000000..db92863
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/ScheduledElement.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.model;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
+
+@ApiModel(value = "Scheduled Element", description = "Scheduled element returned by the optimizer.")
+public class ScheduledElement implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ScheduledElement.class);
+
+ public enum ScheduleType {
+ UNKNOWN, GROUP_DISPATCH, INDIVIDUAL,
+ }
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Group identifier")
+ private String groupId;
+
+ private ScheduleType scheduleType = ScheduleType.UNKNOWN;
+
+ @ApiModelProperty(value = "Earliest time for which changes may begin.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date startTime;
+
+ @ApiModelProperty(value = "Latest time by which all changes must be completed.")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+ private Date endTime;
+
+ @ApiModelProperty(value = "Expected duration of change in seconds.")
+ private Long durationSeconds;
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ public ScheduleType getScheduleType() {
+ return scheduleType;
+ }
+
+ public void setScheduleType(ScheduleType scheduleType) {
+ this.scheduleType = scheduleType;
+ }
+
+ public Date getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
+
+ public Date getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
+
+ public Long getDurationSeconds() {
+ return durationSeconds;
+ }
+
+ public void setDurationSeconds(Long durationSeconds) {
+ this.durationSeconds = durationSeconds;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/UnScheduledElement.java b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/UnScheduledElement.java
new file mode 100644
index 0000000..be6e89d
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/optimizer/model/UnScheduledElement.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.optimizer.model;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Unscheduled Element", description = "Scheduled element returned by the optimizer.")
+public class UnScheduledElement implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(UnScheduledElement.class);
+
+ public enum NotScheduledReason {
+ ConcurrencyConstraint, AvailabilityConstraint, Other,
+ }
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Group identifier")
+ private String groupId;
+
+ @ApiModelProperty(value = "List of reasons not able to schedule this element.")
+ private List<NotScheduledReason> notScheduledReaons = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of messages not able to schedule this element.")
+ private List<String> notScheduledMessages = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public List<NotScheduledReason> getNotScheduledReaons() {
+ return notScheduledReaons;
+ }
+
+ public void setNotScheduledReaons(List<NotScheduledReason> notScheduledReaons) {
+ this.notScheduledReaons = notScheduledReaons;
+ }
+
+ public List<String> getNotScheduledMessages() {
+ return notScheduledMessages;
+ }
+
+ public void setNotScheduledMessages(List<String> notScheduledMessages) {
+ this.notScheduledMessages = notScheduledMessages;
+ }
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminTool.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminTool.java
index 10eedf8..6be8159 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminTool.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminTool.java
@@ -31,6 +31,11 @@
package org.onap.optf.cmso.service.rs;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@@ -39,12 +44,6 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
@Api("CMSO Administration")
@Path("/{apiVersion}")
@Produces({MediaType.APPLICATION_JSON})
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminToolImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminToolImpl.java
index 8ec4f4f..fa182b4 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminToolImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/AdminToolImpl.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,28 +31,26 @@
package org.onap.optf.cmso.service.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-
import org.onap.optf.cmso.common.PropertiesManagement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
@Controller
public class AdminToolImpl implements AdminTool {
private static EELFLogger log = EELFManager.getInstance().getLogger(AdminToolImpl.class);
- @Context
+ @Context
UriInfo uri;
-
+
@Context
HttpServletRequest request;
-
+
@Autowired
PropertiesManagement pm;
@@ -60,8 +58,9 @@ public class AdminToolImpl implements AdminTool {
@Override
public Response exec(String apiVersion, String id) {
log.info("AdminTool.exec entered");
- if (id.length() < 4)
+ if (id.length() < 4) {
return Response.ok("").build();
+ }
String encrypted = PropertiesManagement.getEncryptedValue(id);
Response response = Response.ok(encrypted).build();
return response;
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/BaseSchedulerServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/BaseSchedulerServiceImpl.java
index 2e0cfeb..18678ff 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/BaseSchedulerServiceImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/BaseSchedulerServiceImpl.java
@@ -1,40 +1,38 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.UUID;
import javax.ws.rs.core.Response.Status;
import org.onap.optf.cmso.common.ApprovalStatusEnum;
import org.onap.optf.cmso.common.CMSStatusEnum;
@@ -51,11 +49,9 @@ import org.onap.optf.cmso.model.dao.DomainDataDAO;
import org.onap.optf.cmso.model.dao.ScheduleApprovalDAO;
import org.onap.optf.cmso.model.dao.ScheduleDAO;
import org.onap.optf.cmso.service.rs.models.ApprovalMessage;
-import org.onap.optf.cmso.service.rs.models.ScheduleMessage;
+import org.onap.optf.cmso.service.rs.models.v2.OptimizedScheduleMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
@Controller
public class BaseSchedulerServiceImpl {
@@ -73,37 +69,39 @@ public class BaseSchedulerServiceImpl {
@Autowired
ScheduleApprovalDAO scheduleApprovalDAO;
- protected Schedule validateAndAddScheduleRequest(ScheduleMessage scheduleMessage, List<DomainData> domainData)
- throws CMSException {
+ protected Schedule validateAndAddScheduleRequest(OptimizedScheduleMessage scheduleMessage,
+ List<DomainData> domainData) throws CMSException {
messageValidations(scheduleMessage);
- Schedule s = scheduleDAO.findByDomainScheduleID(scheduleMessage.getDomain(), scheduleMessage.getScheduleId());
+ Schedule sch = scheduleDAO.findByDomainScheduleID(scheduleMessage.getDomain(), scheduleMessage.getScheduleId());
- if (s != null) {
+ if (sch != null) {
throw new CMSAlreadyExistsException(scheduleMessage.getDomain(), scheduleMessage.getScheduleId());
}
- s = new Schedule();
- s.setUserId(scheduleMessage.getUserId());
- s.setCreateDateTimeMillis(System.currentTimeMillis());
- s.setDomain(scheduleMessage.getDomain());
- s.setScheduleId(scheduleMessage.getScheduleId());
- s.setOptimizerTransactionId(s.getScheduleId()); // No reason these cannot be the same as
- // these
- // are 1<=>1 at this
- // point.
- s.setScheduleName(scheduleMessage.getScheduleName());
- s.setOptimizerAttemptsToSchedule(0);
- s.setScheduleInfo(scheduleMessage.getSchedulingInfo().toString());
- s.setStatus(CMSStatusEnum.PendingSchedule.toString());
- scheduleDAO.save(s);
+ sch = new Schedule();
+ sch.setUuid(UUID.randomUUID());
+ sch.setUserId(scheduleMessage.getUserId());
+ sch.setCreateDateTimeMillis(System.currentTimeMillis());
+ sch.setDomain(scheduleMessage.getDomain());
+ sch.setScheduleId(scheduleMessage.getScheduleId());
+ sch.setOptimizerTransactionId(sch.getScheduleId()); // No reason these cannot be the same as
+ // these
+ // are 1<=>1 at this
+ // point.
+ sch.setScheduleName(scheduleMessage.getScheduleName());
+ sch.setOptimizerAttemptsToSchedule(0);
+ sch.setScheduleInfo(scheduleMessage.getSchedulingData().toString());
+ sch.setStatus(CMSStatusEnum.PendingSchedule.toString());
+ scheduleDAO.save(sch);
for (DomainData dd : domainData) {
- s.addDomainData(dd);
+ dd.setUuid(UUID.randomUUID());
+ sch.addDomainData(dd);
domainDataDAO.save(dd);
}
- scheduleDAO.save(s);
- return s;
+ scheduleDAO.save(sch);
+ return sch;
}
- private void messageValidations(ScheduleMessage scheduleMessage) throws CMSException {
+ private void messageValidations(OptimizedScheduleMessage scheduleMessage) throws CMSException {
if (scheduleMessage.getScheduleName() == null || scheduleMessage.getScheduleName().equals("")) {
throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "schedulerName", "");
}
@@ -113,86 +111,89 @@ public class BaseSchedulerServiceImpl {
}
protected void deleteScheduleRequest(String domain, String scheduleId) throws CMSException {
- Schedule s = scheduleDAO.findByDomainScheduleID(domain, scheduleId);
- if (s == null) {
+ Schedule sch = scheduleDAO.findByDomainScheduleID(domain, scheduleId);
+ if (sch == null) {
throw new CMSNotFoundException(domain, scheduleId);
}
- CMSStatusEnum currentStatus = CMSStatusEnum.Completed.fromString(s.getStatus());
- s.setDeleteDateTimeMillis(System.currentTimeMillis());
+ CMSStatusEnum currentStatus = CMSStatusEnum.Completed.fromString(sch.getStatus());
+ sch.setDeleteDateTimeMillis(System.currentTimeMillis());
switch (currentStatus) {
case Scheduled:
// TODO CLose all tickets....
- s.setStatus(CMSStatusEnum.Cancelled.toString());
+ sch.setStatus(CMSStatusEnum.Cancelled.toString());
break;
case NotificationsInitiated:
throw new CMSException(Status.NOT_ACCEPTABLE, LogMessages.CANNOT_CANCEL_IN_PROGRESS);
default:
- s.setStatus(CMSStatusEnum.Deleted.toString());
+ sch.setStatus(CMSStatusEnum.Deleted.toString());
}
- scheduleDAO.save(s);
+ scheduleDAO.save(sch);
}
- protected Schedule processApproval(Schedule s, String domain, ApprovalMessage approvalMessage) throws CMSException {
- String scheduleId = s.getScheduleId();
+ protected Schedule processApproval(Schedule sch, String domain, ApprovalMessage approvalMessage)
+ throws CMSException {
+ String scheduleId = sch.getScheduleId();
ApprovalType approvalType =
- approvalTypeDAO.findByDomainAndType(domain, approvalMessage.getApprovalType().toString());
+ approvalTypeDAO.findByDomainAndType(domain, approvalMessage.getApprovalType().toString());
if (approvalType == null) {
throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "approvalType",
- approvalMessage.getApprovalType().toString());
+ approvalMessage.getApprovalType().toString());
}
- if (!s.getStatus().equals(CMSStatusEnum.PendingApproval.toString())) {
+ if (!sch.getStatus().equals(CMSStatusEnum.PendingApproval.toString())) {
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.NOT_PENDING_APPROVAL, domain, scheduleId,
- s.getStatus());
+ sch.getStatus());
}
if (approvalMessage.getApprovalUserId() == null || approvalMessage.getApprovalUserId().equals("")) {
throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "userId");
}
ScheduleApproval sa = null;
// only 1 approval per user....
- if (s.getScheduleApprovals() != null) {
- for (ScheduleApproval scheduleApproval : s.getScheduleApprovals()) {
+ if (sch.getScheduleApprovals() != null) {
+ for (ScheduleApproval scheduleApproval : sch.getScheduleApprovals()) {
if (scheduleApproval.getUserId().equals(approvalMessage.getApprovalUserId())
- && scheduleApproval.getApprovalTypeId().equals(approvalType.getId())) {
+ && scheduleApproval.getApprovalTypesUuid().equals(approvalType.getUuid())) {
sa = scheduleApproval;
}
}
}
if (sa == null) {
sa = new ScheduleApproval();
- sa.setSchedule(s);
- sa.setApprovalTypeId(approvalType.getId());
+ sa.setUuid(UUID.randomUUID());
+ sa.setSchedule(sch);
+ sa.setApprovalTypesUuid(approvalType.getUuid());
sa.setUserId(approvalMessage.getApprovalUserId());
}
// Ignore what time is on the message
sa.setApprovalDateTimeMillis(System.currentTimeMillis());
sa.setStatus(approvalMessage.getApprovalStatus().toString());
- sa.setSchedule(s);
- s.addScheduleApproval(sa);
- scheduleDAO.save(s);
+ sa.setSchedule(sch);
+ sch.addScheduleApproval(sa);
+ scheduleDAO.save(sch);
if (sa.getStatus().equals(ApprovalStatusEnum.Rejected.toString())) {
- s.setStatus(CMSStatusEnum.Rejected.toString());
+ sch.setStatus(CMSStatusEnum.Rejected.toString());
} else {
- if (allApprovalsReceived(s, sa))
- s.setStatus(CMSStatusEnum.Accepted.toString());
+ if (allApprovalsReceived(sch, sa)) {
+ sch.setStatus(CMSStatusEnum.Accepted.toString());
+ }
}
- scheduleDAO.save(s);
- return s;
+ scheduleDAO.save(sch);
+ return sch;
}
private boolean allApprovalsReceived(Schedule schedule, ScheduleApproval sa) {
- Map<Integer, Integer> requiredApprovalsByType = new HashMap<Integer, Integer>(); // Approval
- // countdown
- Map<Integer, ApprovalType> approvalsByType = new HashMap<Integer, ApprovalType>(); // Just
- // for
- // logging
+ Map<UUID, Integer> requiredApprovalsByType = new HashMap<>(); // Approval
+ // countdown
+ Map<UUID, ApprovalType> approvalsByType = new HashMap<>(); // Just
+ // for
+ // logging
List<ApprovalType> approvalTypes = approvalTypeDAO.findByDomain(schedule.getDomain());
for (ApprovalType at : approvalTypes) {
- Integer type = at.getId();
+ UUID type = at.getUuid();
Integer count = at.getApprovalCount();
requiredApprovalsByType.put(type, count);
- approvalsByType.put(at.getId(), at);
+ approvalsByType.put(at.getUuid(), at);
}
// Account for approvals so far
@@ -205,17 +206,17 @@ public class BaseSchedulerServiceImpl {
}
for (ScheduleApproval approval : existingApprovals) {
if (approval.getStatus().equals(ApprovalStatusEnum.Accepted.toString())) {
- Integer remaining = requiredApprovalsByType.get(approval.getApprovalTypeId());
+ Integer remaining = requiredApprovalsByType.get(approval.getApprovalTypesUuid());
if (remaining != null) {
remaining = remaining - 1;
- requiredApprovalsByType.put(approval.getApprovalTypeId(), remaining);
+ requiredApprovalsByType.put(approval.getApprovalTypesUuid(), remaining);
} else {
- log.warn("Ignored Unidentified approval type {0} for domain {1}", approval.getApprovalTypeId(),
- schedule.getDomain());
+ log.warn("Ignored Unidentified approval type {0} for domain {1}", approval.getApprovalTypesUuid(),
+ schedule.getDomain());
}
}
}
- for (Integer id : requiredApprovalsByType.keySet()) {
+ for (UUID id : requiredApprovalsByType.keySet()) {
Integer remaining = requiredApprovalsByType.get(id);
if (remaining > 0) {
return false;
@@ -223,5 +224,4 @@ public class BaseSchedulerServiceImpl {
}
return true;
}
-
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOServiceImpl.java
deleted file mode 100644
index d65dd25..0000000
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOServiceImpl.java
+++ /dev/null
@@ -1,674 +0,0 @@
-/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TimeZone;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriInfo;
-
-import org.joda.time.DateTime;
-import org.onap.observations.Observation;
-import org.onap.optf.cmso.common.ApprovalStatusEnum;
-import org.onap.optf.cmso.common.ApprovalTypesEnum;
-import org.onap.optf.cmso.common.CMSStatusEnum;
-import org.onap.optf.cmso.common.DomainsEnum;
-import org.onap.optf.cmso.common.LogMessages;
-import org.onap.optf.cmso.common.exceptions.CMSException;
-import org.onap.optf.cmso.common.exceptions.CMSNotFoundException;
-import org.onap.optf.cmso.eventq.CMSQueueJob;
-import org.onap.optf.cmso.model.ChangeManagementChangeWindow;
-import org.onap.optf.cmso.model.ChangeManagementDetail;
-import org.onap.optf.cmso.model.ChangeManagementGroup;
-import org.onap.optf.cmso.model.ChangeManagementSchedule;
-import org.onap.optf.cmso.model.DomainData;
-import org.onap.optf.cmso.model.Schedule;
-import org.onap.optf.cmso.model.ScheduleQuery;
-import org.onap.optf.cmso.model.dao.ChangeManagementChangeWindowDAO;
-import org.onap.optf.cmso.model.dao.ChangeManagementDetailDAO;
-import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
-import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
-import org.onap.optf.cmso.model.dao.ScheduleDAO;
-import org.onap.optf.cmso.model.dao.ScheduleQueryDAO;
-import org.onap.optf.cmso.service.rs.models.ApprovalMessage;
-import org.onap.optf.cmso.service.rs.models.CMSInfo;
-import org.onap.optf.cmso.service.rs.models.CMSMessage;
-import org.onap.optf.cmso.service.rs.models.ChangeWindowMessage;
-import org.onap.optf.cmso.service.rs.models.CmDetailsMessage;
-import org.onap.optf.cmso.service.rs.models.CmDomainDataEnum;
-import org.onap.optf.cmso.service.rs.models.VnfDetailsMessage;
-import org.onap.optf.cmso.ticketmgt.TmClient;
-import org.onap.optf.cmso.ticketmgt.bean.BuildCreateRequest;
-import org.onap.optf.cmso.ticketmgt.bean.TmApprovalStatusEnum;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.core.env.Environment;
-import org.springframework.stereotype.Controller;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
-
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
-@Controller
-public class CMSOServiceImpl extends BaseSchedulerServiceImpl implements CMSOService {
- private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
-
- @Autowired
- CMSQueueJob qJob;
-
- @Autowired
- Environment env;
-
- @Autowired
- ChangeManagementScheduleDAO cmScheduleDAO;
-
- @Autowired
- ChangeManagementGroupDAO cmGroupDAO;
-
- @Autowired
- ChangeManagementChangeWindowDAO cmChangeWindowDAO;
-
- @Autowired
- ChangeManagementDetailDAO cmDetailsDAO;
-
- @Autowired
- ScheduleQueryDAO scheduleQueryDAO;
-
- @Autowired
- ScheduleDAO scheduleDAO;
-
- @Autowired
- TmClient tmClient;
-
- @Autowired
- BuildCreateRequest buildCreateRequest;
-
- @Override
- public Response searchScheduleRequests(String apiVersion, Boolean includeDetails, String scheduleId,
- String scheduleName, String userId, String status, String createDateTime, String optimizerStatus,
- String workflowName, UriInfo uri, HttpServletRequest request) {
-
- Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), uri.toString(), "");
- Response response = null;
- List<Schedule> schedules = new ArrayList<Schedule>();
- try {
- debug.debug("Timezone={}", TimeZone.getDefault());
- StringBuilder where = new StringBuilder();
- int maxRows = 0;
- //MultivaluedMap<String, String> qp = uri.getQueryParameters();
- // buildWhere(qp, where);
- List<ScheduleQuery> list = scheduleQueryDAO.searchSchedules(where.toString(), maxRows);
- if (list == null || !list.iterator().hasNext()) {
- throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
- DomainsEnum.ChangeManagement.toString(), scheduleId);
- }
- Iterator<ScheduleQuery> iter = list.iterator();
- while (iter.hasNext()) {
- Schedule s = scheduleDAO.findById(iter.next().getId()).orElse(null);
- if (s != null) {
- schedules.add(s);
- if (includeDetails) {
- List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(s.getId());
- s.setGroups(groups);
- for (ChangeManagementGroup g : groups) {
- List<ChangeManagementSchedule> cmSchedules =
- cmScheduleDAO.findByChangeManagementGroupId(g.getId());
- g.setChangeManagementSchedules(cmSchedules);
- }
- }
- }
- }
- response = Response.ok(schedules.toArray(new Schedule[schedules.size()])).build();
- } catch (CMSException e) {
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.serverError().build();
- }
-
- Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), schedules.toString(),
- response.getStatusInfo().toString());
- return response;
- }
-
- @Override
- @Transactional
- public Response createScheduleRequest(String apiVersion, String scheduleId, CMSMessage scheduleMessage,
- HttpServletRequest request) {
- Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId,
- scheduleMessage.toString());
- Response response = null;
- try {
- if (!scheduleMessage.getDomain().equals(DomainsEnum.ChangeManagement.toString())) {
- throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "domain",
- scheduleMessage.getDomain());
- }
- if (scheduleMessage.getScheduleId() == null || !scheduleMessage.getScheduleId().equals(scheduleId)) {
- throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "schedulerId",
- scheduleMessage.getScheduleId());
- }
- // Force the name to be = to the ID because there is no way fot the provide a
- // name
- scheduleMessage.setScheduleName(scheduleMessage.getScheduleId());
-
- List<DomainData> domainData = validateDomainData(scheduleMessage);
- boolean immediate = validate(scheduleMessage);
- Schedule schedule = validateAndAddScheduleRequest(scheduleMessage, domainData);
- if (immediate) {
- createChangeManagementImmediate(schedule, scheduleMessage);
-
- // Create automatic approval
- ApprovalMessage am = new ApprovalMessage();
- am.setApprovalStatus(ApprovalStatusEnum.Accepted);
- am.setApprovalType(ApprovalTypesEnum.Tier2);
- am.setApprovalUserId(schedule.getUserId());
- processApproveScheduleRequest(schedule, am, domainData);
-
- } else {
- createChangeManagement(schedule, scheduleMessage);
- }
- response = Response.accepted().build();
- } catch (CMSException e) {
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- response = Response.serverError().build();
- }
- Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId,
- response.getStatusInfo().toString());
- return response;
- }
-
- /**
- * Returns whether this is an immediate request
- */
- private boolean validate(CMSMessage scheduleMessage) throws CMSException {
- Set<String> groups = new HashSet<String>();
- CMSInfo info = scheduleMessage.getSchedulingInfo();
- if (info == null) {
- throw new CMSException(Status.BAD_REQUEST, LogMessages.UNABLE_TO_PARSE_SCHEDULING_INFO);
- }
-
- if (scheduleMessage.getSchedulingInfo().getAdditionalDurationInSeconds() == null)
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
- "additionalDurationInSeconds");
- if (scheduleMessage.getSchedulingInfo().getNormalDurationInSeconds() == null)
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
- "normalDurationInSeconds");
- if (scheduleMessage.getSchedulingInfo().getAdditionalDurationInSeconds() < 0)
- throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "additionalDurationInSeconds",
- scheduleMessage.getSchedulingInfo().getAdditionalDurationInSeconds().toString());
- if (scheduleMessage.getSchedulingInfo().getNormalDurationInSeconds() < 1)
- throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "normalDurationInSeconds",
- scheduleMessage.getSchedulingInfo().getNormalDurationInSeconds().toString());
- try {
- for (VnfDetailsMessage vnfDetail : scheduleMessage.getSchedulingInfo().getVnfDetails()) {
- if (vnfDetail.getChangeWindow() != null && vnfDetail.getChangeWindow().size() > 0) {
- if (vnfDetail.getNode().size() == 0) {
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "node list");
- }
- for (String node : vnfDetail.getNode()) {
- if (node.equals(""))
- throw new CMSException(Status.BAD_REQUEST, LogMessages.NODE_LIST_CONTAINS_EMTPY_NODE);
- }
- for (ChangeWindowMessage cw : vnfDetail.getChangeWindow()) {
- if (cw.getStartTime() == null || cw.getStartTime().equals(""))
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
- "startTime");
- if (cw.getEndTime() == null || cw.getEndTime().equals(""))
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
- "endTime");
- DateTime start = CMSOOptimizerCallbackImpl.convertISODate(cw.getStartTime(), "startTime");
- DateTime end = CMSOOptimizerCallbackImpl.convertISODate(cw.getEndTime(), "endTime");
- if (!end.isAfter(start))
- throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_CHANGE_WINDOW,
- cw.getStartTime(), cw.getEndTime());
- }
- if (scheduleMessage.getSchedulingInfo().getConcurrencyLimit() == null)
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
- "concurrencyLimit");
- if (scheduleMessage.getSchedulingInfo().getConcurrencyLimit() < 1)
- throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "concurrencyLimit",
- scheduleMessage.getSchedulingInfo().getConcurrencyLimit().toString());
- if (scheduleMessage.getSchedulingInfo().getPolicyId() == null
- || scheduleMessage.getSchedulingInfo().getPolicyId().equals(""))
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "policyId");
- return false;
- }
- if (vnfDetail.getGroupId() == null || vnfDetail.getGroupId().equals(""))
- groups.add("default");
- else
- groups.add(vnfDetail.getGroupId());
- }
- } catch (CMSException e) {
- throw e;
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
- }
- // If we got here, there are no change windows....
- if (groups.size() > 1)
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MULTIPLE_GROUPS_NOT_SUPPORTED);
- return true;
-
- }
-
- private void createChangeManagement(Schedule schedule, CMSMessage scheduleMessage) throws CMSException {
- CMSInfo schedulingInfo = scheduleMessage.getSchedulingInfo();
- for (VnfDetailsMessage vnfDetail : schedulingInfo.getVnfDetails()) {
- ChangeManagementGroup cmg = new ChangeManagementGroup();
- cmg.setSchedulesId(schedule.getId());
- cmg.setGroupId("");
- if (vnfDetail.getGroupId() != null)
- cmg.setGroupId(vnfDetail.getGroupId());
- cmg.setPolicyId(schedulingInfo.getPolicyId());
- cmg.setNormalDurationInSecs(schedulingInfo.getNormalDurationInSeconds());
- cmg.setAdditionalDurationInSecs(schedulingInfo.getAdditionalDurationInSeconds());
- cmg.setConcurrencyLimit(schedulingInfo.getConcurrencyLimit());
- cmGroupDAO.save(cmg);
- for (ChangeWindowMessage cw : vnfDetail.getChangeWindow()) {
- ChangeManagementChangeWindow cmcw = new ChangeManagementChangeWindow();
- cmcw.setChangeManagementGroupsId(cmg.getId());
- DateTime start = CMSOOptimizerCallbackImpl.convertISODate(cw.getStartTime(), "startTime");
- DateTime end = CMSOOptimizerCallbackImpl.convertISODate(cw.getEndTime(), "startTime");
- cmcw.setStartTimeMillis(start.getMillis());
- cmcw.setFinishTimeMillis(end.getMillis());
- cmChangeWindowDAO.save(cmcw);
- }
-
- for (String vnf : vnfDetail.getNode()) {
- ChangeManagementSchedule cms = new ChangeManagementSchedule();
- cms.setChangeManagementGroupsId(cmg.getId());
- cms.setVnfName(vnf);
- cms.setStatus(CMSStatusEnum.PendingSchedule.toString());
- cmScheduleDAO.save(cms);
- }
- }
- }
-
- private void createChangeManagementImmediate(Schedule schedule, CMSMessage scheduleMessage) throws CMSException {
- CMSInfo schedulingInfo = scheduleMessage.getSchedulingInfo();
- for (VnfDetailsMessage vnfDetail : schedulingInfo.getVnfDetails()) {
- ChangeManagementGroup cmg = new ChangeManagementGroup();
- cmg.setSchedulesId(schedule.getId());
- cmg.setGroupId("");
- int duration = schedulingInfo.getNormalDurationInSeconds();
- int backout = schedulingInfo.getAdditionalDurationInSeconds();
- cmg.setStartTimeMillis(System.currentTimeMillis());
- cmg.setFinishTimeMillis(System.currentTimeMillis() + ((duration * 1000) + (backout * 1000)));
- cmg.setNormalDurationInSecs(duration);
- cmg.setAdditionalDurationInSecs(backout);
- if (vnfDetail.getGroupId() != null)
- cmg.setGroupId(vnfDetail.getGroupId());
- cmGroupDAO.save(cmg);
- for (String vnf : vnfDetail.getNode()) {
- ChangeManagementSchedule cms = new ChangeManagementSchedule();
- cms.setChangeManagementGroupsId(cmg.getId());
- cms.setVnfName(vnf);
- cms.setStatus(CMSStatusEnum.PendingApproval.toString());
- cmScheduleDAO.save(cms);
- }
- schedule.setStatus(CMSStatusEnum.PendingApproval.toString());
- }
- }
-
- private void deleteChangeManagement(Schedule schedule) throws CMSException {
- List<ChangeManagementGroup> cmgs = cmGroupDAO.findBySchedulesID(schedule.getId());
-
- for (ChangeManagementGroup cmg : cmgs) {
- List<ChangeManagementSchedule> schedules = cmScheduleDAO.findByChangeManagementGroupId(cmg.getId());
- for (ChangeManagementSchedule s : schedules) {
- CMSStatusEnum currentState = CMSStatusEnum.Completed.fromString(s.getStatus());
- switch (currentState) {
- case Scheduled:
- if (s.getTmChangeId() != null && !s.getTmChangeId().equals(""))
- tmClient.cancelTicket(schedule, s, s.getTmChangeId());
- s.setStatus(CMSStatusEnum.Cancelled.toString());
- break;
- case Triggered:
- // Too late...
- break;
- default:
- s.setStatus(CMSStatusEnum.Deleted.toString());
- }
- cmScheduleDAO.save(s);
- }
- }
-
- }
-
- private List<DomainData> validateDomainData(CMSMessage scheduleMessage) throws CMSException {
- List<Map<String, String>> domainData = scheduleMessage.getDomainData();
- List<DomainData> domainDataList = new ArrayList<DomainData>();
- Set<String> requiredFields = new HashSet<String>();
- for (CmDomainDataEnum req : CmDomainDataEnum.values()) {
- if (req.isRequired())
- requiredFields.add(req.name());
- }
- for (Map<String, String> nameValue : domainData) {
- for (String name : nameValue.keySet()) {
- String value = nameValue.get(name);
- // Save for later validation
- DomainData dd = new DomainData();
- dd.setName(name);
- dd.setValue(value);
- domainDataList.add(dd);
- requiredFields.remove(name);
- try {
- CmDomainDataEnum.valueOf(name);
- } catch (Exception e) {
- Observation.report(LogMessages.UNDEFINED_DOMAIN_DATA_ATTRIBUTE, DomainsEnum.ChangeManagement.name(), name,
- value);
- }
- }
- }
- if (requiredFields.size() > 0) {
- throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
- requiredFields.toString());
- }
- return domainDataList;
-
- }
-
- @Override
- @Transactional
- public Response deleteScheduleRequest(String apiVersion, String scheduleId, HttpServletRequest request) {
- Response response = null;
- Observation.report(LogMessages.DELETE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId, "");
- try {
- Schedule schedule = scheduleDAO.findByDomainScheduleID(DomainsEnum.ChangeManagement.toString(), scheduleId);
- if (schedule == null) {
- throw new CMSNotFoundException(DomainsEnum.ChangeManagement.toString(), scheduleId);
- }
- deleteChangeManagement(schedule);
- deleteScheduleRequest(DomainsEnum.ChangeManagement.toString(), scheduleId);
- response = Response.noContent().build();
- } catch (CMSException e) {
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- response = Response.serverError().build();
- }
- Observation.report(LogMessages.DELETE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId,
- response.getStatusInfo().toString());
- return response;
- }
-
- @Override
- public Response getScheduleRequestInfo(String apiVersion, String scheduleId, HttpServletRequest request) {
- Response response = null;
- Observation.report(LogMessages.GET_SCHEDULE_REQUEST_INFO, "Received", request.getRemoteAddr(), scheduleId, "");
- Schedule schedule = null;
- try {
- schedule = scheduleDAO.findByDomainScheduleID(DomainsEnum.ChangeManagement.toString(), scheduleId);
- if (schedule == null) {
- throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
- DomainsEnum.ChangeManagement.toString(), scheduleId);
- }
- response = Response.ok().entity(schedule).build();
- } catch (CMSException e) {
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.serverError().build();
- }
- Observation.report(LogMessages.GET_SCHEDULE_REQUEST_INFO, "Returned", request.getRemoteAddr(), scheduleId,
- response.getStatusInfo().toString());
- return response;
- }
-
- @Override
- @Transactional
- public Response approveScheduleRequest(String apiVersion, String scheduleId, ApprovalMessage approval,
- HttpServletRequest request) {
- Response response = null;
- Observation.report(LogMessages.APPROVE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId,
- approval.toString());
- try {
- String domain = DomainsEnum.ChangeManagement.toString();
- Schedule s = scheduleDAO.findByDomainScheduleID(domain, scheduleId);
- if (s == null) {
- throw new CMSNotFoundException(domain, scheduleId);
- }
- processApproveScheduleRequest(s, approval, s.getDomainData());
- response = Response.noContent().build();
- } catch (CMSException e) {
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- response = Response.serverError().build();
- }
- Observation.report(LogMessages.APPROVE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId, "");
- return response;
- }
-
- private void processApproveScheduleRequest(Schedule s, ApprovalMessage approval, List<DomainData> domainData)
- throws CMSException {
- s = scheduleDAO.lockOne(s.getId());
- String domain = DomainsEnum.ChangeManagement.toString();
- processApproval(s, domain, approval);
- if (s.getStatus().equals(CMSStatusEnum.Accepted.toString())) {
- openTickets(s, domainData);
- }
- if (s.getStatus().equals(CMSStatusEnum.Rejected.toString())) {
- updateChangeManagementSchedules(s, CMSStatusEnum.ApprovalRejected);
- }
- }
-
- private void openTickets(Schedule s, List<DomainData> domainData) throws CMSException {
- debug.debug("Entered openTickets scheduleId=" + s.getScheduleId());
-
- Integer max_vnfs_per_ticket = env.getProperty("tm.vnfs.per.ticket", Integer.class, 1);
-
- List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(s.getId());
- for (ChangeManagementGroup group : groups) {
-
- List<ChangeManagementSchedule> schedules = cmScheduleDAO.findByChangeManagementGroupId(group.getId());
- List<List<ChangeManagementSchedule>> ticketList = new ArrayList<List<ChangeManagementSchedule>>();
- List<ChangeManagementSchedule> current = null;
- for (ChangeManagementSchedule cms : schedules) {
- if (current == null || current.size() == max_vnfs_per_ticket) {
- current = new ArrayList<ChangeManagementSchedule>();
- ticketList.add(current);
- }
- current.add(cms);
- }
- for (List<ChangeManagementSchedule> list : ticketList) {
- openTicketForList(s, group, list, domainData);
- }
- }
- debug.debug("Exited openTickets scheduleId=" + s.getScheduleId());
- }
-
- private void openTicketForList(Schedule schedule, ChangeManagementGroup group, List<ChangeManagementSchedule> list,
- List<DomainData> domainData) throws CMSException {
- List<String> vnfNames = new ArrayList<>();
- for (ChangeManagementSchedule cms : list) {
- vnfNames.add(cms.getVnfName());
- }
-
- debug.debug(
- "Calling createChangeTicket scheduleId=" + schedule.getScheduleId() + ", group=" + group.getGroupId(),
- ", vnfNames=" + vnfNames);
- String changeId = tmClient.createChangeTicket(schedule, group, vnfNames, domainData);
-
- // Pre-approve the ticket
- for (ChangeManagementSchedule cms : list) {
- cms.getTmApprovalStatus();
- cms.setTmChangeId(changeId);
- cms.setTmApprovalStatus(TmApprovalStatusEnum.Approved.toString());
- // cms.setStatus(CMSStatusEnum.PendingApproval.toString());
- if (cms.getStartTimeMillis() == null)
- cms.setStatus(CMSStatusEnum.ScheduledImmediate.toString());
- else
- cms.setStatus(CMSStatusEnum.Scheduled.toString());
- cmScheduleDAO.save(cms);
- }
- schedule.setStatus(CMSStatusEnum.Scheduled.toString());
- scheduleDAO.save(schedule);
- }
-
- private void updateChangeManagementSchedules(Schedule s, CMSStatusEnum approvalrejected) {
- debug.debug("Entered updateChangeManagementSchedules");
- List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(s.getId());
- for (ChangeManagementGroup group : groups) {
- List<ChangeManagementSchedule> schedules = cmScheduleDAO.findByChangeManagementGroupId(group.getId());
- for (ChangeManagementSchedule schedule : schedules) {
- schedule.setStatus(approvalrejected.toString());
- cmScheduleDAO.save(schedule);
- }
- }
- debug.debug("Exited updateChangeManagementSchedules");
- }
-
- @Override
- public Response searchScheduleRequestDetails(String apiVersion, String scheduleId, String scheduleName,
- String userId, String status, String createDateTime, String optimizerStatus, String requestApprovalUserId,
- String requestApprovalStatus, String requestApprovalType, String workflowName, String vnfName, String vnfId,
- String vnfStatus,
- // String vnfScheduleId,
- String startTime, String finishTime, String lastInstanceTime, String tmChangeId,
- // String approvalUserId,
- // String approvalStatus,
- // String approvalType,
- Integer maxSchedules, String lastScheduleId, Integer concurrencyLimit, UriInfo uri,
- HttpServletRequest request) {
-
- Response response = null;
- Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST_DETAILS, "Received", request.getRemoteAddr(),
- uri.getRequestUri().getQuery());
- List<CmDetailsMessage> schedules = new ArrayList<CmDetailsMessage>();
-
- try {
- debug.debug("Timezone={}" , TimeZone.getDefault());
- MultivaluedMap<String, String> qp = uri.getQueryParameters();
- StringBuilder where = new StringBuilder();
- int maxRows = 0;
- if (maxSchedules != null && maxSchedules > 0)
- maxRows = maxSchedules;
- buildWhere(qp, where);
- List<ChangeManagementDetail> list = cmDetailsDAO.searchScheduleDetails(where.toString(), maxRows);
- if (list == null || !list.iterator().hasNext()) {
- throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
- DomainsEnum.ChangeManagement.toString(), scheduleId);
- }
- Iterator<ChangeManagementDetail> iter = list.iterator();
- Map<Integer, Schedule> scheduleMap = new HashMap<Integer, Schedule>();
- while (iter.hasNext()) {
- ChangeManagementDetail cms = iter.next();
- CmDetailsMessage msg = buildResponse(cms, scheduleMap);
- schedules.add(msg);
- }
- response = Response.ok(schedules.toArray(new CmDetailsMessage[schedules.size()])).build();
- } catch (CMSException e) {
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- response = Response.serverError().build();
- }
- Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST_DETAILS, "Returned", request.getRemoteAddr(),
- response.getStatusInfo().toString());
- return response;
-
- }
-
- private void buildWhere(MultivaluedMap<String, String> qp, StringBuilder where) throws CMSException {
- String delim = " where ";
- for (String urlName : qp.keySet()) {
- List<String> values = qp.get(urlName);
- String clause = CmQueryParameters.buildClause(urlName, values);
- if (clause != null && !clause.equals("")) {
- where.append(delim).append("\n").append(clause).append("\n");
- delim = "AND";
- }
- }
-
- }
-
- private CmDetailsMessage buildResponse(ChangeManagementDetail cms, Map<Integer, Schedule> scheduleMap) {
- CmDetailsMessage msg = new CmDetailsMessage();
- msg.setVnfId(cms.getVnfId());
- msg.setVnfName(cms.getVnfName());
- msg.setStatus(cms.getStatus());
- msg.setTmChangeId(cms.getTmChangeId());
- msg.setFinishTimeMillis(cms.getFinishTimeMillis());
- msg.setStartTimeMillis(cms.getStartTimeMillis());
- msg.setLastInstanceStartTimeMillis(cms.getLastInstanceStartTimeMillis());
- msg.setGroupId(cms.getGroupId());
- msg.setPolicyId(cms.getPolicyId());
- msg.setTmApprovalStatus(cms.getTmApprovalStatus());
- msg.setTmStatus(cms.getTmStatus());
- msg.setStatusMessage(cms.getStatusMessage());
- msg.setDispatchTimeMillis(cms.getDispatchTimeMillis());
- msg.setExecutionCompletedTimeMillis(cms.getExecutionCompletedTimeMillis());
- msg.setMsoMessage(cms.getMsoMessage());
- msg.setMsoRequestId(cms.getMsoRequestId());
- msg.setMsoStatus(cms.getMsoStatus());
- msg.setMsoTimeMillis(cms.getMsoTimeMillis());
- if (!scheduleMap.containsKey(cms.getSchedulesId())) {
- Schedule schedule = scheduleDAO.findById(cms.getSchedulesId()).orElse(null);
- if (schedule != null) {
- // DO not innclude in the results
- schedule.setScheduleInfo(null);
- // schedule.setSchedule(null);
- scheduleMap.put(cms.getSchedulesId(), schedule);
- }
- }
- if (scheduleMap.containsKey(cms.getSchedulesId())) {
- msg.setScheduleRequest(scheduleMap.get(cms.getSchedulesId()));
- }
- return msg;
- }
-
-}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmQueryParameters.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmQueryParameters.java
index 1a9c29d..2e9ade3 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmQueryParameters.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmQueryParameters.java
@@ -1,33 +1,28 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs;
@@ -41,33 +36,34 @@ import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.exceptions.CMSException;
import org.onap.optf.cmso.model.DomainData;
+/**
+ * The Class CmQueryParameters.
+ */
public class CmQueryParameters {
+ /**
+ * The Enum QueryColumns.
+ */
public enum QueryColumns {
- RequestScheduleId("request.scheduleId", String.class, "ss.schedule_id"), RequestScheduleName(
- "request.scheduleName", String.class,
- "ss.schedule_name"), RequestUserId("request.userId", String.class, "ss.user_id"), RequestStatus(
- "request.status", String.class, "ss.status"), RequestCreateDateTime("request.createDateTime",
- Date.class, "ss.create_date_time"), RequestOptimizerStatus("request.optimizerStatus",
- String.class, "ss.optimizer_status"), RequestApprovalUserId(
- "request.approvalUserId", String.class,
- "sa.user_id"), RequestApprovalStatus("request.approvalStatus",
- String.class, "sa.status"), RequestApprovalType(
- "request.approvalType", String.class,
- "at.approval_type"), WorkflowName("WorkflowName",
- DomainData.class,
- "dd.value"), vnfName("vnfName", String.class,
- "s.vnf_name"), vnfId("vnfId",
- String.class,
- "s.vnf_id"), vnfStatus(
- "vnfStatus",
- String.class,
- "s.vnf_status"),
+ RequestScheduleId("request.scheduleId", String.class, "ss.schedule_id"),
+ RequestScheduleName("request.scheduleName", String.class, "ss.schedule_name"),
+ RequestUserId("request.userId", String.class, "ss.user_id"),
+ RequestStatus("request.status", String.class, "ss.status"),
+ RequestCreateDateTime("request.createDateTime", Date.class, "ss.create_date_time"),
+ RequestOptimizerStatus("request.optimizerStatus", String.class, "ss.optimizer_status"),
+ RequestApprovalUserId("request.approvalUserId", String.class, "sa.user_id"),
+ RequestApprovalStatus("request.approvalStatus", String.class, "sa.status"),
+ RequestApprovalType("request.approvalType", String.class, "at.approval_type"),
+ WorkflowName("WorkflowName", DomainData.class, "dd.value"),
+ vnfName("vnfName", String.class, "s.vnf_name"),
+ vnfId("vnfId", String.class, "s.vnf_id"),
+ vnfStatus("vnfStatus", String.class, "s.vnf_status"),
// vnfScheduleId("vnfScheduleId", String.class, "s.id"),
- startTime("startTime", Date.class, "s.start_time"), finishTime("finishTime", Date.class,
- "s.finish_ime"), lastInstanceTime("lastInstanceTime", Date.class, "g.last_instance_time"), tmChangeId(
- "tmChangeId", String.class, "s.tm_change_id"), concurrenyLimit("request.concurrencyLimit",
- Integer.class, "g.concurrency_limit"),
+ startTime("startTime", Date.class, "s.start_time"),
+ finishTime("finishTime", Date.class, "s.finish_ime"),
+ lastInstanceTime("lastInstanceTime", Date.class, "g.last_instance_time"),
+ tmChangeId("tmChangeId", String.class, "s.tm_change_id"),
+ concurrenyLimit("request.concurrencyLimit", Integer.class, "g.concurrency_limit"),
// approvalUserId("approvalUserId", String.class, "approvalUserId"),
// approvalStatus("approvalStatus", String.class, "approvalStatus"),
// approvalType("approvalType", String.class, "approvalType"),
@@ -79,20 +75,35 @@ public class CmQueryParameters {
private QueryColumns(String urlName, Class<?> type, String col) {
this.urlName = urlName;
- this.type = type;
- this.col = col;
+ this.type = type;
+ this.col = col;
}
}
+ /**
+ * Gets the query column.
+ *
+ * @param urlName the url name
+ * @return the query column
+ */
public static QueryColumns getQueryColumn(String urlName) {
for (QueryColumns qc : QueryColumns.values()) {
- if (qc.urlName.equals(urlName))
+ if (qc.urlName.equals(urlName)) {
return qc;
+ }
}
return null;
}
+ /**
+ * Builds the clause.
+ *
+ * @param urlName the url name
+ * @param values the values
+ * @return the string
+ * @throws CMSException the CMS exception
+ */
public static String buildClause(String urlName, List<String> values) throws CMSException {
QueryColumns qc = getQueryColumn(urlName);
if (qc == null) {
@@ -112,10 +123,12 @@ public class CmQueryParameters {
List<String> likes = new ArrayList<String>();
List<String> in = new ArrayList<String>();
for (String value : values) {
- if (value.contains("%"))
+ if (value.contains("%")) {
likes.add(value);
- else
+ }
+ else {
in.add(value);
+ }
}
String delim = "(";
if (in.size() > 0) {
@@ -134,8 +147,9 @@ public class CmQueryParameters {
delim = " OR ";
}
}
- if (!delim.equals("("))
+ if (!delim.equals("(")) {
clause.append(")");
+ }
return clause.toString();
}
@@ -145,19 +159,20 @@ public class CmQueryParameters {
if (values.size() > 0) {
for (String value : values) {
clause.append(delim).append(" (dd.name = '").append(qc.urlName).append("' AND dd.value = '")
- .append(value).append("')");
+ .append(value).append("')");
delim = " OR ";
}
}
- if (!delim.equals("("))
+ if (!delim.equals("(")) {
clause.append(")");
+ }
return clause.toString();
}
private static String formatDate(String urlName, List<String> values, QueryColumns qc) throws CMSException {
List<String> clauses = new ArrayList<String>();
for (String value : values) {
- String dates[] = value.split(",");
+ String[] dates = value.split(",");
switch (dates.length) {
case 2:
formatDatePair(qc, dates[0].trim(), dates[1].trim(), clauses);
@@ -182,14 +197,16 @@ public class CmQueryParameters {
}
private static void formatDatePair(QueryColumns qc, String lowDate, String highDate, List<String> clauses)
- throws CMSException {
+ throws CMSException {
StringBuilder clause = new StringBuilder();
DateTime date1 = null;
DateTime date2 = null;
- if (!lowDate.equals(""))
+ if (!lowDate.equals("")) {
date1 = convertDate(lowDate, qc.urlName);
- if (!highDate.equals(""))
+ }
+ if (!highDate.equals("")) {
date2 = convertDate(highDate, qc.urlName);
+ }
String delim = "(";
if (date1 != null) {
clause.append(delim).append(qc.col).append(" >= ").append(date1.getMillis());
@@ -207,8 +224,9 @@ public class CmQueryParameters {
private static DateTime convertDate(String utcDate, String urlName) throws CMSException {
DateTime dateTime = ISODateTimeFormat.dateTimeParser().parseDateTime(utcDate);
- if (dateTime != null)
+ if (dateTime != null) {
return dateTime;
+ }
throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_DATE_FILTER, urlName, utcDate);
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleService.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleService.java
new file mode 100644
index 0000000..9874ea8
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleService.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.optf.cmso.common.CMSRequestError;
+import org.onap.optf.cmso.service.rs.models.v2.OptimizedScheduleMessage;
+
+@Api("CMSO Optimized Schedule API")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface CmsoOptimizedScheduleService {
+
+ // ******************************************************************
+ @POST
+ @Path("/schedules/optimized/{scheduleId}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Creates a request for an optimized schedule")
+ @ApiResponses(
+ value = {@ApiResponse(code = 202, message = "Schedule request accepted for optimization."),
+ @ApiResponse(code = 409, message = "Schedule request already exists for this schedule id.",
+ response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error")})
+ public Response createScheduleRequest(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Schedule id to uniquely identify the schedule request being created.")
+ @PathParam("scheduleId") String scheduleId,
+ @ApiParam(value = "Data for creating a schedule request for the given schedule id")
+ OptimizedScheduleMessage scheduleMessage);
+
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleServiceImpl.java
new file mode 100644
index 0000000..290d21e
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizedScheduleServiceImpl.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.common.exceptions.CMSException;
+import org.onap.optf.cmso.service.rs.models.v2.OptimizedScheduleMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+@Controller
+public class CmsoOptimizedScheduleServiceImpl extends CommonServiceImpl implements CmsoOptimizedScheduleService {
+ @SuppressWarnings("unused")
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ Environment env;
+
+
+ @Context
+ HttpServletRequest request;
+
+ @Override
+ @Transactional
+ public Response createScheduleRequest(String apiVersion, String scheduleId,
+ OptimizedScheduleMessage scheduleMessage) {
+ Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId,
+ scheduleMessage.toString());
+ Response response = null;
+ try {
+ createSchedule(scheduleMessage, scheduleId, request);
+ response = Response.accepted().build();
+ } catch (CMSException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOptimizerCallback.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizerCallback.java
index cc2785e..d6cefb6 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOptimizerCallback.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizerCallback.java
@@ -1,66 +1,64 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs;
-
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.onap.optf.cmso.optimizer.bean.CMOptimizerResponse;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
-@Api("CMSO Optimized Schedule API")
-@Path("/{apiVersion}")
-@Produces({MediaType.APPLICATION_JSON})
-public interface CMSOptimizerCallback {
-
- // ******************************************************************
- @POST
- @Path("/optimizerCallback")
- @Produces({MediaType.APPLICATION_JSON})
- @ApiOperation(value = "", notes = "Processes optimizer results callback to a Pending Optimization schedule.")
- @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
- public Response sniroCallback(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Return schedules > lastScheduleId") CMOptimizerResponse reponse);
-
-}
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.optf.cmso.optimizer.bean.CMOptimizerResponse;
+
+@Api("CMSO Optimized Schedule API")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface CmsoOptimizerCallback {
+
+ // ******************************************************************
+ @POST
+ @Path("/optimizerCallback")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Processes optimizer results callback to a Pending Optimization schedule.")
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response sniroCallback(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Return schedules > lastScheduleId") CMOptimizerResponse reponse);
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOOptimizerCallbackImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizerCallbackImpl.java
index 679dd02..6abb6bb 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOOptimizerCallbackImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoOptimizerCallbackImpl.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,17 +31,18 @@
package org.onap.optf.cmso.service.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
-
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.ISODateTimeFormat;
@@ -62,24 +63,21 @@ import org.onap.optf.cmso.optimizer.bean.CMSchedule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
+/**
+ * The Class CmsoOptimizerCallbackImpl.
+ */
@Controller
-public class CMSOOptimizerCallbackImpl extends BaseSchedulerServiceImpl implements CMSOptimizerCallback {
- private static EELFLogger log = EELFManager.getInstance().getLogger(CMSOOptimizerCallbackImpl.class);
- private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
- private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
+public class CmsoOptimizerCallbackImpl extends BaseSchedulerServiceImpl implements CmsoOptimizerCallback {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(CmsoOptimizerCallbackImpl.class);
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
- @Context
+ @Context
UriInfo uri;
-
+
@Context
HttpServletRequest request;
-
+
@Autowired
ChangeManagementScheduleDAO cmScheduleDAO;
@@ -93,6 +91,13 @@ public class CMSOOptimizerCallbackImpl extends BaseSchedulerServiceImpl implemen
@Autowired
ChangeManagementDetailDAO cmDetailsDAO;
+ /**
+ * Sniro callback.
+ *
+ * @param apiVersion the api version
+ * @param sniroResponse the sniro response
+ * @return the response
+ */
@Override
@Transactional
public Response sniroCallback(String apiVersion, CMOptimizerResponse sniroResponse) {
@@ -164,20 +169,20 @@ public class CMSOOptimizerCallbackImpl extends BaseSchedulerServiceImpl implemen
for (CMSchedule sniroSchedule : sniroResponse.getSchedule()) {
String groupId = sniroSchedule.getGroupId();
DateTime finishTime = convertDate(sniroSchedule.getFinishTime(), "finishTime");
- DateTime latestInstanceStartTime =
- convertDate(sniroSchedule.getLatestInstanceStartTime(), "latestInstanceStartTime");
DateTime startTime = convertDate(sniroSchedule.getStartTime(), "startTime");
- ChangeManagementGroup group = cmGroupDAO.findOneBySchedulesIDGroupID(schedule.getId(), groupId);
+ ChangeManagementGroup group = cmGroupDAO.findOneBySchedulesIDGroupID(schedule.getUuid(), groupId);
if (group == null) {
throw new CMSException(Status.PRECONDITION_FAILED,
LogMessages.CHANGE_MANAGEMENT_GROUP_NOT_FOUND, schedule.getScheduleId(), groupId);
}
group.setStartTimeMillis(startTime.getMillis());
group.setFinishTimeMillis(finishTime.getMillis());
+ DateTime latestInstanceStartTime =
+ convertDate(sniroSchedule.getLatestInstanceStartTime(), "latestInstanceStartTime");
group.setLastInstanceStartTimeMillis(latestInstanceStartTime.getMillis());
cmGroupDAO.save(group);
long totalDuration =
- (group.getAdditionalDurationInSecs() + group.getNormalDurationInSecs()) * 1000l;
+ (group.getAdditionalDurationInSecs() + group.getNormalDurationInSecs()) * 1000L;
Map<String, Map<String, Long>> startAndFinishTimeMap = new HashMap<String, Map<String, Long>>();
makeMap(startTime.getMillis(), latestInstanceStartTime.getMillis(), group.getConcurrencyLimit(),
totalDuration, sniroSchedule.getNode(), startAndFinishTimeMap);
@@ -203,21 +208,34 @@ public class CMSOOptimizerCallbackImpl extends BaseSchedulerServiceImpl implemen
}
}
+ /**
+ * Make map.
+ *
+ * @param startTime the start time
+ * @param latestInstanceStartTime the latest instance start time
+ * @param concurrencyLimit the concurrency limit
+ * @param totalDuration the total duration
+ * @param nodeList the node list
+ * @param startAndFinishTimeMap the start and finish time map
+ * @throws CMSException the CMS exception
+ */
public static void makeMap(Long startTime, Long latestInstanceStartTime, int concurrencyLimit, long totalDuration,
- List<String> nodes, Map<String, Map<String, Long>> startAndFinishTimeMap) throws CMSException {
+ List<String> nodeList, Map<String, Map<String, Long>> startAndFinishTimeMap) throws CMSException {
Long nextStartTime = null;
Long nextFinishTime = null;
- for (int nodeNumber = 0; nodeNumber < nodes.size(); nodeNumber++) {
- String node = nodes.get(nodeNumber);
+ for (int nodeNumber = 0; nodeNumber < nodeList.size(); nodeNumber++) {
+ String node = nodeList.get(nodeNumber);
if (nodeNumber % concurrencyLimit == 0) {
- if (nodeNumber == 0)
+ if (nodeNumber == 0) {
nextStartTime = startTime;
- else
+ }
+ else {
nextStartTime = nextStartTime + totalDuration;
+ }
if (nextStartTime > latestInstanceStartTime) {
throw new CMSException(Status.BAD_REQUEST, LogMessages.UNABLE_TO_ALLOCATE_VNF_TIMESLOTS,
startTime.toString(), latestInstanceStartTime.toString(), String.valueOf(totalDuration),
- String.valueOf(concurrencyLimit), String.valueOf(nodes.size()));
+ String.valueOf(concurrencyLimit), String.valueOf(nodeList.size()));
}
nextFinishTime = nextStartTime + totalDuration;
}
@@ -232,7 +250,7 @@ public class CMSOOptimizerCallbackImpl extends BaseSchedulerServiceImpl implemen
private void processNode(Schedule schedule, ChangeManagementGroup group, String node,
Map<String, Map<String, Long>> startAndFinishTimeMap) throws CMSException {
Map<String, Long> map = startAndFinishTimeMap.get(node);
- ChangeManagementSchedule detail = cmScheduleDAO.findOneByGroupIDAndVnfName(group.getId(), node);
+ ChangeManagementSchedule detail = cmScheduleDAO.findOneByGroupUuidAndVnfName(group.getUuid(), node);
if (detail == null) {
throw new CMSException(Status.NOT_FOUND, LogMessages.UNABLE_TO_LOCATE_SCHEDULE_DETAIL,
schedule.getScheduleId(), group.getGroupId(), node);
@@ -244,22 +262,40 @@ public class CMSOOptimizerCallbackImpl extends BaseSchedulerServiceImpl implemen
cmScheduleDAO.save(detail);
}
+ /**
+ * Convert date.
+ *
+ * @param utcDate the utc date
+ * @param attrName the attr name
+ * @return the date time
+ * @throws CMSException the CMS exception
+ */
public static DateTime convertDate(String utcDate, String attrName) throws CMSException {
try {
DateTime dateTime = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZoneUTC().parseDateTime(utcDate);
- if (dateTime != null)
+ if (dateTime != null) {
return dateTime;
+ }
} catch (Exception e) {
debug.debug(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
}
throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, attrName, utcDate);
}
- public static DateTime convertISODate(String utcDate, String attrName) throws CMSException {
+ /**
+ * Convert ISO date.
+ *
+ * @param utcDate the utc date
+ * @param attrName the attr name
+ * @return the date time
+ * @throws CMSException the CMS exception
+ */
+ public static DateTime convertIsoDate(String utcDate, String attrName) throws CMSException {
try {
DateTime dateTime = ISODateTimeFormat.dateTimeParser().parseDateTime(utcDate);
- if (dateTime != null)
+ if (dateTime != null) {
return dateTime;
+ }
} catch (Exception e) {
debug.debug(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOService.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoService.java
index 6e99b0d..d9b338e 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CMSOService.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoService.java
@@ -1,206 +1,206 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.UriInfo;
-import org.onap.optf.cmso.common.CMSRequestError;
-import org.onap.optf.cmso.model.Schedule;
-import org.onap.optf.cmso.service.rs.models.ApprovalMessage;
-import org.onap.optf.cmso.service.rs.models.CMSMessage;
-import org.onap.optf.cmso.service.rs.models.CmDetailsMessage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
-@Api("CMSO Schedule API")
-@Path("/{apiVersion}")
-@Produces({MediaType.APPLICATION_JSON})
-public interface CMSOService {
- // ******************************************************************
- @GET
- @Path("/schedules")
- @Produces({MediaType.APPLICATION_JSON})
- @ApiOperation(value = "", notes = "Returns a list of Scheduler Requests based upon the filter criteria.",
- response = Schedule.class, responseContainer = "List")
- @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 404, message = "No records found", response = CMSRequestError.class),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
- public Response searchScheduleRequests(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @DefaultValue(value = "false") @ApiParam(
- value = "Include details") @QueryParam("includeDetails") Boolean includeDetails,
- @ApiParam(value = "Schedule identifier", allowMultiple = true) @QueryParam("scheduleId") String scheduleId,
- @ApiParam(value = "Schedule name", allowMultiple = true) @QueryParam("scheduleName") String scheduleName,
- @ApiParam(value = "SCheduler creator User id of ",
- allowMultiple = true) @QueryParam("userId") String userId,
- @ApiParam(value = "Schedule status", allowMultiple = true) @QueryParam("status") String status,
- @ApiParam(value = "Creation date and time (<low date>[,<hi date>])",
- allowMultiple = true) @QueryParam("createDateTime") String createDateTime,
- @ApiParam(value = "Optimizer status",
- allowMultiple = true) @QueryParam("optimizerStatus") String optimizerStatus,
- @ApiParam(value = "Workflow", allowMultiple = true) @QueryParam("WorkflowName") String workflowName,
- @Context UriInfo uri, @Context HttpServletRequest request);
-
- // ******************************************************************
- @POST
- @Path("/schedules/{scheduleId}")
- @Produces({MediaType.APPLICATION_JSON})
- @ApiOperation(value = "", notes = "Creates a schedule request for scheduleId")
- @ApiResponses(
- value = {@ApiResponse(code = 202, message = "Schedule request accepted for optimization."),
- @ApiResponse(code = 409, message = "Schedule request already exists for this schedule id.",
- response = CMSRequestError.class),
- @ApiResponse(code = 500, message = "Unexpected Runtime error")})
- public Response createScheduleRequest(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(
- value = "Schedule id to uniquely identify the schedule request being created.") @PathParam("scheduleId") String scheduleId,
- @ApiParam(
- value = "Data for creating a schedule request for the given schedule id") CMSMessage scheduleMessage,
- @Context HttpServletRequest request);
-
- // ******************************************************************
- @DELETE
- @Path("/schedules/{scheduleId}")
- @Produces({MediaType.APPLICATION_JSON})
- @ApiOperation(value = "", notes = "Cancels the schedule request for scheduleId")
- @ApiResponses(value = {@ApiResponse(code = 204, message = "Delete successful"),
- @ApiResponse(code = 404, message = "No record found", response = CMSRequestError.class),
- @ApiResponse(code = 500, message = "Unexpected Runtime error")})
- public Response deleteScheduleRequest(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(
- value = "Schedule id to uniquely identify the schedule request being deleted.") @PathParam("scheduleId") String scheduleId,
- @Context HttpServletRequest request);
-
- // ******************************************************************
- @GET
- @Path("/schedules/{scheduleId}")
- @Produces({MediaType.APPLICATION_JSON})
- @ApiOperation(value = "", notes = "Retrieve the schedule request for scheduleId", response = Schedule.class)
- @ApiResponses(
- value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 404, message = "No record found"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error")})
- public Response getScheduleRequestInfo(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(
- value = "Schedule id to uniquely identify the schedule info being retrieved.") @PathParam("scheduleId") String scheduleId,
- @Context HttpServletRequest request);
-
- // ******************************************************************
- @POST
- @Path("/schedules/{scheduleId}/approvals")
- @Produces({MediaType.APPLICATION_JSON})
- @ApiOperation(value = "",
- notes = "Adds an accept/reject approval status to the schedule request identified by scheduleId")
- @ApiResponses(
- value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 404, message = "No record found"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error")})
- public Response approveScheduleRequest(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(
- value = "Schedule id to uniquely identify the schedule request being accepted or rejected.") @PathParam("scheduleId") String scheduleId,
- @ApiParam(value = "Accept or reject approval message") ApprovalMessage approval,
- @Context HttpServletRequest request);
-
- // ******************************************************************
- @GET
- @Path("/schedules/scheduleDetails")
- @Produces({MediaType.APPLICATION_JSON})
- @ApiOperation(value = "", notes = "Returns a list of Schedule request details based upon the filter criteria.",
- response = CmDetailsMessage.class, responseContainer = "List")
- @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 404, message = "No records found", response = CMSRequestError.class),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
- public Response searchScheduleRequestDetails(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Schedule identifier",
- allowMultiple = true) @QueryParam("request.scheduleId") String scheduleId,
- @ApiParam(value = "Schedule name",
- allowMultiple = true) @QueryParam("request.scheduleName") String scheduleName,
- @ApiParam(value = "Scheduler creator User id of ",
- allowMultiple = true) @QueryParam("request.userId") String userId,
- @ApiParam(value = "Schedule status", allowMultiple = true) @QueryParam("request.status") String status,
- @ApiParam(value = "Creation date and time (<low date>[,<hi date>])",
- allowMultiple = true) @QueryParam("request.createDateTime") String createDateTime,
- @ApiParam(value = "Optimizer status",
- allowMultiple = true) @QueryParam("request.optimizerStatus") String optimizerStatus,
- @ApiParam(value = "Request Approval user id",
- allowMultiple = true) @QueryParam("request.approvalUserId") String requestApprovalUserId,
- @ApiParam(value = "Request Approval status",
- allowMultiple = true) @QueryParam("request.approvalStatus") String requestApprovalStatus,
- @ApiParam(value = "Request Approval type",
- allowMultiple = true) @QueryParam("request.approvalType") String requestApprovalType,
- @ApiParam(value = "Workflow", allowMultiple = true) @QueryParam("WorkflowName") String workflowName,
- @ApiParam(value = "VNF Name", allowMultiple = true) @QueryParam("vnfName") String vnfName,
- @ApiParam(value = "VNF Id", allowMultiple = true) @QueryParam("vnfId") String vnfId,
- @ApiParam(value = "VNF Status", allowMultiple = true) @QueryParam("vnfStatus") String vnfStatus,
- // @ApiParam(value="VNF Schedule Id", allowMultiple=true) @QueryParam("vnfScheduleId")
- // String
- // vnfScheduleId,
- @ApiParam(value = "Start time <low>,<high>",
- allowMultiple = true) @QueryParam("startTime") String startTime,
- @ApiParam(value = "Finish time <low>,<high>",
- allowMultiple = true) @QueryParam("finishTime") String finishTime,
- @ApiParam(value = "Last instance start time <low>,<high>",
- allowMultiple = true) @QueryParam("lastInstanceTime") String lastInstanceTime,
- @ApiParam(value = "TM Change Ticket Change Id",
- allowMultiple = true) @QueryParam("tmChangeId") String tmChangeId,
- // @ApiParam(value="Approval user id", allowMultiple=true) @QueryParam("approvalUserId")
- // String approvalUserId,
- // @ApiParam(value="Approval status", allowMultiple=true) @QueryParam("approvalStatus")
- // String
- // approvalStatus,
- // @ApiParam(value="Approval type", allowMultiple=true) @QueryParam("approvalType")
- // String
- // approvalType,
- @ApiParam(value = "Maximum number of schedules to return") @QueryParam("maxSchedules") Integer maxSchedules,
- @ApiParam(value = "Return schedules > lastScheduleId") @QueryParam("lastScheduleId") String lastScheduleId,
- @ApiParam(
- value = "Return concurrencyLimit") @QueryParam("request.concurrencyLimit") Integer concurrencyLimit,
- @Context UriInfo uri, @Context HttpServletRequest request);
-
-}
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.optf.cmso.common.CMSRequestError;
+import org.onap.optf.cmso.model.Schedule;
+import org.onap.optf.cmso.service.rs.models.ApprovalMessage;
+import org.onap.optf.cmso.service.rs.models.CmDetailsMessage;
+import org.onap.optf.cmso.service.rs.models.CmsoMessage;
+
+@Api("CMSO Schedule API")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface CmsoService {
+ // ******************************************************************
+ @GET
+ @Path("/schedules")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Returns a list of Scheduler Requests based upon the filter criteria.",
+ response = Schedule.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 404, message = "No records found", response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response searchScheduleRequests(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @DefaultValue(value = "false") @ApiParam(
+ value = "Include details") @QueryParam("includeDetails") Boolean includeDetails,
+ @ApiParam(value = "Schedule identifier", allowMultiple = true) @QueryParam("scheduleId") String scheduleId,
+ @ApiParam(value = "Schedule name", allowMultiple = true) @QueryParam("scheduleName") String scheduleName,
+ @ApiParam(value = "SCheduler creator User id of ",
+ allowMultiple = true) @QueryParam("userId") String userId,
+ @ApiParam(value = "Schedule status", allowMultiple = true) @QueryParam("status") String status,
+ @ApiParam(value = "Creation date and time (<low date>[,<hi date>])",
+ allowMultiple = true) @QueryParam("createDateTime") String createDateTime,
+ @ApiParam(value = "Optimizer status",
+ allowMultiple = true) @QueryParam("optimizerStatus") String optimizerStatus,
+ @ApiParam(value = "Workflow", allowMultiple = true) @QueryParam("WorkflowName") String workflowName,
+ @Context UriInfo uri, @Context HttpServletRequest request);
+
+ // ******************************************************************
+ @POST
+ @Path("/schedules/{scheduleId}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Creates a schedule request for scheduleId")
+ @ApiResponses(
+ value = {@ApiResponse(code = 202, message = "Schedule request accepted for optimization."),
+ @ApiResponse(code = 409, message = "Schedule request already exists for this schedule id.",
+ response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error")})
+ public Response createScheduleRequest(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Schedule id to uniquely identify the schedule request being created.")
+ @PathParam("scheduleId") String scheduleId,
+ @ApiParam(value = "Data for creating a schedule request for the given schedule id")
+ CmsoMessage scheduleMessage,
+ @Context HttpServletRequest request);
+
+ // ******************************************************************
+ @DELETE
+ @Path("/schedules/{scheduleId}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Cancels the schedule request for scheduleId")
+ @ApiResponses(value = {@ApiResponse(code = 204, message = "Delete successful"),
+ @ApiResponse(code = 404, message = "No record found", response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error")})
+ public Response deleteScheduleRequest(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Schedule id to uniquely identify the schedule request being deleted.")
+ @PathParam("scheduleId") String scheduleId,
+ @Context HttpServletRequest request);
+
+ // ******************************************************************
+ @GET
+ @Path("/schedules/{scheduleId}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Retrieve the schedule request for scheduleId", response = Schedule.class)
+ @ApiResponses(
+ value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 404, message = "No record found"),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error")})
+ public Response getScheduleRequestInfo(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Schedule id to uniquely identify the schedule info being retrieved.")
+ @PathParam("scheduleId") String scheduleId,
+ @Context HttpServletRequest request);
+
+ // ******************************************************************
+ @POST
+ @Path("/schedules/{scheduleId}/approvals")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "",
+ notes = "Adds an accept/reject approval status to the schedule request identified by scheduleId")
+ @ApiResponses(
+ value = {@ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 404, message = "No record found"),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error")})
+ public Response approveScheduleRequest(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Schedule id to uniquely identify the schedule request being accepted or rejected.")
+ @PathParam("scheduleId") String scheduleId,
+ @ApiParam(value = "Accept or reject approval message") ApprovalMessage approval,
+ @Context HttpServletRequest request);
+
+ // ******************************************************************
+ @GET
+ @Path("/schedules/scheduleDetails")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Returns a list of Schedule request details based upon the filter criteria.",
+ response = CmDetailsMessage.class, responseContainer = "List")
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 404, message = "No records found", response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response searchScheduleRequestDetails(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Schedule identifier",
+ allowMultiple = true) @QueryParam("request.scheduleId") String scheduleId,
+ @ApiParam(value = "Schedule name",
+ allowMultiple = true) @QueryParam("request.scheduleName") String scheduleName,
+ @ApiParam(value = "Scheduler creator User id of ",
+ allowMultiple = true) @QueryParam("request.userId") String userId,
+ @ApiParam(value = "Schedule status", allowMultiple = true) @QueryParam("request.status") String status,
+ @ApiParam(value = "Creation date and time (<low date>[,<hi date>])",
+ allowMultiple = true) @QueryParam("request.createDateTime") String createDateTime,
+ @ApiParam(value = "Optimizer status",
+ allowMultiple = true) @QueryParam("request.optimizerStatus") String optimizerStatus,
+ @ApiParam(value = "Request Approval user id",
+ allowMultiple = true) @QueryParam("request.approvalUserId") String requestApprovalUserId,
+ @ApiParam(value = "Request Approval status",
+ allowMultiple = true) @QueryParam("request.approvalStatus") String requestApprovalStatus,
+ @ApiParam(value = "Request Approval type",
+ allowMultiple = true) @QueryParam("request.approvalType") String requestApprovalType,
+ @ApiParam(value = "Workflow", allowMultiple = true) @QueryParam("WorkflowName") String workflowName,
+ @ApiParam(value = "VNF Name", allowMultiple = true) @QueryParam("vnfName") String vnfName,
+ @ApiParam(value = "VNF Id", allowMultiple = true) @QueryParam("vnfId") String vnfId,
+ @ApiParam(value = "VNF Status", allowMultiple = true) @QueryParam("vnfStatus") String vnfStatus,
+ // @ApiParam(value="VNF Schedule Id", allowMultiple=true) @QueryParam("vnfScheduleId")
+ // String
+ // vnfScheduleId,
+ @ApiParam(value = "Start time <low>,<high>",
+ allowMultiple = true) @QueryParam("startTime") String startTime,
+ @ApiParam(value = "Finish time <low>,<high>",
+ allowMultiple = true) @QueryParam("finishTime") String finishTime,
+ @ApiParam(value = "Last instance start time <low>,<high>",
+ allowMultiple = true) @QueryParam("lastInstanceTime") String lastInstanceTime,
+ @ApiParam(value = "TM Change Ticket Change Id",
+ allowMultiple = true) @QueryParam("tmChangeId") String tmChangeId,
+ // @ApiParam(value="Approval user id", allowMultiple=true) @QueryParam("approvalUserId")
+ // String approvalUserId,
+ // @ApiParam(value="Approval status", allowMultiple=true) @QueryParam("approvalStatus")
+ // String
+ // approvalStatus,
+ // @ApiParam(value="Approval type", allowMultiple=true) @QueryParam("approvalType")
+ // String
+ // approvalType,
+ @ApiParam(value = "Maximum number of schedules to return") @QueryParam("maxSchedules") Integer maxSchedules,
+ @ApiParam(value = "Return schedules > lastScheduleId") @QueryParam("lastScheduleId") String lastScheduleId,
+ @ApiParam(
+ value = "Return concurrencyLimit") @QueryParam("request.concurrencyLimit") Integer concurrencyLimit,
+ @Context UriInfo uri, @Context HttpServletRequest request);
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java
new file mode 100644
index 0000000..9b3785a
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java
@@ -0,0 +1,462 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+import org.joda.time.DateTime;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.DomainsEnum;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.common.exceptions.CMSException;
+import org.onap.optf.cmso.common.exceptions.CMSNotFoundException;
+import org.onap.optf.cmso.eventq.CMSQueueJob;
+import org.onap.optf.cmso.model.ChangeManagementDetail;
+import org.onap.optf.cmso.model.ChangeManagementGroup;
+import org.onap.optf.cmso.model.ChangeManagementSchedule;
+import org.onap.optf.cmso.model.Schedule;
+import org.onap.optf.cmso.model.ScheduleQuery;
+import org.onap.optf.cmso.model.dao.ChangeManagementChangeWindowDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementDetailDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
+import org.onap.optf.cmso.model.dao.ElementDataDAO;
+import org.onap.optf.cmso.model.dao.ScheduleDAO;
+import org.onap.optf.cmso.model.dao.ScheduleQueryDAO;
+import org.onap.optf.cmso.service.rs.models.ApprovalMessage;
+import org.onap.optf.cmso.service.rs.models.ChangeWindowMessage;
+import org.onap.optf.cmso.service.rs.models.CmDetailsMessage;
+import org.onap.optf.cmso.service.rs.models.CmDomainDataEnum;
+import org.onap.optf.cmso.service.rs.models.CmsoInfo;
+import org.onap.optf.cmso.service.rs.models.CmsoMessage;
+import org.onap.optf.cmso.service.rs.models.VnfDetailsMessage;
+import org.onap.optf.cmso.service.rs.models.v2.ChangeWindow;
+import org.onap.optf.cmso.service.rs.models.v2.ElementInfo;
+import org.onap.optf.cmso.service.rs.models.v2.NameValue;
+import org.onap.optf.cmso.service.rs.models.v2.OptimizedScheduleMessage;
+import org.onap.optf.cmso.service.rs.models.v2.PolicyInfo;
+import org.onap.optf.cmso.service.rs.models.v2.SchedulingData;
+import org.onap.optf.cmso.ticketmgt.TmClient;
+import org.onap.optf.cmso.ticketmgt.bean.BuildCreateRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+@Controller
+public class CmsoServiceImpl extends CommonServiceImpl implements CmsoService {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ CMSQueueJob qqJob;
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ ChangeManagementScheduleDAO cmScheduleDao;
+
+ @Autowired
+ ChangeManagementGroupDAO cmGroupDao;
+
+ @Autowired
+ ChangeManagementChangeWindowDAO cmChangeWindowDao;
+
+ @Autowired
+ ChangeManagementDetailDAO cmDetailsDao;
+
+ @Autowired
+ ScheduleQueryDAO scheduleQueryDao;
+
+ @Autowired
+ ScheduleDAO scheduleDao;
+
+ @Autowired
+ ElementDataDAO elementDataDao;
+
+ @Autowired
+ TmClient tmClient;
+
+ @Autowired
+ BuildCreateRequest buildCreateRequest;
+
+ @Override
+ public Response searchScheduleRequests(String apiVersion, Boolean includeDetails, String scheduleId,
+ String scheduleName, String userId, String status, String createDateTime, String optimizerStatus,
+ String workflowName, UriInfo uri, HttpServletRequest request) {
+
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), uri.toString(),
+ "");
+ Response response = null;
+ List<Schedule> schedules = new ArrayList<Schedule>();
+ try {
+ debug.debug("Timezone={}", TimeZone.getDefault());
+ StringBuilder where = new StringBuilder();
+ int maxRows = 0;
+ // MultivaluedMap<String, String> qp = uri.getQueryParameters();
+ // buildWhere(qp, where);
+ List<ScheduleQuery> list = scheduleQueryDao.searchSchedules(where.toString(), maxRows);
+ if (list == null || !list.iterator().hasNext()) {
+ throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
+ DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ Iterator<ScheduleQuery> iter = list.iterator();
+ while (iter.hasNext()) {
+ Schedule sch = scheduleDao.findById(iter.next().getUuid()).orElse(null);
+ if (sch != null) {
+ schedules.add(sch);
+ if (includeDetails) {
+ List<ChangeManagementGroup> groups = cmGroupDao.findBySchedulesID(sch.getUuid());
+ sch.setGroups(groups);
+ for (ChangeManagementGroup g : groups) {
+ List<ChangeManagementSchedule> cmSchedules =
+ cmScheduleDao.findByChangeManagementGroupId(g.getUuid());
+ g.setChangeManagementSchedules(cmSchedules);
+ }
+ }
+ }
+ }
+ response = Response.ok(schedules.toArray(new Schedule[schedules.size()])).build();
+ } catch (CMSException e) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.serverError().build();
+ }
+
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(),
+ schedules.toString(), response.getStatusInfo().toString());
+ return response;
+ }
+
+ @Override
+ @Transactional
+ public Response createScheduleRequest(String apiVersion, String scheduleId, CmsoMessage scheduleMessage,
+ HttpServletRequest request) {
+ Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId,
+ scheduleMessage.toString());
+ Response response = null;
+ try {
+ OptimizedScheduleMessage osm = adaptScheduleMessage(scheduleMessage);
+ createSchedule(osm, scheduleId, request);
+ response = Response.accepted().build();
+ } catch (CMSException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ private OptimizedScheduleMessage adaptScheduleMessage(CmsoMessage sm)
+ throws CMSException, JsonParseException, JsonMappingException, IOException {
+ OptimizedScheduleMessage osm = new OptimizedScheduleMessage();
+ osm.setScheduleId(sm.getScheduleId());
+ osm.setDomain(sm.getDomain());
+ osm.setScheduleName(sm.getScheduleName());
+ osm.setUserId(sm.getUserId());
+ List<NameValue> dd = new ArrayList<>();
+ List<Map<String, String>> smdd = sm.getDomainData();
+ String callbackData = null;
+ for (Map<String, String> map : smdd) {
+ for (String name : map.keySet()) {
+ if (!name.equals(CmDomainDataEnum.CallbackData.toString())) {
+ NameValue nv = new NameValue(name, map.get(name));
+ dd.add(nv);
+ }
+ else
+ {
+ callbackData= map.get(name);
+ }
+ }
+ }
+ osm.setCommonData(dd);
+ CmsoInfo sinfo = sm.getSchedulingInfo();
+ if (sinfo == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "schedulingInfo");
+ }
+ SchedulingData sd = new SchedulingData();
+ osm.setSchedulingData(sd);
+ sd.setAdditionalDurationInSeconds(sinfo.getAdditionalDurationInSeconds());
+ sd.setConcurrencyLimit(sinfo.getConcurrencyLimit());
+ sd.setNormalDurationInSeconds(sinfo.getNormalDurationInSeconds());
+
+ List<PolicyInfo> policies = new ArrayList<>();
+ PolicyInfo policyInfo = new PolicyInfo();
+ policyInfo.setPolicyName(sinfo.getPolicyId());
+ policies.add(policyInfo);
+ sd.setPolicies(policies);
+
+ List<VnfDetailsMessage> details = sinfo.getVnfDetails();
+ if (details == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "vnfDetails");
+ }
+ List<ChangeWindow> windows = new ArrayList<>();
+ List<ElementInfo> elements = new ArrayList<>();
+ for (VnfDetailsMessage vdm : details) {
+ if (vdm.getChangeWindow() != null) {
+ for (ChangeWindowMessage cwm : vdm.getChangeWindow()) {
+ ChangeWindow cw = new ChangeWindow();
+ DateTime start = CmsoOptimizerCallbackImpl.convertIsoDate(cwm.getStartTime(), "startTime");
+ DateTime end = CmsoOptimizerCallbackImpl.convertIsoDate(cwm.getEndTime(), "endTime");
+ cw.setStartTime(start.toDate());
+ cw.setEndTime(end.toDate());
+ windows.add(cw);
+ }
+ }
+ for (String node : vdm.getNode()) {
+ ElementInfo element = new ElementInfo();
+ element.setElementId(node);
+ element.setRequest(getRequestFromCallbackData(node, callbackData));
+ element.setGroupId(vdm.getGroupId());
+ elements.add(element);
+ }
+ }
+ sd.setElements(elements);
+ sd.setChangeWindows(windows);
+ return osm;
+ }
+
+ private Object getRequestFromCallbackData(String node, String value)
+ throws CMSException, JsonParseException, JsonMappingException, IOException {
+ ObjectMapper om = new ObjectMapper();
+ JsonNode json = om.readValue(value, JsonNode.class);
+ JsonNode details = json.get("requestDetails");
+ int ii = 0;
+ for (ii = 0; ii < details.size(); ii++) {
+ JsonNode request = details.get(ii);
+ String id = request.get("vnfName").asText();
+ if (id.equals(node)) {
+ return request;
+ }
+ }
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "CallbackData", "");
+ }
+
+ @Override
+ @Transactional
+ public Response deleteScheduleRequest(String apiVersion, String scheduleId, HttpServletRequest request) {
+ Response response = null;
+ Observation.report(LogMessages.DELETE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId, "");
+ try {
+ Schedule schedule = scheduleDao.findByDomainScheduleID(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ if (schedule == null) {
+ throw new CMSNotFoundException(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ deleteChangeManagement(schedule);
+ deleteScheduleRequest(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ response = Response.noContent().build();
+ } catch (CMSException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.DELETE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ @Override
+ public Response getScheduleRequestInfo(String apiVersion, String scheduleId, HttpServletRequest request) {
+ Response response = null;
+ Observation.report(LogMessages.GET_SCHEDULE_REQUEST_INFO, "Received", request.getRemoteAddr(), scheduleId, "");
+ Schedule schedule = null;
+ try {
+ schedule = scheduleDao.findByDomainScheduleID(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ if (schedule == null) {
+ throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
+ DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ response = Response.ok().entity(schedule).build();
+ } catch (CMSException e) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.GET_SCHEDULE_REQUEST_INFO, "Returned", request.getRemoteAddr(), scheduleId,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ @Override
+ @Transactional
+ public Response approveScheduleRequest(String apiVersion, String scheduleId, ApprovalMessage approval,
+ HttpServletRequest request) {
+ Response response = null;
+ Observation.report(LogMessages.APPROVE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId,
+ approval.toString());
+ try {
+ String domain = DomainsEnum.ChangeManagement.toString();
+ Schedule sch = scheduleDao.findByDomainScheduleID(domain, scheduleId);
+ if (sch == null) {
+ throw new CMSNotFoundException(domain, scheduleId);
+ }
+ processApproveScheduleRequest(sch, approval, sch.getDomainData());
+ response = Response.noContent().build();
+ } catch (CMSException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.APPROVE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId, "");
+ return response;
+ }
+
+ @Override
+ public Response searchScheduleRequestDetails(String apiVersion, String scheduleId, String scheduleName,
+ String userId, String status, String createDateTime, String optimizerStatus,
+ String requestApprovalUserId, String requestApprovalStatus, String requestApprovalType,
+ String workflowName, String vnfName, String vnfId, String vnfStatus,
+ // String vnfScheduleId,
+ String startTime, String finishTime, String lastInstanceTime, String tmChangeId,
+ // String approvalUserId,
+ // String approvalStatus,
+ // String approvalType,
+ Integer maxSchedules, String lastScheduleId, Integer concurrencyLimit, UriInfo uri,
+ HttpServletRequest request) {
+
+ Response response = null;
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST_DETAILS, "Received", request.getRemoteAddr(),
+ uri.getRequestUri().getQuery());
+ List<CmDetailsMessage> schedules = new ArrayList<CmDetailsMessage>();
+
+ try {
+ debug.debug("Timezone={}", TimeZone.getDefault());
+ MultivaluedMap<String, String> qp = uri.getQueryParameters();
+ StringBuilder where = new StringBuilder();
+ int maxRows = 0;
+ if (maxSchedules != null && maxSchedules > 0) {
+ maxRows = maxSchedules;
+ }
+ buildWhere(qp, where);
+ List<ChangeManagementDetail> list = cmDetailsDao.searchScheduleDetails(where.toString(), maxRows);
+ if (list == null || !list.iterator().hasNext()) {
+ throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
+ DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ Iterator<ChangeManagementDetail> iter = list.iterator();
+ Map<UUID, Schedule> scheduleMap = new HashMap<UUID, Schedule>();
+ while (iter.hasNext()) {
+ ChangeManagementDetail cms = iter.next();
+ CmDetailsMessage msg = buildResponse(cms, scheduleMap);
+ schedules.add(msg);
+ }
+ response = Response.ok(schedules.toArray(new CmDetailsMessage[schedules.size()])).build();
+ } catch (CMSException e) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST_DETAILS, "Returned", request.getRemoteAddr(),
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ private void buildWhere(MultivaluedMap<String, String> qp, StringBuilder where) throws CMSException {
+ String delim = " where ";
+ for (String urlName : qp.keySet()) {
+ List<String> values = qp.get(urlName);
+ String clause = CmQueryParameters.buildClause(urlName, values);
+ if (clause != null && !clause.equals("")) {
+ where.append(delim).append("\n").append(clause).append("\n");
+ delim = "AND";
+ }
+ }
+ }
+
+ private CmDetailsMessage buildResponse(ChangeManagementDetail cms, Map<UUID, Schedule> scheduleMap) {
+ CmDetailsMessage msg = new CmDetailsMessage();
+ msg.setVnfId(cms.getVnfId());
+ msg.setVnfName(cms.getVnfName());
+ msg.setStatus(cms.getStatus());
+ msg.setTmChangeId(cms.getTmChangeId());
+ msg.setFinishTimeMillis(cms.getFinishTimeMillis());
+ msg.setStartTimeMillis(cms.getStartTimeMillis());
+ msg.setLastInstanceStartTimeMillis(cms.getLastInstanceStartTimeMillis());
+ msg.setGroupId(cms.getGroupId());
+ msg.setPolicyId(cms.getPolicyId());
+ msg.setTmApprovalStatus(cms.getTmApprovalStatus());
+ msg.setTmStatus(cms.getTmStatus());
+ msg.setStatusMessage(cms.getStatusMessage());
+ msg.setDispatchTimeMillis(cms.getDispatchTimeMillis());
+ msg.setExecutionCompletedTimeMillis(cms.getExecutionCompletedTimeMillis());
+ msg.setMsoMessage(cms.getMsoMessage());
+ msg.setMsoRequestId(cms.getMsoRequestId());
+ msg.setMsoStatus(cms.getMsoStatus());
+ msg.setMsoTimeMillis(cms.getMsoTimeMillis());
+ if (!scheduleMap.containsKey(cms.getSchedulesUuid())) {
+ Schedule schedule = scheduleDao.findById(cms.getSchedulesUuid()).orElse(null);
+ if (schedule != null) {
+ // DO not innclude in the results
+ schedule.setScheduleInfo(null);
+ // schedule.setSchedule(null);
+ scheduleMap.put(cms.getSchedulesUuid(), schedule);
+ }
+ }
+ if (scheduleMap.containsKey(cms.getSchedulesUuid())) {
+ msg.setScheduleRequest(scheduleMap.get(cms.getSchedulesUuid()));
+ }
+ return msg;
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CommonServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CommonServiceImpl.java
new file mode 100644
index 0000000..52a0928
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CommonServiceImpl.java
@@ -0,0 +1,423 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Response.Status;
+import org.onap.optf.cmso.common.ApprovalStatusEnum;
+import org.onap.optf.cmso.common.ApprovalTypesEnum;
+import org.onap.optf.cmso.common.CMSStatusEnum;
+import org.onap.optf.cmso.common.DomainsEnum;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.common.exceptions.CMSException;
+import org.onap.optf.cmso.eventq.CMSQueueJob;
+import org.onap.optf.cmso.model.ChangeManagementChangeWindow;
+import org.onap.optf.cmso.model.ChangeManagementGroup;
+import org.onap.optf.cmso.model.ChangeManagementSchedule;
+import org.onap.optf.cmso.model.DomainData;
+import org.onap.optf.cmso.model.ElementData;
+import org.onap.optf.cmso.model.Schedule;
+import org.onap.optf.cmso.model.dao.ChangeManagementChangeWindowDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementDetailDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
+import org.onap.optf.cmso.model.dao.ElementDataDAO;
+import org.onap.optf.cmso.model.dao.ScheduleDAO;
+import org.onap.optf.cmso.model.dao.ScheduleQueryDAO;
+import org.onap.optf.cmso.service.rs.models.ApprovalMessage;
+import org.onap.optf.cmso.service.rs.models.v2.ChangeWindow;
+import org.onap.optf.cmso.service.rs.models.v2.ElementInfo;
+import org.onap.optf.cmso.service.rs.models.v2.NameValue;
+import org.onap.optf.cmso.service.rs.models.v2.OptimizedScheduleMessage;
+import org.onap.optf.cmso.service.rs.models.v2.SchedulingData;
+import org.onap.optf.cmso.ticketmgt.TmClient;
+import org.onap.optf.cmso.ticketmgt.bean.BuildCreateRequest;
+import org.onap.optf.cmso.ticketmgt.bean.TmApprovalStatusEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class CommonServiceImpl extends BaseSchedulerServiceImpl {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ CMSQueueJob qqJob;
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ ChangeManagementScheduleDAO cmScheduleDAO;
+
+ @Autowired
+ ChangeManagementGroupDAO cmGroupDAO;
+
+ @Autowired
+ ChangeManagementChangeWindowDAO cmChangeWindowDAO;
+
+ @Autowired
+ ChangeManagementDetailDAO cmDetailsDAO;
+
+ @Autowired
+ ScheduleQueryDAO scheduleQueryDAO;
+
+ @Autowired
+ ScheduleDAO scheduleDAO;
+
+ @Autowired
+ ElementDataDAO elementDataDAO;
+
+ @Autowired
+ TmClient tmClient;
+
+ @Autowired
+ BuildCreateRequest buildCreateRequest;
+
+
+ protected void createSchedule(OptimizedScheduleMessage scheduleMessage, String scheduleId,
+ HttpServletRequest request) throws CMSException, JsonProcessingException {
+ if (!scheduleMessage.getDomain().equals(DomainsEnum.ChangeManagement.toString())) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "domain",
+ scheduleMessage.getDomain());
+ }
+ if (scheduleMessage.getScheduleId() == null || !scheduleMessage.getScheduleId().equals(scheduleId)) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "schedulerId",
+ scheduleMessage.getScheduleId());
+ }
+ // Force the name to be = to the ID because there is no way fot the provide a
+ // name
+ scheduleMessage.setScheduleName(scheduleMessage.getScheduleId());
+
+ List<DomainData> domainData = marshallDomainData(scheduleMessage);
+ Map<String, List<ElementInfo>> groups = new HashMap<>();
+ boolean immediate = validate(scheduleMessage, groups);
+ Schedule schedule = validateAndAddScheduleRequest(scheduleMessage, domainData);
+ if (immediate) {
+ createChangeManagementImmediate(schedule, scheduleMessage, groups);
+
+ // Create automatic approval
+ ApprovalMessage am = new ApprovalMessage();
+ am.setApprovalStatus(ApprovalStatusEnum.Accepted);
+ am.setApprovalType(ApprovalTypesEnum.Tier2);
+ am.setApprovalUserId(schedule.getUserId());
+ processApproveScheduleRequest(schedule, am, domainData);
+
+ } else {
+ createChangeManagement(schedule, scheduleMessage, groups);
+ }
+ }
+
+ /**
+ * Returns whether this is an immediate request.
+ */
+ private boolean validate(OptimizedScheduleMessage scheduleMessage, Map<String, List<ElementInfo>> groups)
+ throws CMSException {
+ SchedulingData info = scheduleMessage.getSchedulingData();
+ boolean immediate = true;
+ if (info == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.UNABLE_TO_PARSE_SCHEDULING_INFO);
+ }
+
+ if (info.getAdditionalDurationInSeconds() == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
+ "additionalDurationInSeconds");
+ }
+ if (info.getNormalDurationInSeconds() == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE,
+ "normalDurationInSeconds");
+ }
+ if (info.getAdditionalDurationInSeconds() < 0) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "additionalDurationInSeconds",
+ info.getAdditionalDurationInSeconds().toString());
+ }
+ if (info.getNormalDurationInSeconds() < 1) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "normalDurationInSeconds",
+ info.getNormalDurationInSeconds().toString());
+ }
+ if (info.getChangeWindows() != null && info.getChangeWindows().size() > 0) {
+ for (ChangeWindow cw : info.getChangeWindows()) {
+ immediate = false;
+ if (cw.getStartTime() == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "startTime");
+ }
+ if (cw.getEndTime() == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "endTime");
+ }
+ Date start = cw.getStartTime();
+ Date end = cw.getEndTime();
+ if (!end.after(start)) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_CHANGE_WINDOW, start.toString(),
+ end.toString());
+ }
+ }
+ if (info.getConcurrencyLimit() == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "concurrencyLimit");
+ }
+ if (info.getConcurrencyLimit() < 1) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.INVALID_ATTRIBUTE, "concurrencyLimit",
+ info.getConcurrencyLimit().toString());
+ }
+ }
+
+ if (info.getElements() == null || info.getElements().size() == 0) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "elements");
+ }
+
+ for (ElementInfo element : info.getElements()) {
+ if (element.getGroupId() == null || element.getGroupId().equals("")) {
+ element.setElementId("default");
+ }
+ List<ElementInfo> groupedElements = groups.get(element.getGroupId());
+ if (groupedElements == null) {
+ groupedElements = new ArrayList<ElementInfo>();
+ groups.put(element.getGroupId(), groupedElements);
+ }
+
+ groupedElements.add(element);
+ }
+ return immediate;
+ }
+
+ private void createChangeManagement(Schedule schedule, OptimizedScheduleMessage scheduleMessage,
+ Map<String, List<ElementInfo>> groups) throws CMSException {
+ SchedulingData schedulingInfo = scheduleMessage.getSchedulingData();
+ for (String groupId : groups.keySet()) {
+
+ ChangeManagementGroup cmg = new ChangeManagementGroup();
+ cmg.setUuid(UUID.randomUUID());
+ cmg.setSchedulesUuid(schedule.getUuid());
+ cmg.setGroupId(groupId);
+ cmg.setPolicyId(schedulingInfo.getPolicies().toString());
+ cmg.setNormalDurationInSecs(schedulingInfo.getNormalDurationInSeconds());
+ cmg.setAdditionalDurationInSecs(schedulingInfo.getAdditionalDurationInSeconds());
+ cmg.setConcurrencyLimit(schedulingInfo.getConcurrencyLimit());
+ cmGroupDAO.save(cmg);
+ for (ChangeWindow cw : schedulingInfo.getChangeWindows()) {
+ ChangeManagementChangeWindow cmcw = new ChangeManagementChangeWindow();
+ cmcw.setUuid(UUID.randomUUID());
+ cmcw.setChangeManagementGroupUuid(cmg.getUuid());
+ cmcw.setStartTimeMillis(cw.getStartTime().getTime());
+ cmcw.setFinishTimeMillis(cw.getEndTime().getTime());
+ cmChangeWindowDAO.save(cmcw);
+ }
+
+ for (ElementInfo element : groups.get(groupId)) {
+ ChangeManagementSchedule cms = new ChangeManagementSchedule();
+ cms.setUuid(UUID.randomUUID());
+ cms.setChangeManagementGroupUuid(cmg.getUuid());
+ cms.setVnfName(element.getElementId());
+ cms.setStatus(CMSStatusEnum.PendingSchedule.toString());
+ cms.setRequest(element.getRequest().toString());
+ cmScheduleDAO.save(cms);
+ // Save elementData
+ saveElementData(cms, element);
+ }
+ }
+ }
+
+ private void saveElementData(ChangeManagementSchedule cms, ElementInfo element) {
+ List<NameValue> elementData = element.getElementData();
+ if (elementData != null) {
+ for (NameValue nv : elementData) {
+ ElementData ed = new ElementData();
+ ed.setUuid(UUID.randomUUID());
+ ed.setChangeManagementSchedulesUuid(cms.getUuid());
+ ed.setName(nv.getName());
+ // TODO Save as JSON
+ ed.setValue(nv.getValue().toString());
+ elementDataDAO.save(ed);
+ }
+ }
+
+ }
+
+ private void createChangeManagementImmediate(Schedule schedule, OptimizedScheduleMessage scheduleMessage,
+ Map<String, List<ElementInfo>> groups) throws CMSException, JsonProcessingException {
+ SchedulingData schedulingInfo = scheduleMessage.getSchedulingData();
+ for (String groupId : groups.keySet()) {
+ ChangeManagementGroup cmg = new ChangeManagementGroup();
+ cmg.setUuid(UUID.randomUUID());
+ cmg.setSchedulesUuid(schedule.getUuid());
+ cmg.setGroupId(groupId);
+ int duration = schedulingInfo.getNormalDurationInSeconds();
+ int backout = schedulingInfo.getAdditionalDurationInSeconds();
+ cmg.setStartTimeMillis(System.currentTimeMillis());
+ cmg.setFinishTimeMillis(System.currentTimeMillis() + ((duration * 1000) + (backout * 1000)));
+ cmg.setNormalDurationInSecs(duration);
+ cmg.setAdditionalDurationInSecs(backout);
+ cmGroupDAO.save(cmg);
+ for (ElementInfo element : groups.get(groupId)) {
+ ChangeManagementSchedule cms = new ChangeManagementSchedule();
+ cms.setUuid(UUID.randomUUID());
+ cms.setChangeManagementGroupUuid(cmg.getUuid());
+ cms.setVnfName(element.getElementId());
+ cms.setRequest(element.getRequest().toString());
+ cms.setStatus(CMSStatusEnum.PendingApproval.toString());
+ cmScheduleDAO.save(cms);
+ }
+ schedule.setStatus(CMSStatusEnum.PendingApproval.toString());
+ scheduleDAO.save(schedule);
+ }
+ }
+
+ protected void deleteChangeManagement(Schedule schedule) throws CMSException {
+ List<ChangeManagementGroup> cmgs = cmGroupDAO.findBySchedulesID(schedule.getUuid());
+
+ for (ChangeManagementGroup cmg : cmgs) {
+ List<ChangeManagementSchedule> schedules = cmScheduleDAO.findByChangeManagementGroupId(cmg.getUuid());
+ for (ChangeManagementSchedule s : schedules) {
+ CMSStatusEnum currentState = CMSStatusEnum.Completed.fromString(s.getStatus());
+ switch (currentState) {
+ case Scheduled:
+ if (s.getTmChangeId() != null && !s.getTmChangeId().equals("")) {
+ tmClient.cancelTicket(schedule, s, s.getTmChangeId());
+ }
+ s.setStatus(CMSStatusEnum.Cancelled.toString());
+ break;
+ case Triggered:
+ // Too late...
+ break;
+ default:
+ s.setStatus(CMSStatusEnum.Deleted.toString());
+ }
+ cmScheduleDAO.save(s);
+ }
+ }
+
+ }
+
+ //
+ // Marshall commonData into DB DomainData
+ // No validation.
+ //
+ private List<DomainData> marshallDomainData(OptimizedScheduleMessage scheduleMessage) throws CMSException {
+ List<NameValue> domainData = scheduleMessage.getCommonData();
+ List<DomainData> domainDataList = new ArrayList<DomainData>();
+ for (NameValue nameValue : domainData) {
+ DomainData dd = new DomainData();
+ dd.setName(nameValue.getName());
+ Object obj = nameValue.getValue();
+ String objString = obj.toString();
+ // TODO: Store as json
+ dd.setValue(objString);
+ domainDataList.add(dd);
+ }
+ return domainDataList;
+ }
+
+
+ protected void processApproveScheduleRequest(Schedule sch, ApprovalMessage approval, List<DomainData> domainData)
+ throws CMSException {
+ sch = scheduleDAO.lockOne(sch.getUuid());
+ String domain = DomainsEnum.ChangeManagement.toString();
+ processApproval(sch, domain, approval);
+ if (sch.getStatus().equals(CMSStatusEnum.Accepted.toString())) {
+ openTickets(sch, domainData);
+ }
+ if (sch.getStatus().equals(CMSStatusEnum.Rejected.toString())) {
+ updateChangeManagementSchedules(sch, CMSStatusEnum.ApprovalRejected);
+ }
+ }
+
+ private void openTickets(Schedule sch, List<DomainData> domainData) throws CMSException {
+ debug.debug("Entered openTickets scheduleId=" + sch.getScheduleId());
+
+ Integer maxvnfsperticket = env.getProperty("tm.vnfs.per.ticket", Integer.class, 1);
+
+ List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(sch.getUuid());
+ for (ChangeManagementGroup group : groups) {
+
+ List<ChangeManagementSchedule> schedules = cmScheduleDAO.findByChangeManagementGroupId(group.getUuid());
+ List<List<ChangeManagementSchedule>> ticketList = new ArrayList<List<ChangeManagementSchedule>>();
+ List<ChangeManagementSchedule> current = null;
+ for (ChangeManagementSchedule cms : schedules) {
+ if (current == null || current.size() == maxvnfsperticket) {
+ current = new ArrayList<ChangeManagementSchedule>();
+ ticketList.add(current);
+ }
+ current.add(cms);
+ }
+ for (List<ChangeManagementSchedule> list : ticketList) {
+ openTicketForList(sch, group, list, domainData);
+ }
+ }
+ debug.debug("Exited openTickets scheduleId=" + sch.getScheduleId());
+ }
+
+ private void openTicketForList(Schedule schedule, ChangeManagementGroup group, List<ChangeManagementSchedule> list,
+ List<DomainData> domainData) throws CMSException {
+ List<String> vnfNames = new ArrayList<>();
+ for (ChangeManagementSchedule cms : list) {
+ vnfNames.add(cms.getVnfName());
+ }
+
+ debug.debug("Calling createChangeTicket scheduleId=" + schedule.getScheduleId() + ", group="
+ + group.getGroupId(), ", vnfNames=" + vnfNames);
+ String changeId = tmClient.createChangeTicket(schedule, group, vnfNames, domainData);
+
+ // Pre-approve the ticket
+ for (ChangeManagementSchedule cms : list) {
+ cms.getTmApprovalStatus();
+ cms.setTmChangeId(changeId);
+ cms.setTmApprovalStatus(TmApprovalStatusEnum.Approved.toString());
+ // cms.setStatus(CMSStatusEnum.PendingApproval.toString());
+ if (cms.getStartTimeMillis() == null) {
+ cms.setStatus(CMSStatusEnum.ScheduledImmediate.toString());
+ }
+ else {
+ cms.setStatus(CMSStatusEnum.Scheduled.toString());
+ }
+ cmScheduleDAO.save(cms);
+ }
+ schedule.setStatus(CMSStatusEnum.Scheduled.toString());
+ scheduleDAO.save(schedule);
+ }
+
+ private void updateChangeManagementSchedules(Schedule sch, CMSStatusEnum approvalrejected) {
+ debug.debug("Entered updateChangeManagementSchedules");
+ List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(sch.getUuid());
+ for (ChangeManagementGroup group : groups) {
+ List<ChangeManagementSchedule> schedules = cmScheduleDAO.findByChangeManagementGroupId(group.getUuid());
+ for (ChangeManagementSchedule schedule : schedules) {
+ schedule.setStatus(approvalrejected.toString());
+ cmScheduleDAO.save(schedule);
+ }
+ }
+ debug.debug("Exited updateChangeManagementSchedules");
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheck.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheck.java
index fb69e31..981657c 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheck.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheck.java
@@ -31,6 +31,11 @@
package org.onap.optf.cmso.service.rs;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@@ -39,15 +44,8 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.onap.optf.cmso.service.rs.models.HealthCheckMessage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
@Api("CMSO Administration")
@Path("/{apiVersion}")
@Produces({MediaType.APPLICATION_JSON})
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheckImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheckImpl.java
index 8e6b09e..6785646 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheckImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/HealthCheckImpl.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2018 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,16 +31,14 @@
package org.onap.optf.cmso.service.rs;
-import java.util.List;
-
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-
-import org.onap.optf.cmso.model.ApprovalType;
import org.onap.optf.cmso.model.dao.ApprovalTypeDAO;
-import org.onap.optf.cmso.optimizer.CMSOptimizerClient;
+import org.onap.optf.cmso.optimizer.CmsoOptimizerClient;
import org.onap.optf.cmso.service.rs.models.HealthCheckComponent;
import org.onap.optf.cmso.service.rs.models.HealthCheckMessage;
import org.onap.optf.cmso.sostatus.MsoStatusClient;
@@ -49,24 +47,26 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
+/**
+ * Health check.
+ *
+ *
+ */
@Controller
public class HealthCheckImpl implements HealthCheck {
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
- @Context
+ @Context
UriInfo uri;
-
+
@Context
HttpServletRequest request;
-
+
@Autowired
TmClient tmClient;
@Autowired
- CMSOptimizerClient optimizerClient;
+ CmsoOptimizerClient optimizerClient;
@Autowired
ApprovalTypeDAO approvalTypeDAO;
@@ -77,6 +77,13 @@ public class HealthCheckImpl implements HealthCheck {
@Autowired
MsoStatusClient msoStatusClient;
+ /**
+ * Health check.
+ *
+ * @param apiVersion the api version
+ * @param checkInterfaces the check interfaces
+ * @return the response
+ */
@Override
public Response healthCheck(String apiVersion, Boolean checkInterfaces) {
debug.debug("Entered healthcheck");
@@ -89,30 +96,38 @@ public class HealthCheckImpl implements HealthCheck {
addToHealthCheckMessage(hc, msoStatusClient.healthCheck());
addToHealthCheckMessage(hc, optimizerClient.healthCheck());
}
- addToHealthCheckMessage(hc, this.healthCheck());
+ addToHealthCheckMessage(hc, this.healthCheckCrap());
- if (hc.getHealthy())
+ if (hc.getHealthy()) {
response = Response.ok().entity(hc).build();
- else
+ }
+ else {
response = Response.status(Response.Status.BAD_REQUEST).entity(hc).build();
+ }
return response;
}
private void addToHealthCheckMessage(HealthCheckMessage hc, HealthCheckComponent hcc) {
- if (!hcc.getHealthy())
+ if (!hcc.getHealthy()) {
hc.setHealthy(false);
+ }
hc.setHostname(System.getenv("HOSTNAME"));
hc.addComponent(hcc);
}
- public HealthCheckComponent healthCheck() {
+ /**
+ * Health check.
+ *
+ * @return the health check component
+ */
+ private HealthCheckComponent healthCheckCrap() {
HealthCheckComponent hcc = new HealthCheckComponent();
hcc.setName("Scheduler Database");
String url = env.getProperty("spring.datasource.url");
hcc.setUrl(url);
try {
- List<ApprovalType> approvalTypes = approvalTypeDAO.findByDomain("HealthCheck");
+ approvalTypeDAO.findByDomain("HealthCheck");
hcc.setHealthy(true);
hcc.setStatus("OK");
} catch (Exception e) {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ApprovalMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ApprovalMessage.java
index 0d43799..f038905 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ApprovalMessage.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ApprovalMessage.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright � 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright � 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,20 +31,20 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
-import java.sql.Timestamp;
-import org.onap.optf.cmso.common.ApprovalStatusEnum;
-import org.onap.optf.cmso.common.ApprovalTypesEnum;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.sql.Timestamp;
+import org.onap.optf.cmso.common.ApprovalStatusEnum;
+import org.onap.optf.cmso.common.ApprovalTypesEnum;
/**
* The persistent class for the approval_types database table.
- *
+ *
*/
@ApiModel(value = "Schedule Approval Request", description = "Request to accept or reject an optimized time slot.")
public class ApprovalMessage implements Serializable {
@@ -62,38 +62,84 @@ public class ApprovalMessage implements Serializable {
private Timestamp approvalDateTime;
+ /**
+ * Gets the approval user id.
+ *
+ * @return the approval user id
+ */
public String getApprovalUserId() {
return approvalUserId;
}
+ /**
+ * Sets the approval user id.
+ *
+ * @param approvalUserId the new approval user id
+ */
public void setApprovalUserId(String approvalUserId) {
this.approvalUserId = approvalUserId;
}
+ /**
+ * Gets the approval status.
+ *
+ * @return the approval status
+ */
public ApprovalStatusEnum getApprovalStatus() {
return approvalStatus;
}
+ /**
+ * Sets the approval status.
+ *
+ * @param approvalStatus the new approval status
+ */
public void setApprovalStatus(ApprovalStatusEnum approvalStatus) {
this.approvalStatus = approvalStatus;
}
+ /**
+ * Gets the approval type.
+ *
+ * @return the approval type
+ */
public ApprovalTypesEnum getApprovalType() {
return approvalType;
}
+ /**
+ * Sets the approval type.
+ *
+ * @param approvalType the new approval type
+ */
public void setApprovalType(ApprovalTypesEnum approvalType) {
this.approvalType = approvalType;
}
+ /**
+ * Gets the approval date time.
+ *
+ * @return the approval date time
+ */
public Timestamp getApprovalDateTime() {
return approvalDateTime;
}
+ /**
+ * Sets the approval date time.
+ *
+ * @param approvalDateTime the new approval date time
+ */
public void setApprovalDateTime(Timestamp approvalDateTime) {
this.approvalDateTime = approvalDateTime;
}
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSInfo.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSInfo.java
index 1f7e317..3d104d2 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSInfo.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSInfo.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright � 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright � 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,18 +31,18 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
-import java.util.List;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
/**
* The persistent class for the approval_types database table.
- *
+ *
*/
@ApiModel(value = "Change Management Scheduling Info", description = "Details of schedule being requested")
public class CMSInfo implements Serializable {
@@ -61,12 +61,14 @@ public class CMSInfo implements Serializable {
private Integer concurrencyLimit;
@ApiModelProperty(
- value = "Name of schedule optimization policy used by the change management cmso optimizer to determine available time slot")
+ value = "Name of schedule optimization policy used by the"
+ + " change management cmso optimizer to determine available time slot")
private String policyId;
@ApiModelProperty(value = "Lists of the VNFs to be changed and the desired change windows")
private List<VnfDetailsMessage> vnfDetails;
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSMessage.java
index afa4c44..cd8c946 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSMessage.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CMSMessage.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright � 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright � 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,16 +31,16 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
-import org.onap.optf.cmso.common.LogMessages;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import org.onap.optf.cmso.common.LogMessages;
/**
* The persistent class for the approval_types database table.
- *
+ *
*/
@ApiModel
public class CMSMessage extends ScheduleMessage implements Serializable {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ChangeWindowMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ChangeWindowMessage.java
index 58aaa2e..071ab8f 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ChangeWindowMessage.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ChangeWindowMessage.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright � 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright � 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,16 +31,17 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
@ApiModel(value = "Change Window",
- description = "Time window within which the scheduler optimizer can schedule the changes for the group of NVFs")
+ description = "Time window within which the scheduler"
+ + " optimizer can schedule the changes for the group of NVFs")
public class ChangeWindowMessage implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(ChangeWindowMessage.class);
@@ -67,6 +68,7 @@ public class ChangeWindowMessage implements Serializable {
this.endTime = endTime;
}
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDetailsMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDetailsMessage.java
index b021af9..a526065 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDetailsMessage.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDetailsMessage.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright � 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright � 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,11 +31,11 @@
package org.onap.optf.cmso.service.rs.models;
+import io.swagger.annotations.ApiModel;
import java.io.Serializable;
import java.util.List;
import org.onap.optf.cmso.model.ChangeManagementDetail;
import org.onap.optf.cmso.model.Schedule;
-import io.swagger.annotations.ApiModel;
/**
* The persistent class for the change_management_groups database table.
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDomainDataEnum.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDomainDataEnum.java
index 675a8d9..570fc06 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDomainDataEnum.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmDomainDataEnum.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -32,15 +32,10 @@
package org.onap.optf.cmso.service.rs.models;
public enum CmDomainDataEnum {
- WorkflowName(true), CallbackUrl(true), ServiceType(false), VnfType(false), SubscriberName(false), CallbackData(
- true),;
- private final Boolean required;
-
- private CmDomainDataEnum(boolean required) {
- this.required = required;
- }
-
- public boolean isRequired() {
- return required;
- }
+ Scheduler_RequestData,
+ @Deprecated
+ CallbackData,
+ @Deprecated
+ WorkflowName,
+ ;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoInfo.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoInfo.java
new file mode 100644
index 0000000..e2e4f10
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoInfo.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * The persistent class for the approval_types database table.
+ *
+ */
+@ApiModel(value = "Change Management Scheduling Info", description = "Details of schedule being requested")
+public class CmsoInfo implements Serializable {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(CmsoInfo.class);
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "Expected duration (in seconds) of a successful execution of a single VNF change.")
+ private Integer normalDurationInSeconds;
+
+ @ApiModelProperty(
+ value = "Additional duration (in seconds) to be added to support backout of an unsuccessful VNF change.")
+ private Integer additionalDurationInSeconds;
+
+ @ApiModelProperty(value = "Maximum number of VNF changes to schedule concurrently")
+ private Integer concurrencyLimit;
+
+ @ApiModelProperty(
+ value = "Name of schedule optimization policy used by"
+ + " the change management cmso optimizer to determine available time slot")
+ private String policyId;
+
+ @ApiModelProperty(value = "Lists of the VNFs to be changed and the desired change windows")
+ private List<VnfDetailsMessage> vnfDetails;
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+ /**
+ * Gets the normal duration in seconds.
+ *
+ * @return the normal duration in seconds
+ */
+ public Integer getNormalDurationInSeconds() {
+ return normalDurationInSeconds;
+ }
+
+ /**
+ * Sets the normal duration in seconds.
+ *
+ * @param normalDurationInSeconds the new normal duration in seconds
+ */
+ public void setNormalDurationInSeconds(Integer normalDurationInSeconds) {
+ this.normalDurationInSeconds = normalDurationInSeconds;
+ }
+
+ /**
+ * Gets the additional duration in seconds.
+ *
+ * @return the additional duration in seconds
+ */
+ public Integer getAdditionalDurationInSeconds() {
+ return additionalDurationInSeconds;
+ }
+
+ /**
+ * Sets the additional duration in seconds.
+ *
+ * @param additionalDurationInSeconds the new additional duration in seconds
+ */
+ public void setAdditionalDurationInSeconds(Integer additionalDurationInSeconds) {
+ this.additionalDurationInSeconds = additionalDurationInSeconds;
+ }
+
+ /**
+ * Gets the concurrency limit.
+ *
+ * @return the concurrency limit
+ */
+ public Integer getConcurrencyLimit() {
+ return concurrencyLimit;
+ }
+
+ /**
+ * Sets the concurrency limit.
+ *
+ * @param concurrencyLimit the new concurrency limit
+ */
+ public void setConcurrencyLimit(Integer concurrencyLimit) {
+ this.concurrencyLimit = concurrencyLimit;
+ }
+
+ /**
+ * Gets the policy id.
+ *
+ * @return the policy id
+ */
+ public String getPolicyId() {
+ return policyId;
+ }
+
+ /**
+ * Sets the policy id.
+ *
+ * @param policyId the new policy id
+ */
+ public void setPolicyId(String policyId) {
+ this.policyId = policyId;
+ }
+
+ /**
+ * Gets the vnf details.
+ *
+ * @return the vnf details
+ */
+ public List<VnfDetailsMessage> getVnfDetails() {
+ return vnfDetails;
+ }
+
+ /**
+ * Sets the vnf details.
+ *
+ * @param vnfDetails the new vnf details
+ */
+ public void setVnfDetails(List<VnfDetailsMessage> vnfDetails) {
+ this.vnfDetails = vnfDetails;
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoMessage.java
new file mode 100644
index 0000000..e81e212
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/CmsoMessage.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * 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.onap.optf.cmso.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import org.onap.optf.cmso.common.LogMessages;
+
+/**
+ * The persistent class for the approval_types database table.
+ *
+ */
+@ApiModel
+public class CmsoMessage extends ScheduleMessage implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ private CmsoInfo schedulingInfo;
+
+ @Override
+ public CmsoInfo getSchedulingInfo() {
+ // TODO Auto-generated method stub
+ return schedulingInfo;
+ }
+
+ @Override
+ public void setSchedulingInfo(Object info) {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ String jsonString = mapper.writeValueAsString(info);
+ schedulingInfo = mapper.readValue(jsonString, CmsoInfo.class);
+ } catch (Exception e) {
+ debug.debug(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ errors.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckComponent.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckComponent.java
index 47d8d57..a9995c2 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckComponent.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckComponent.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,13 +31,16 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+/**
+ * The Class HealthCheckComponent.
+ */
@ApiModel
public class HealthCheckComponent implements Serializable {
private static final long serialVersionUID = 1L;
@@ -48,38 +51,84 @@ public class HealthCheckComponent implements Serializable {
private String status;
private Boolean healthy = false;
+ /**
+ * Gets the healthy.
+ *
+ * @return the healthy
+ */
public Boolean getHealthy() {
return healthy;
}
+ /**
+ * Sets the healthy.
+ *
+ * @param healthy the new healthy
+ */
public void setHealthy(Boolean healthy) {
this.healthy = healthy;
}
+ /**
+ * Gets the name.
+ *
+ * @return the name
+ */
public String getName() {
return name;
}
+ /**
+ * Sets the name.
+ *
+ * @param name the new name
+ */
public void setName(String name) {
this.name = name;
}
+ /**
+ * Gets the url.
+ *
+ * @return the url
+ */
public String getUrl() {
return url;
}
+ /**
+ * Sets the url.
+ *
+ * @param url the new url
+ */
public void setUrl(String url) {
this.url = url;
}
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
public String getStatus() {
return status;
}
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
public void setStatus(String status) {
this.status = status;
}
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckMessage.java
index 02cc65f..2108c13 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckMessage.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/HealthCheckMessage.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,15 +31,18 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * The Class HealthCheckMessage.
+ */
@ApiModel
public class HealthCheckMessage implements Serializable {
private static final long serialVersionUID = 1L;
@@ -52,50 +55,111 @@ public class HealthCheckMessage implements Serializable {
private List<HealthCheckComponent> components = new ArrayList<HealthCheckComponent>();
+ /**
+ * Gets the healthy.
+ *
+ * @return the healthy
+ */
public Boolean getHealthy() {
return healthy;
}
+ /**
+ * Sets the healthy.
+ *
+ * @param healthy the new healthy
+ */
public void setHealthy(Boolean healthy) {
this.healthy = healthy;
}
+ /**
+ * Gets the builds the info.
+ *
+ * @return the builds the info
+ */
public String getBuildInfo() {
return buildInfo;
}
+ /**
+ * Sets the builds the info.
+ *
+ * @param buildInfo the new builds the info
+ */
public void setBuildInfo(String buildInfo) {
this.buildInfo = buildInfo;
}
+ /**
+ * Gets the current time.
+ *
+ * @return the current time
+ */
public String getCurrentTime() {
return currentTime;
}
+ /**
+ * Sets the current time.
+ *
+ * @param currentTime the new current time
+ */
public void setCurrentTime(String currentTime) {
this.currentTime = currentTime;
}
+ /**
+ * Gets the hostname.
+ *
+ * @return the hostname
+ */
public String getHostname() {
return hostname;
}
+ /**
+ * Sets the hostname.
+ *
+ * @param hostname the new hostname
+ */
public void setHostname(String hostname) {
this.hostname = hostname;
}
+ /**
+ * Gets the components.
+ *
+ * @return the components
+ */
public List<HealthCheckComponent> getComponents() {
return components;
}
+ /**
+ * Sets the components.
+ *
+ * @param components the new components
+ */
public void setComponents(List<HealthCheckComponent> components) {
this.components = components;
}
+ /**
+ * Adds the component.
+ *
+ * @param components the components
+ */
public void addComponent(HealthCheckComponent components) {
this.components.add(components);
}
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ScheduleMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ScheduleMessage.java
index a89e818..6fb422a 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ScheduleMessage.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/ScheduleMessage.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,27 +31,37 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
/**
* The persistent class for the approval_types database table.
- *
+ *
*/
@ApiModel(value = "Schedule Request", description = "Request to schedule VNF change management workflow(s).")
public abstract class ScheduleMessage implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(ScheduleMessage.class);
+ /**
+ * Gets the scheduling info.
+ *
+ * @return the scheduling info
+ */
public abstract Object getSchedulingInfo();
+ /**
+ * Sets the scheduling info.
+ *
+ * @param info the new scheduling info
+ */
public abstract void setSchedulingInfo(Object info);
// public abstract void setSchedulingInfo(Object schedulingInfo);
@@ -71,46 +81,102 @@ public abstract class ScheduleMessage implements Serializable {
@ApiModelProperty(value = "Domain data as name value/pairs. (i.e. CallbackUrl, CallbackData, WorkflowName)")
private List<Map<String, String>> domainData;
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
public String getDomain() {
return domain;
}
+ /**
+ * Sets the domain.
+ *
+ * @param domain the new domain
+ */
public void setDomain(String domain) {
this.domain = domain;
}
+ /**
+ * Gets the schedule id.
+ *
+ * @return the schedule id
+ */
public String getScheduleId() {
return scheduleId;
}
+ /**
+ * Sets the schedule id.
+ *
+ * @param scheduleId the new schedule id
+ */
public void setScheduleId(String scheduleId) {
this.scheduleId = scheduleId;
}
+ /**
+ * Gets the schedule name.
+ *
+ * @return the schedule name
+ */
public String getScheduleName() {
return scheduleName;
}
+ /**
+ * Sets the schedule name.
+ *
+ * @param scheduleName the new schedule name
+ */
public void setScheduleName(String scheduleName) {
this.scheduleName = scheduleName;
}
+ /**
+ * Gets the user id.
+ *
+ * @return the user id
+ */
public String getUserId() {
return userId;
}
+ /**
+ * Sets the user id.
+ *
+ * @param userId the new user id
+ */
public void setUserId(String userId) {
this.userId = userId;
}
+ /**
+ * Gets the domain data.
+ *
+ * @return the domain data
+ */
public List<Map<String, String>> getDomainData() {
return domainData;
}
+ /**
+ * Sets the domain data.
+ *
+ * @param domainData the domain data
+ */
public void setDomainData(List<Map<String, String>> domainData) {
this.domainData = domainData;
}
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/VnfDetailsMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/VnfDetailsMessage.java
index b1dde5d..4940c98 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/VnfDetailsMessage.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/VnfDetailsMessage.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,15 +31,18 @@
package org.onap.optf.cmso.service.rs.models;
-import java.io.Serializable;
-import java.util.List;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
+/**
+ * The Class VnfDetailsMessage.
+ */
@ApiModel(value = "VNF Details", description = "Details and scheduling criteria for the VNFs to be changed.")
public class VnfDetailsMessage implements Serializable {
private static final long serialVersionUID = 1L;
@@ -52,33 +55,70 @@ public class VnfDetailsMessage implements Serializable {
private List<String> node;
@ApiModelProperty(
- value = "Lists of desired change windows that the optimizer can select from. (Only 1 change window supported at this time)")
+ value = "Lists of desired change windows that the optimize"
+ + "r can select from. (Only 1 change window supported at this time)")
private List<ChangeWindowMessage> changeWindow;
+ /**
+ * Gets the group id.
+ *
+ * @return the group id
+ */
public String getGroupId() {
return groupId;
}
+ /**
+ * Sets the group id.
+ *
+ * @param groupId the new group id
+ */
public void setGroupId(String groupId) {
this.groupId = groupId;
}
+ /**
+ * Gets the node.
+ *
+ * @return the node
+ */
public List<String> getNode() {
return node;
}
+ /**
+ * Sets the node.
+ *
+ * @param node the new node
+ */
public void setNode(List<String> node) {
this.node = node;
}
+ /**
+ * Gets the change window.
+ *
+ * @return the change window
+ */
public List<ChangeWindowMessage> getChangeWindow() {
return changeWindow;
}
+ /**
+ * Sets the change window.
+ *
+ * @param changeWindow the new change window
+ */
public void setChangeWindow(List<ChangeWindowMessage> changeWindow) {
this.changeWindow = changeWindow;
}
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ChangeWindow.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ChangeWindow.java
index 7553c87..5aab6ac 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ChangeWindow.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ChangeWindow.java
@@ -1,79 +1,99 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs.models.v2;
-import java.io.Serializable;
-import java.util.Date;
-
-import org.springframework.format.annotation.DateTimeFormat;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
-@ApiModel(value = "Change Window",
- description = "Time window for which tickets are to returned")
+/**
+ * The Class ChangeWindow.
+ */
+@ApiModel(value = "Change Window", description = "Time window for which tickets are to returned")
public class ChangeWindow implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(ChangeWindow.class);
@ApiModelProperty(value = "Earliest time for which changes may begin.")
- @DateTimeFormat(pattern="yyyy-MM-dd'T'hh:mm:ss'Z'")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
private Date startTime;
@ApiModelProperty(value = "Latest time by which all changes must be completed.")
- @DateTimeFormat(pattern="yyyy-MM-dd'T'hh:mm:ss'Z'")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
private Date endTime;
+ /**
+ * Gets the start time.
+ *
+ * @return the start time
+ */
public Date getStartTime() {
return startTime;
}
+ /**
+ * Sets the start time.
+ *
+ * @param startTime the new start time
+ */
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
+ /**
+ * Gets the end time.
+ *
+ * @return the end time
+ */
public Date getEndTime() {
return endTime;
}
+ /**
+ * Sets the end time.
+ *
+ * @param endTime the new end time
+ */
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ElementInfo.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ElementInfo.java
index 35649ea..57619a9 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ElementInfo.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/ElementInfo.java
@@ -1,46 +1,49 @@
-/*******************************************************************************
- *
- * Copyright © 2019 AT&T Intellectual Property.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs.models.v2;
+/**
+ * *****************************************************************************
+ *
+ * <p>
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * <p>
+ * Licensed 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
+ *
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * <p>
+ * 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.
+ *
+ * <p>
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * <p>
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * <p>
+ * Unless required by applicable law or agreed to in writing, documentation 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.
+ * ****************************************************************************
+ */
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
+package org.onap.optf.cmso.service.rs.models.v2;
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
@ApiModel(value = "Optimizer Element", description = "Element to be scheduled.")
public class ElementInfo implements Serializable {
@@ -56,32 +59,43 @@ public class ElementInfo implements Serializable {
@ApiModelProperty(value = "Request for be scheduled.")
public Object request;
- public String getElementId() {
- return elementId;
- }
+ @ApiModelProperty(value = "VNF group identifier.")
+ public String groupId;
- public void setElementId(String elementId) {
- this.elementId = elementId;
- }
+ public String getElementId() {
+ return elementId;
+ }
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
- public List<NameValue> getElementData() {
- return elementData;
- }
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
- public void setElementData(List<NameValue> elementData) {
- this.elementData = elementData;
- }
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
- public Object getRequest() {
- return request;
- }
+ public Object getRequest() {
+ return request;
+ }
- public void setRequest(Object request) {
- this.request = request;
- }
+ public void setRequest(Object request) {
+ this.request = request;
+ }
+
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
- public String toString() {
+ @Override
+ public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/NameValue.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/NameValue.java
index 9b71f76..1bd0d3c 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/NameValue.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/NameValue.java
@@ -1,91 +1,119 @@
/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs.models.v2;
-import java.io.Serializable;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
-@ApiModel(value = "Name Value Data",
- description = "Instance of a name/value")
+/**
+ * The Class NameValue.
+ */
+@ApiModel(value = "Name Value Data", description = "Instance of a name/value")
public class NameValue implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(NameValue.class);
- public NameValue()
- {
-
+ /**
+ * Instantiates a new name value.
+ */
+ public NameValue() {
+
}
- public NameValue(String name, Object value)
- {
- this.name = name;
- this.value = value;
+ /**
+ * Instantiates a new name value.
+ *
+ * @param name the name
+ * @param value the value
+ */
+ public NameValue(String name, Object value) {
+ this.name = name;
+ this.value = value;
}
-
+
@ApiModelProperty(value = "Name.")
private String name;
@ApiModelProperty(value = "Value.")
private Object value;
-
-
+
+
+ /**
+ * Gets the name.
+ *
+ * @return the name
+ */
public String getName() {
- return name;
- }
+ return name;
+ }
- public void setName(String name) {
- this.name = name;
- }
+ /**
+ * Sets the name.
+ *
+ * @param name the new name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
- public Object getValue() {
- return value;
- }
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ public Object getValue() {
+ return value;
+ }
- public void setValue(Object value) {
- this.value = value;
- }
+ /**
+ * Sets the value.
+ *
+ * @param value the new value
+ */
+ public void setValue(Object value) {
+ this.value = value;
+ }
- public String toString() {
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/OptimizedScheduleMessage.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/OptimizedScheduleMessage.java
new file mode 100644
index 0000000..ac7037a
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/OptimizedScheduleMessage.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.service.rs.models.v2;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * The persistent class for the approval_types database table.
+ *
+ */
+@ApiModel(value = "Optimized Schedule Request", description = "Request to schedule VNF change management workflow(s).")
+public class OptimizedScheduleMessage implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(OptimizedScheduleMessage.class);
+
+ @ApiModelProperty(value = "Schedule domain : ChangeManagement")
+ private String domain;
+
+ @ApiModelProperty(value = "Schedule id that must be unique within the domain. Use of UUID is highly recommended.")
+ private String scheduleId;
+
+ @ApiModelProperty(value = "User provided name of the schedule (deaults to scheduleId")
+ private String scheduleName;
+
+ @ApiModelProperty(value = "ATTUID of the user requesting the schedule.")
+ private String userId;
+
+ @ApiModelProperty(value = "Implementation specific name value pairs.")
+ private List<NameValue> commonData;
+
+ @ApiModelProperty(value = "Scheduling data.")
+ private SchedulingData schedulingData;
+
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
+ public String getDomain() {
+ return domain;
+ }
+
+ /**
+ * Sets the domain.
+ *
+ * @param domain the new domain
+ */
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ /**
+ * Gets the schedule id.
+ *
+ * @return the schedule id
+ */
+ public String getScheduleId() {
+ return scheduleId;
+ }
+
+ /**
+ * Sets the schedule id.
+ *
+ * @param scheduleId the new schedule id
+ */
+ public void setScheduleId(String scheduleId) {
+ this.scheduleId = scheduleId;
+ }
+
+ /**
+ * Gets the schedule name.
+ *
+ * @return the schedule name
+ */
+ public String getScheduleName() {
+ return scheduleName;
+ }
+
+ /**
+ * Sets the schedule name.
+ *
+ * @param scheduleName the new schedule name
+ */
+ public void setScheduleName(String scheduleName) {
+ this.scheduleName = scheduleName;
+ }
+
+ /**
+ * Gets the user id.
+ *
+ * @return the user id
+ */
+ public String getUserId() {
+ return userId;
+ }
+
+ /**
+ * Sets the user id.
+ *
+ * @param userId the new user id
+ */
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ /**
+ * Gets the common data.
+ *
+ * @return the common data
+ */
+ public List<NameValue> getCommonData() {
+ return commonData;
+ }
+
+ /**
+ * Sets the common data.
+ *
+ * @param commonData the new common data
+ */
+ public void setCommonData(List<NameValue> commonData) {
+ this.commonData = commonData;
+ }
+
+ /**
+ * Gets the scheduling data.
+ *
+ * @return the scheduling data
+ */
+ public SchedulingData getSchedulingData() {
+ return schedulingData;
+ }
+
+ /**
+ * Sets the scheduling data.
+ *
+ * @param schedulingData the new scheduling data
+ */
+ public void setSchedulingData(SchedulingData schedulingData) {
+ this.schedulingData = schedulingData;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/PolicyInfo.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/PolicyInfo.java
new file mode 100644
index 0000000..1bf47c0
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/PolicyInfo.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.service.rs.models.v2;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Supported Policy Information", description = "Policy Information returned from get policies API.")
+public class PolicyInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(PolicyInfo.class);
+
+ @ApiModelProperty(value = "Policy name")
+ private String policyName;
+
+ @ApiModelProperty(value = "Named values to modify/override policy attributes.")
+ public List<NameValue> policyModifiers = new ArrayList<>();
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+
+ public List<NameValue> getPolicyModifiers() {
+ return policyModifiers;
+ }
+
+ public void setPolicyModifiers(List<NameValue> policyModifiers) {
+ this.policyModifiers = policyModifiers;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/SchedulingData.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/SchedulingData.java
new file mode 100644
index 0000000..e1e0d91
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/models/v2/SchedulingData.java
@@ -0,0 +1,193 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.service.rs.models.v2;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The persistent class for the approval_types database table.
+ *
+ */
+@ApiModel(value = "Change Management Scheduling Info", description = "Details of schedule being requested")
+public class SchedulingData implements Serializable {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(SchedulingData.class);
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "Expected duration (in seconds) of a successful execution of a single VNF change.")
+ private Integer normalDurationInSeconds;
+
+ @ApiModelProperty(
+ value = "Additional duration (in seconds) to be added"
+ + " to support backout of an unsuccessful VNF change.")
+ private Integer additionalDurationInSeconds;
+
+ @ApiModelProperty(value = "Maximum number of VNF changes to schedule concurrently")
+ private Integer concurrencyLimit;
+
+ @ApiModelProperty(value = "Lists of desired change windows to schedule the elements.")
+ private List<ChangeWindow> changeWindows = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the policies to control optimization.")
+ private List<PolicyInfo> policies = new ArrayList<>();
+
+ @ApiModelProperty(value = "Lists of the VNFs to be changed and the desired change windows")
+ private List<ElementInfo> elements;
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+ /**
+ * Gets the normal duration in seconds.
+ *
+ * @return the normal duration in seconds
+ */
+ public Integer getNormalDurationInSeconds() {
+ return normalDurationInSeconds;
+ }
+
+ /**
+ * Sets the normal duration in seconds.
+ *
+ * @param normalDurationInSeconds the new normal duration in seconds
+ */
+ public void setNormalDurationInSeconds(Integer normalDurationInSeconds) {
+ this.normalDurationInSeconds = normalDurationInSeconds;
+ }
+
+ /**
+ * Gets the additional duration in seconds.
+ *
+ * @return the additional duration in seconds
+ */
+ public Integer getAdditionalDurationInSeconds() {
+ return additionalDurationInSeconds;
+ }
+
+ /**
+ * Sets the additional duration in seconds.
+ *
+ * @param additionalDurationInSeconds the new additional duration in seconds
+ */
+ public void setAdditionalDurationInSeconds(Integer additionalDurationInSeconds) {
+ this.additionalDurationInSeconds = additionalDurationInSeconds;
+ }
+
+ /**
+ * Gets the concurrency limit.
+ *
+ * @return the concurrency limit
+ */
+ public Integer getConcurrencyLimit() {
+ return concurrencyLimit;
+ }
+
+ /**
+ * Sets the concurrency limit.
+ *
+ * @param concurrencyLimit the new concurrency limit
+ */
+ public void setConcurrencyLimit(Integer concurrencyLimit) {
+ this.concurrencyLimit = concurrencyLimit;
+ }
+
+ /**
+ * Gets the change windows.
+ *
+ * @return the change windows
+ */
+ public List<ChangeWindow> getChangeWindows() {
+ return changeWindows;
+ }
+
+ /**
+ * Sets the change windows.
+ *
+ * @param changeWindows the new change windows
+ */
+ public void setChangeWindows(List<ChangeWindow> changeWindows) {
+ this.changeWindows = changeWindows;
+ }
+
+ /**
+ * Gets the policies.
+ *
+ * @return the policies
+ */
+ public List<PolicyInfo> getPolicies() {
+ return policies;
+ }
+
+ /**
+ * Sets the policies.
+ *
+ * @param policies the new policies
+ */
+ public void setPolicies(List<PolicyInfo> policies) {
+ this.policies = policies;
+ }
+
+ /**
+ * Gets the elements.
+ *
+ * @return the elements
+ */
+ public List<ElementInfo> getElements() {
+ return elements;
+ }
+
+ /**
+ * Sets the elements.
+ *
+ * @param elements the new elements
+ */
+ public void setElements(List<ElementInfo> elements) {
+ this.elements = elements;
+ }
+
+}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/so/bean/MsoOrchestrationQueryResponse.java b/cmso-service/src/main/java/org/onap/optf/cmso/so/bean/MsoOrchestrationQueryResponse.java
index 2e46be0..1d4070e 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/so/bean/MsoOrchestrationQueryResponse.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/so/bean/MsoOrchestrationQueryResponse.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,7 +32,7 @@
package org.onap.optf.cmso.so.bean;
public class MsoOrchestrationQueryResponse {
- public enum MSO_STATUS {
+ public enum MsoStatus {
UNKNOWN, COMPLETE, FAILED, IN_PROGRESS,
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusClient.java b/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusClient.java
index 7a7821e..e760b85 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusClient.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusClient.java
@@ -1,40 +1,39 @@
/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.sostatus;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
-
+import java.util.UUID;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
@@ -42,44 +41,38 @@ import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.onap.observations.Mdc;
import org.onap.observations.Observation;
import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
import org.onap.optf.cmso.common.CMSStatusEnum;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.PropertiesManagement;
-import org.onap.optf.cmso.filters.CMSOClientFilters;
+import org.onap.optf.cmso.filters.CmsoClientFilters;
import org.onap.optf.cmso.model.ChangeManagementSchedule;
import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
import org.onap.optf.cmso.model.dao.ScheduleDAO;
import org.onap.optf.cmso.service.rs.models.HealthCheckComponent;
import org.onap.optf.cmso.so.bean.MsoOrchestrationQueryResponse;
-import org.onap.optf.cmso.so.bean.MsoOrchestrationQueryResponse.MSO_STATUS;
+import org.onap.optf.cmso.so.bean.MsoOrchestrationQueryResponse.MsoStatus;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
@Component
public class MsoStatusClient {
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
- ChangeManagementScheduleDAO cmScheduleDAO;
+ ChangeManagementScheduleDAO cmScheduleDao;
@Autowired
- ChangeManagementGroupDAO cmGroupDAO;
+ ChangeManagementGroupDAO cmGroupdao;
@Autowired
- ScheduleDAO scheduleDAO;
+ ScheduleDAO scheduleDao;
@Autowired
Environment env;
@@ -87,21 +80,33 @@ public class MsoStatusClient {
@Autowired
PropertiesManagement pm;
- public void execute(Integer id) throws JobExecutionException {
+ /**
+ * Execute.
+ *
+ * @param id the id
+ * @throws JobExecutionException the job execution exception
+ */
+ public void execute(String id) throws JobExecutionException {
debug.debug(LogMessages.MSO_STATUS_JOB, "Entered", id.toString());
try {
- ChangeManagementSchedule cmSchedule = cmScheduleDAO.lockOne(id);
+ UUID uuid = UUID.fromString(id);
+ ChangeManagementSchedule cmSchedule = cmScheduleDao.lockOne(uuid);
if (cmSchedule == null) {
Observation.report(LogMessages.MSO_POLLING_MISSING_SCHEDULE, id.toString());
return;
}
poll(cmSchedule);
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
}
debug.debug(LogMessages.MSO_STATUS_JOB, "Exited", id.toString());
}
+ /**
+ * Poll.
+ *
+ * @param cmSchedule the cm schedule
+ */
@Transactional
public void poll(ChangeManagementSchedule cmSchedule) {
Map<String, String> mdcSave = Mdc.save();
@@ -111,12 +116,13 @@ public class MsoStatusClient {
String url = env.getProperty("so.url");
String user = env.getProperty("so.user");
String pass = pm.getProperty("so.pass", "");
- if (!url.endsWith("/"))
+ if (!url.endsWith("/")) {
url = url + "/";
+ }
url = url + requestId;
Client client = ClientBuilder.newClient();
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(new CMSOClientFilters());
+ client.register(new CmsoClientFilters());
WebTarget target = client.target(url);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = null;
@@ -130,11 +136,11 @@ public class MsoStatusClient {
if (resp != null) {
cmSchedule.setMsoStatus(resp.getRequestState());
cmSchedule.setMsoMessage(resp.getStatusMessage());
- MSO_STATUS msoStatus = MSO_STATUS.UNKNOWN;
+ MsoStatus msoStatus = MsoStatus.UNKNOWN;
try {
- msoStatus = MSO_STATUS.valueOf(resp.getRequestState());
+ msoStatus = MsoStatus.valueOf(resp.getRequestState());
} catch (Exception e) {
- Observation.report(LogMessages.UNRECOGNIZED_MSO_STATUS, resp.getRequestState());
+ Observation.report(LogMessages.UNRECOGNIZED_MSO_STATUS, resp.getRequestState());
}
long finishTime = getFinishTime(resp);
switch (msoStatus) {
@@ -159,16 +165,14 @@ public class MsoStatusClient {
}
break;
- case 404: // Not found
- {
+ case 404: { // Not found
// Do not keep polling...
cmSchedule.setStatus(CMSStatusEnum.Failed.toString());
cmSchedule.setMsoStatus("Not found");
cmSchedule.setMsoMessage("Call to MSO Failed :" + response.toString());
}
break;
- case 400: // Bad request
- {
+ case 400: { // Bad request
// Do not keep polling...
cmSchedule.setStatus(CMSStatusEnum.Error.toString());
cmSchedule.setMsoStatus("Bad Request");
@@ -189,7 +193,7 @@ public class MsoStatusClient {
cmSchedule.setMsoStatus("ConnectionException");
cmSchedule.setMsoMessage("Could not call MSO:" + e.getMessage());
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
// Probably a transient error... Keep polling
cmSchedule.setMsoTimeMillis(System.currentTimeMillis());
cmSchedule.setMsoStatus("Exception");
@@ -198,7 +202,7 @@ public class MsoStatusClient {
Mdc.restore(mdcSave);
}
// Propagate final MSO status to top level
- cmScheduleDAO.save(cmSchedule);
+ cmScheduleDao.save(cmSchedule);
propagateStatus(cmSchedule);
}
@@ -212,7 +216,8 @@ public class MsoStatusClient {
Date dateTime = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z").parse(timestr);
finishTime = dateTime.getTime();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, "Unable to parse MSO finish timestamp: " + timestr);
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e,
+ "Unable to parse MSO finish timestamp: " + timestr);
}
}
return finishTime;
@@ -230,22 +235,26 @@ public class MsoStatusClient {
ObjectNode request = (ObjectNode) json.get("request");
ObjectNode requestStatus = (ObjectNode) request.get("requestStatus");
MsoOrchestrationQueryResponse msoResponse =
- om.treeToValue(requestStatus, MsoOrchestrationQueryResponse.class);
+ om.treeToValue(requestStatus, MsoOrchestrationQueryResponse.class);
return msoResponse;
} catch (Exception e) {
- Observation.report(LogMessages.UNABLE_TO_PARSE_MSO_RESPONSE, e, e.getMessage(), resp);
+ Observation.report(LogMessages.UNABLE_TO_PARSE_MSO_RESPONSE, e, e.getMessage(), resp);
}
return null;
}
+ /**
+ * Health check.
+ *
+ * @return the health check component
+ */
public HealthCheckComponent healthCheck() {
Map<String, String> mdcSave = Mdc.save();
String requestId = "healthCheck";
String url = env.getProperty("so.url", "");
- String user = env.getProperty("so.user", "");
- String pass = pm.getProperty("so.pass", "");
- if (!url.endsWith("/"))
+ if (!url.endsWith("/")) {
url = url + "/";
+ }
url = url + "healthcheck";
HealthCheckComponent hcc = new HealthCheckComponent();
@@ -253,8 +262,11 @@ public class MsoStatusClient {
hcc.setUrl(url);
Client client = ClientBuilder.newClient();
+ String user = env.getProperty("so.user", "");
+ String pass = pm.getProperty("so.pass", "");
+
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(new CMSOClientFilters());
+ client.register(new CmsoClientFilters());
WebTarget target = client.target(url);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusJob.java b/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusJob.java
index df9f361..0a4c2f2 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusJob.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/MsoStatusJob.java
@@ -1,36 +1,34 @@
/*
- * Copyright © 2017-2019 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.sostatus;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.UUID;
import org.onap.observations.Mdc;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.model.ChangeManagementSchedule;
@@ -42,12 +40,10 @@ import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
/**
- * This is the Quartz Job that is run to send the workflow to VID for execution
- *
+ * This is the Quartz Job that is run to send the workflow to VID for execution.
+ *
*
*/
@Component
@@ -61,7 +57,7 @@ public class MsoStatusJob implements Job {
MsoStatusClient mso;
@Autowired
- ChangeManagementScheduleDAO cmScheduleDAO;
+ ChangeManagementScheduleDAO cmScheduleDao;
@Autowired
Environment env;
@@ -73,20 +69,21 @@ public class MsoStatusJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
Mdc.quartzJobBegin(context);
- Integer id = context.getJobDetail().getJobDataMap().getInt(ContextKeys.scheduleId.toString());
+ String id = context.getJobDetail().getJobDataMap().getString(ContextKeys.scheduleId.toString());
String requestId = context.getJobDetail().getJobDataMap().getString(ContextKeys.msoRequestId.toString());
debug.debug(LogMessages.MSO_STATUS_JOB, "Entered", requestId, id.toString());
try {
- ChangeManagementSchedule cmSchedule = cmScheduleDAO.findById(id).orElse(null);
+ UUID uuid = UUID.fromString(id);
+ ChangeManagementSchedule cmSchedule = cmScheduleDao.findById(uuid).orElse(null);
if (cmSchedule == null) {
- log.warn(LogMessages.MSO_POLLING_MISSING_SCHEDULE, id.toString(), requestId);
+ log.warn(LogMessages.MSO_POLLING_MISSING_SCHEDULE, id, requestId);
return;
}
mso.poll(cmSchedule);
} catch (Exception e) {
errors.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
}
- debug.debug(LogMessages.MSO_STATUS_JOB, "Exited", requestId, id.toString());
+ debug.debug(LogMessages.MSO_STATUS_JOB, "Exited", requestId, id);
}
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/ScheduleStatusJob.java b/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/ScheduleStatusJob.java
index c3254aa..9eacfd1 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/ScheduleStatusJob.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/sostatus/ScheduleStatusJob.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,23 +31,24 @@
package org.onap.optf.cmso.sostatus;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import java.util.List;
import java.util.Map;
-
+import java.util.UUID;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.onap.observations.Mdc;
import org.onap.observations.Observation;
import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
import org.onap.optf.cmso.common.DomainsEnum;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.PropertiesManagement;
-import org.onap.optf.cmso.filters.CMSOClientFilters;
+import org.onap.optf.cmso.filters.CmsoClientFilters;
import org.onap.optf.cmso.model.ChangeManagementSchedule;
import org.onap.optf.cmso.model.Schedule;
import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
@@ -61,12 +62,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
/**
- * This is the Quartz Job that is run to send the workflow to VID for execution
- *
+ * This is the Quartz Job that is run to send the workflow to VID for execution.
+ *
*
*/
@Component
@@ -75,10 +73,10 @@ public class ScheduleStatusJob implements Job {
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
- ScheduleDAO scheduleDAO;
+ ScheduleDAO scheduleDao;
@Autowired
- ChangeManagementScheduleDAO cmScheduleDAO;
+ ChangeManagementScheduleDAO cmScheduleDao;
@Autowired
PropertiesManagement pm;
@@ -86,15 +84,21 @@ public class ScheduleStatusJob implements Job {
@Autowired
Environment env;
+ /**
+ * Execute.
+ *
+ * @param context the context
+ * @throws JobExecutionException the job execution exception
+ */
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
debug.debug(LogMessages.SCHEDULE_STATUS_JOB, "Entered");
try {
// First poll SO for WF status
- List<ChangeManagementSchedule> list = cmScheduleDAO.findAllTriggered();
+ List<ChangeManagementSchedule> list = cmScheduleDao.findAllTriggered();
for (ChangeManagementSchedule s : list) {
- debug.debug("Dispathcing to check status of CM schedule Id=" + s.getId());
- dispatchMso(s.getId());
+ debug.debug("Dispathcing to check status of CM schedule Id=" + s.getUuid());
+ dispatchMso(s.getUuid());
}
} catch (Exception e) {
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
@@ -103,10 +107,10 @@ public class ScheduleStatusJob implements Job {
//
// Update overall status of in flight schedules including closing tickets
- List<Schedule> list = scheduleDAO.findAllInProgress(DomainsEnum.ChangeManagement.toString());
+ List<Schedule> list = scheduleDao.findAllInProgress(DomainsEnum.ChangeManagement.toString());
for (Schedule s : list) {
debug.debug("Dispatching to check status of scheduleId=" + s.getScheduleId());
- dispatchScheduleStatusChecker(s.getId());
+ dispatchScheduleStatusChecker(s.getUuid());
}
} catch (Exception e) {
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
@@ -114,17 +118,22 @@ public class ScheduleStatusJob implements Job {
debug.debug(LogMessages.SCHEDULE_STATUS_JOB, "Exited");
}
- public void dispatchScheduleStatusChecker(Integer id) {
+ /**
+ * Dispatch schedule status checker.
+ *
+ * @param uuid the uuid
+ */
+ public void dispatchScheduleStatusChecker(UUID uuid) {
Map<String, String> mdcSave = Mdc.save();
try {
String url = env.getProperty("cmso.dispatch.url", "http://localhost:8089");
String path = env.getProperty("cmso.dispatch.status.path", "/cmso/dispatch/schedulestatus/");
- url = url + path + id;
+ url = url + path + uuid;
String user = env.getProperty("mechid.user", "");
String pass = pm.getProperty("mechid.pass", "");
Client client = ClientBuilder.newClient();
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(CMSOClientFilters.class);
+ client.register(CmsoClientFilters.class);
WebTarget target = client.target(url);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = null;
@@ -152,17 +161,22 @@ public class ScheduleStatusJob implements Job {
}
- public void dispatchMso(Integer id) {
+ /**
+ * Dispatch mso.
+ *
+ * @param uuid the uuid
+ */
+ public void dispatchMso(UUID uuid) {
Map<String, String> mdcSave = Mdc.save();
try {
String url = env.getProperty("cmso.dispatch.url", "http://localhost:8089");
String path = env.getProperty("cmso.dispatch.sostatus.path", "/cmso/dispatch/sostatus/");
- url = url + path + id;
+ url = url + path + uuid;
String user = env.getProperty("mechid.user", "");
String pass = pm.getProperty("mechid.pass", "");
Client client = ClientBuilder.newClient();
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(CMSOClientFilters.class);
+ client.register(CmsoClientFilters.class);
WebTarget target = client.target(url);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
Response response = null;
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackService.java b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackService.java
index f75365a..0200520 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackService.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackService.java
@@ -1,36 +1,36 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.test.loopback;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
@@ -40,14 +40,10 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-import org.onap.optf.cmso.optimizer.bean.CMOptimizerRequest;
+import org.onap.optf.cmso.optimizer.model.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.model.OptimizerResponse;
import org.onap.optf.cmso.so.bean.MsoOrchestrationQueryResponse;
import org.onap.optf.cmso.wf.bean.WfChangeManagementResponse;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
@Api
@Path("/v1/loopbacktest")
@@ -55,24 +51,34 @@ import io.swagger.annotations.ApiResponses;
public interface SchedulerTestLoopbackService {
// ******************************************************************
@POST
- @Path("/optimizer")
+ @Path("/optimize/schedule")
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "", notes = "Test Optimizer connection in loopback mode.")
@ApiResponses(value = {@ApiResponse(code = 202, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
- public Response putToOptimizer(@ApiParam(value = "SNIRO request message") CMOptimizerRequest request,
- @Context UriInfo uri);
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response putToOptimizer(@ApiParam(value = "Optimizer request message") OptimizerRequest request,
+ @Context UriInfo uri);
+
+ // ******************************************************************
+ @GET
+ @Path("/optimize/schedule/{id}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @ApiOperation(value = "", notes = "Test Optimizer connection in loopback mode.", response = OptimizerResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response getOptimizerResponse(@ApiParam(value = "Optimizer request is") @PathParam("id") String id,
+ @Context UriInfo uri);
// ******************************************************************
@POST
@Path("/onap/so/infra/orchestrationRequests/v7/schedule/{vnfName}")
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "", notes = "Test SO sheduling in loopback mode.",
- response = WfChangeManagementResponse.class)
+ response = WfChangeManagementResponse.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response soScheduleLoopback(@ApiParam(value = "vnfName") @PathParam("vnfName") String vnfName,
- @ApiParam(value = "SO request message") String request, @Context UriInfo uri);
+ @ApiParam(value = "SO request message") String request, @Context UriInfo uri);
// ******************************************************************
@GET
@@ -80,8 +86,8 @@ public interface SchedulerTestLoopbackService {
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "", notes = "Test SO Status query loopback.", response = MsoOrchestrationQueryResponse.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response soQueryLoopback(@ApiParam(value = "MSO request ID") @PathParam("requestId") String requestId,
- @Context UriInfo uri);
+ @Context UriInfo uri);
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackServiceImpl.java
index b2ff6d4..9be348a 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackServiceImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/SchedulerTestLoopbackServiceImpl.java
@@ -1,79 +1,67 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.test.loopback;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import javax.ws.rs.ProcessingException;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.ResponseProcessingException;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.UriInfo;
import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
+import org.onap.observations.Observation;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.PropertiesManagement;
-import org.onap.optf.cmso.optimizer.bean.CMOptimizerRequest;
-import org.onap.optf.cmso.optimizer.bean.CMOptimizerResponse;
-import org.onap.optf.cmso.optimizer.bean.CMRequestInfo;
-import org.onap.optf.cmso.optimizer.bean.CMSchedule;
-import org.onap.optf.cmso.optimizer.bean.CMSchedulingInfo;
-import org.onap.optf.cmso.optimizer.bean.CMVnfDetails;
-import org.onap.optf.cmso.service.rs.CMSOOptimizerCallbackImpl;
+import org.onap.optf.cmso.optimizer.model.OptimizerElementInfo;
+import org.onap.optf.cmso.optimizer.model.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.model.OptimizerResponse;
+import org.onap.optf.cmso.optimizer.model.OptimizerScheduleInfo;
+import org.onap.optf.cmso.optimizer.model.ScheduledElement;
+import org.onap.optf.cmso.optimizer.model.ScheduledElement.ScheduleType;
+import org.onap.optf.cmso.optimizer.model.UnScheduledElement;
+import org.onap.optf.cmso.service.rs.CmsoOptimizerCallbackImpl;
+import org.onap.optf.cmso.service.rs.models.v2.ChangeWindow;
import org.onap.optf.cmso.wf.bean.WfCmResponse200;
import org.onap.optf.cmso.wf.bean.WfMsoRequestReferences;
import org.onap.optf.cmso.wf.bean.WfMsoResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
@Controller
public class SchedulerTestLoopbackServiceImpl implements SchedulerTestLoopbackService {
private static EELFLogger log = EELFManager.getInstance().getLogger(SchedulerTestLoopbackServiceImpl.class);
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
- private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
@Autowired
Environment env;
@@ -81,70 +69,22 @@ public class SchedulerTestLoopbackServiceImpl implements SchedulerTestLoopbackSe
@Autowired
PropertiesManagement pm;
+ // **
+ // This is test mode only code.
+ private static Map<String, String> optimizerResponses = new HashMap<>();
+
@Override
- public Response putToOptimizer(CMOptimizerRequest request, UriInfo uri) {
+ public Response putToOptimizer(OptimizerRequest request, UriInfo uri) {
//
try {
- CMOptimizerResponse r = new CMOptimizerResponse();
- CMRequestInfo ri = request.getRequestInfo();
- CMSchedulingInfo si = request.getSchedulingInfo();
- r.setTransactionId(ri.getTransactionId());
- r.setRequestState("Done.");
- r.setScheduleId(ri.getRequestId());
- String callback = ri.getCallbackUrl();
-
- // This is a dumb opt. WIll not make sense for multiple groups
- // Use the code in the callback to help
- List<String> nodes = new ArrayList<String>();
- // get total number of nodes across all groups.
- for (CMVnfDetails sr : si.getVnfDetails()) {
- nodes.add(sr.getNode());
- }
-
- DateTime startTime = CMSOOptimizerCallbackImpl.convertISODate(si.getStartTime(), "startTime");
-
- // Ignore the finish time for now in the calc. Just accept what they
- // gave
- DateTime finishTime = CMSOOptimizerCallbackImpl.convertISODate(si.getEndTime(), "endTime");
- DateTimeFormatter sniroFmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").withZoneUTC();
-
- int add = si.getAdditionalDurationInSecs();
- int normal = si.getNormalDurationInSecs();
- int concurrencyLimit = si.getConcurrencyLimit();
- long totalDuration = (long) add + normal;
- long serialized = 0;
- if (nodes.size() > concurrencyLimit) {
- serialized = (nodes.size() / concurrencyLimit);
- serialized = (serialized * totalDuration) * 1000;
- }
- DateTime latestInstanceStartTime = startTime.plus(serialized);
- finishTime = latestInstanceStartTime.plus(totalDuration * 1000);
- // Reformat request into a response setting the groups start finish
- // time based upon
- Map<String, CMSchedule> map = new HashMap<String, CMSchedule>();
- for (CMVnfDetails sr : si.getVnfDetails()) {
- String groupId = sr.getGroupId();
- CMSchedule cms = map.get(groupId);
- if (cms == null) {
- cms = new CMSchedule();
- cms.setGroupId(groupId);
- cms.setFinishTime(groupId);
- map.put(groupId, cms);
- cms.setStartTime(sniroFmt.print(startTime));
- cms.setFinishTime(sniroFmt.print(finishTime));
- cms.setLatestInstanceStartTime(sniroFmt.print(latestInstanceStartTime));
- }
- cms.getNode().add(sr.getNode());
- }
- r.setSchedule(map.values().toArray(new CMSchedule[map.values().size()]));
-
- Thread responseThread = new Thread(new Runnable() {
- public void run() {
- sendAsyncResponse(r, callback);
- }
- });
- responseThread.start();
-
+ OptimizerResponse rsp = new OptimizerResponse();
+ rsp.setRequestId(request.getRequestId());
+ rsp.setStatus(OptimizerResponse.OptimizeScheduleStatus.COMPLETED);
+ List<OptimizerScheduleInfo> schedules = getSchedules(request);
+ rsp.setSchedules(schedules);
+ ObjectMapper om = new ObjectMapper();
+ String response = om.writeValueAsString(rsp);
+ optimizerResponses.put(rsp.getRequestId(), response);
return Response.accepted().build();
} catch (Exception e) {
log.error("Unexpected exception", e);
@@ -152,45 +92,90 @@ public class SchedulerTestLoopbackServiceImpl implements SchedulerTestLoopbackSe
return Response.serverError().build();
}
- private void sendAsyncResponse(CMOptimizerResponse r, String url) {
+ private List<OptimizerScheduleInfo> getSchedules(OptimizerRequest request) {
+ List<OptimizerScheduleInfo> list = new ArrayList<>();
+ OptimizerScheduleInfo osi = new OptimizerScheduleInfo();
+ List<ScheduledElement> scheduledList = new ArrayList<>();
+ List<UnScheduledElement> unscheduledList = new ArrayList<>();
+ osi.setScheduledElements(scheduledList);
+ osi.setUnScheduledElements(unscheduledList);
+ list.add(osi);
+
+
+ List<ChangeWindow> cws = request.getChangeWindows();
+ // Assume we cannot get here without at least 1 CW
+ ChangeWindow cw = cws.get(0);
+
+ // This is a dumb opt. WIll not make sense for multiple groups
+ // Use the code in the callback to help
+ Map<String, String> nodes = new HashMap<>();
+ List<String> nodeList = new ArrayList<>();
+ // get total number of nodes across all groups.
+ for (OptimizerElementInfo sr : request.getElements()) {
+ nodes.put(sr.getElementId(), sr.getGroupId());
+ nodeList.add(sr.getElementId());
+ }
+
+ DateTime startTime = new DateTime(cw.getStartTime().getTime());
+
+
+ long add = request.getAdditionalDuration() * 1000L;
+ long normal = request.getNormalDuration() * 1000L;
+ int concurrencyLimit = request.getConcurrencyLimit();
+ long totalDuration = add + normal;
+ long serialized = 0;
+ if (nodes.size() > concurrencyLimit) {
+ serialized = (nodes.size() / concurrencyLimit);
+ serialized = (serialized * totalDuration);
+ }
+ DateTime latestInstanceStartTime = startTime.plus(serialized);
+ DateTime finishTime = latestInstanceStartTime.plus(totalDuration);
+ // Reformat request into a response setting the groups start finish
+ // time based upon
+
+ Map<String, Map<String, Long>> startAndFinishTimeMap = new HashMap<String, Map<String, Long>>();
try {
- Client client = ClientBuilder.newClient();
- String user = env.getProperty("mechid.user", "");
- String pass = pm.getProperty("mechid.pass", "");
- client.register(new BasicAuthenticatorFilter(user, pass));
- WebTarget target = client.target(url);
- Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
- try {
- Response response = invocationBuilder.post(Entity.json(r));
- switch (response.getStatus()) {
- case 202:
- // Scheduled with SNIRO
- break;
- case 400: // Bad request
- case 500:
- default: {
- }
- }
- } catch (ResponseProcessingException e) {
- errors.error(LogMessages.OPTIMIZER_EXCEPTION, e, e.getMessage());
- debug.debug(LogMessages.OPTIMIZER_EXCEPTION, e, e.getMessage());
-
- } catch (ProcessingException e) {
- log.error(LogMessages.OPTIMIZER_EXCEPTION.toString(), e);
- log.error(LogMessages.OPTIMIZER_EXCEPTION, e.getMessage());
+ CmsoOptimizerCallbackImpl.makeMap(startTime.getMillis(), latestInstanceStartTime.getMillis(),
+ concurrencyLimit, totalDuration, nodeList, startAndFinishTimeMap);
+ for (String node : nodes.keySet()) {
+ Map<String, Long> map = startAndFinishTimeMap.get(node);
+ Long nodeStart = map.get("startTime");
+ Long nodeEnd = map.get("finishTime");
+ ScheduledElement se = new ScheduledElement();
+ se.setElementId(node);
+ se.setDurationSeconds((nodeEnd - nodeStart) / 1000); // in seconds
+ se.setStartTime(new Date(nodeStart));
+ se.setEndTime(new Date(nodeEnd));
+ se.setScheduleType(ScheduleType.INDIVIDUAL);
+ se.setGroupId(nodes.get(node));
+ scheduledList.add(se);
}
} catch (Exception e) {
- errors.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
- debug.debug(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return list;
+ }
+
+ @Override
+ public Response getOptimizerResponse(String id, UriInfo uri) {
+ //
+ try {
+ String rsp = optimizerResponses.get(id);
+ return Response.ok(rsp).build();
+ } catch (Exception e) {
+ log.error("Unexpected exception", e);
}
+ return Response.serverError().build();
}
+
+ @Override
public Response soScheduleLoopback(String vnfName, String request, UriInfo uri) {
String msoRequestId = env.getProperty("loopback.mso.requestId", "4ccbfb85-1d05-442e");
- String r = UUID.randomUUID().toString();
+ String ruuid = UUID.randomUUID().toString();
WfMsoRequestReferences rr = new WfMsoRequestReferences();
- rr.setInstanceId(r);
+ rr.setInstanceId(ruuid);
rr.setRequestId(msoRequestId);
WfMsoResponse mso = new WfMsoResponse();
mso.setRequestReferences(rr);
@@ -204,12 +189,13 @@ public class SchedulerTestLoopbackServiceImpl implements SchedulerTestLoopbackSe
public Response soQueryLoopback(String requestId, UriInfo uri) {
// Abbreviated response. Only interested in requestStatus....
String response = "{\"request\" : {" + "\"requestId\" : \"dummy-request-id\","
- + "\"startTime\" : \"Wed, 26 Aug 2017 06:36:07 GMT\"," + "\"requestScope\" : \"vfModule\","
- + "\"requestType\" : \"createInstance\"," + "\"requestDetails\" : {}," + "\"instanceReferences\" : {},"
- + "\"requestStatus\" : { " + "\"requestState\" : \"COMPLETE\","
- + "\"statusMessage\" : \"Vf Module has been created successfully.\"," + "\"percentProgress\" : 100,"
- + "\"finishTime\" : \"Crap so cmso uses current time\"}}}";
+ + "\"startTime\" : \"Wed, 26 Aug 2017 06:36:07 GMT\"," + "\"requestScope\" : \"vfModule\","
+ + "\"requestType\" : \"createInstance\"," + "\"requestDetails\" : {},"
+ + "\"instanceReferences\" : {}," + "\"requestStatus\" : { " + "\"requestState\" : \"COMPLETE\","
+ + "\"statusMessage\" : \"Vf Module has been created successfully.\","
+ + "\"percentProgress\" : 100," + "\"finishTime\" : \"Crap so cmso uses current time\"}}}";
return Response.ok().entity(response).build();
}
+
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackService.java b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackService.java
index d2953b6..f329cfc 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackService.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackService.java
@@ -1,36 +1,37 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright � 2017-2018 AT&T Intellectual Property. Modifications Copyright � 2018 IBM.
*
- * Licensed 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
+ * Licensed 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
+ * 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.
+ * 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.
*
*
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * https://creativecommons.org/licenses/by/4.0/
+ * https://creativecommons.org/licenses/by/4.0/
*
- * Unless required by applicable law or agreed to in writing, documentation
- * 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
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.test.loopback;
+import com.fasterxml.jackson.databind.JsonNode;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@@ -38,12 +39,6 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-import com.fasterxml.jackson.databind.JsonNode;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
@Api
@Path("/v1/tm")
@@ -56,7 +51,7 @@ public interface TicketMgtLoopbackService {
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "", notes = "Dummy out ticket management check status call.", response = JsonNode.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response tmGetChangeRecord(@ApiParam(value = "TM request message") JsonNode request, @Context UriInfo uri);
// ******************************************************************
@@ -65,9 +60,9 @@ public interface TicketMgtLoopbackService {
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "", notes = "Dummy out ticket management create call.", response = JsonNode.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response tmCreateChangeRecord(@ApiParam(value = "TM request message") JsonNode request,
- @Context UriInfo uri);
+ @Context UriInfo uri);
// ******************************************************************
@POST
@@ -75,19 +70,19 @@ public interface TicketMgtLoopbackService {
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "", notes = "Dummy out ticket management close call.", response = JsonNode.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response tmCloseCancelChangeRecord(@ApiParam(value = "TM request message") JsonNode request,
- @Context UriInfo uri);
+ @Context UriInfo uri);
// ******************************************************************
@POST
@Path("/updateChangeRecord")
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "", notes = "Dummy out ticket management update to in progress call.",
- response = JsonNode.class)
+ response = JsonNode.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response tmUpdateChangeRecord(@ApiParam(value = "TM request message") JsonNode request,
- @Context UriInfo uri);
+ @Context UriInfo uri);
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackServiceImpl.java
index 1c87f66..4fd3914 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackServiceImpl.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/test/loopback/TicketMgtLoopbackServiceImpl.java
@@ -1,36 +1,35 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.test.loopback;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.core.Response;
@@ -42,16 +41,10 @@ import org.onap.optf.cmso.ticketmgt.bean.TmStatusEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
@Controller
public class TicketMgtLoopbackServiceImpl implements TicketMgtLoopbackService {
- private static EELFLogger log = EELFManager.getInstance().getLogger(TicketMgtLoopbackServiceImpl.class);
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
- private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
@Autowired
Environment env;
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmClient.java b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmClient.java
index c3b9be8..c8cae12 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmClient.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmClient.java
@@ -1,36 +1,37 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.ticketmgt;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -38,7 +39,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
@@ -48,7 +48,6 @@ import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
-
import org.apache.commons.text.StringSubstitutor;
import org.joda.time.format.ISODateTimeFormat;
import org.onap.observations.Mdc;
@@ -58,7 +57,7 @@ import org.onap.optf.cmso.common.CmHelpers;
import org.onap.optf.cmso.common.LogMessages;
import org.onap.optf.cmso.common.PropertiesManagement;
import org.onap.optf.cmso.common.exceptions.CMSException;
-import org.onap.optf.cmso.filters.CMSOClientFilters;
+import org.onap.optf.cmso.filters.CmsoClientFilters;
import org.onap.optf.cmso.model.ChangeManagementGroup;
import org.onap.optf.cmso.model.ChangeManagementSchedule;
import org.onap.optf.cmso.model.DomainData;
@@ -76,13 +75,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
+/**
+ * The Class TmClient.
+ */
@Component
public class TmClient {
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@@ -94,7 +89,7 @@ public class TmClient {
PropertiesManagement pm;
@Autowired
- ChangeManagementScheduleDAO cmScheduleDAO;
+ ChangeManagementScheduleDAO cmScheduleDao;
@Autowired
BuildCreateRequest buildCreateRequest;
@@ -102,8 +97,18 @@ public class TmClient {
@Autowired
TmEndpoints tmEndpoints;
+ /**
+ * Creates the change ticket.
+ *
+ * @param schedule the schedule
+ * @param group the group
+ * @param vnfNames the vnf names
+ * @param domainData the domain data
+ * @return the string
+ * @throws CMSException the CMS exception
+ */
public String createChangeTicket(Schedule schedule, ChangeManagementGroup group, List<String> vnfNames,
- List<DomainData> domainData) throws CMSException {
+ List<DomainData> domainData) throws CMSException {
String changeId = "";
String workflowName = CmHelpers.getDomainData(domainData, CmDomainDataEnum.WorkflowName);
@@ -115,15 +120,34 @@ public class TmClient {
return changeId;
}
+ /**
+ * Close ticket.
+ *
+ * @param schedule the schedule
+ * @param group the group
+ * @param cmSchedules the cm schedules
+ * @param changeId the change id
+ * @param closureCode the closure code
+ * @param closingComments the closing comments
+ * @throws CMSException the CMS exception
+ */
public void closeTicket(Schedule schedule, ChangeManagementGroup group, List<ChangeManagementSchedule> cmSchedules,
- String changeId, ClosureCode closureCode, String closingComments) throws CMSException {
+ String changeId, ClosureCode closureCode, String closingComments) throws CMSException {
Map<String, Object> variables =
- getCloseVariables(schedule, group, cmSchedules, changeId, closureCode, closingComments);
+ getCloseVariables(schedule, group, cmSchedules, changeId, closureCode, closingComments);
JsonNode closeChangeRecord = buildCreateRequest.createCloseCancelChangeRecord(variables);
debug.debug("closeChangeRecord=" + closeChangeRecord.toString());
postCloseChangeTicket(closeChangeRecord, schedule.getScheduleId(), changeId);
}
+ /**
+ * Cancel ticket.
+ *
+ * @param schedule the schedule
+ * @param cms the cms
+ * @param changeId the change id
+ * @throws CMSException the CMS exception
+ */
public void cancelTicket(Schedule schedule, ChangeManagementSchedule cms, String changeId) throws CMSException {
Map<String, Object> variables = getCancelVariables(schedule, changeId);
JsonNode cancelChangeRecord = buildCreateRequest.createCancelChangeRecord(variables);
@@ -131,6 +155,14 @@ public class TmClient {
postCloseChangeTicket(cancelChangeRecord, schedule.getScheduleId(), changeId);
}
+ /**
+ * Update ticket.
+ *
+ * @param schedule the schedule
+ * @param cms the cms
+ * @param changeId the change id
+ * @throws CMSException the CMS exception
+ */
public void updateTicket(Schedule schedule, ChangeManagementSchedule cms, String changeId) throws CMSException {
Map<String, Object> variables = getUpdateVariables(schedule, changeId);
JsonNode updateChangeRecord = buildCreateRequest.createUpdateChangeRecord(variables);
@@ -138,6 +170,12 @@ public class TmClient {
postUpdateChangeTicket(updateChangeRecord, schedule.getScheduleId(), changeId);
}
+ /**
+ * Gets the change ticket.
+ *
+ * @param changeId the change id
+ * @return the change ticket
+ */
public TmChangeInfo getChangeTicket(String changeId) {
Map<String, String> mdcSave = Mdc.save();
try {
@@ -155,7 +193,7 @@ public class TmClient {
break;
default: {
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "TM", String.valueOf(response.getStatus()),
- response.toString());
+ response.toString());
}
}
} catch (Exception e) {
@@ -167,29 +205,37 @@ public class TmClient {
}
private Map<String, Object> getCloseVariables(Schedule schedule, ChangeManagementGroup group,
- List<ChangeManagementSchedule> cmSchedules, String changeId, ClosureCode closureCode,
- String closingComments) {
+ List<ChangeManagementSchedule> cmSchedules, String changeId, ClosureCode closureCode,
+ String closingComments) {
String requesterId = schedule.getUserId();
- Map<String, Object> variables = new HashMap<String, Object>();
- if (requesterId.length() > Variables.requesterId.getMaxLength())
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());
+ }
long actualStartDate = 0;
long actualEndDate = 0;
for (ChangeManagementSchedule cms : cmSchedules) {
- if (cms.getDispatchTimeMillis() != null)
- if (actualStartDate == 0 || cms.getDispatchTimeMillis() < actualStartDate)
+ if (cms.getDispatchTimeMillis() != null) {
+ if (actualStartDate == 0 || cms.getDispatchTimeMillis() < actualStartDate) {
actualStartDate = cms.getDispatchTimeMillis();
- if (cms.getExecutionCompletedTimeMillis() != null)
- if (cms.getExecutionCompletedTimeMillis() > actualEndDate)
+ }
+ }
+ if (cms.getExecutionCompletedTimeMillis() != null) {
+ if (cms.getExecutionCompletedTimeMillis() > actualEndDate) {
actualEndDate = cms.getExecutionCompletedTimeMillis();
+ }
+ }
}
if (closureCode != ClosureCode.Successful) {
- if (actualEndDate == 0)
+ if (actualEndDate == 0) {
actualEndDate = System.currentTimeMillis();
- if (actualStartDate == 0)
+ }
+ if (actualStartDate == 0) {
actualStartDate = actualEndDate - 1000;
+ }
}
+ Map<String, Object> variables = new HashMap<String, Object>();
+
variables.put(Variables.status.toString(), "Closed");
variables.put(Variables.requesterId.toString(), requesterId);
variables.put(Variables.actualStartDate.toString(), actualStartDate / 1000);
@@ -203,8 +249,9 @@ public class TmClient {
private Map<String, Object> getCancelVariables(Schedule schedule, String changeId) {
String requesterId = schedule.getUserId();
Map<String, Object> variables = new HashMap<String, Object>();
- if (requesterId.length() > Variables.requesterId.getMaxLength())
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());
+ }
variables.put(Variables.requesterId.toString(), requesterId);
variables.put(Variables.changeId.toString(), changeId);
return variables;
@@ -213,15 +260,16 @@ public class TmClient {
private Map<String, Object> getUpdateVariables(Schedule schedule, String changeId) {
String requesterId = schedule.getUserId();
Map<String, Object> variables = new HashMap<String, Object>();
- if (requesterId.length() > Variables.requesterId.getMaxLength())
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());
+ }
variables.put(Variables.requesterId.toString(), requesterId);
variables.put(Variables.changeId.toString(), changeId);
return variables;
}
private void postCloseChangeTicket(JsonNode closeChangeRecord, String scheduleId, String changeId)
- throws CMSException {
+ throws CMSException {
Map<String, String> mdcSave = Mdc.save();
try {
Response response = null;
@@ -241,24 +289,24 @@ public class TmClient {
debug.debug("response=" + respString);
if (!isAlreadyClosed(respString)) {
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),
- response.toString() + " : " + respString);
+ response.toString() + " : " + respString);
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_CLOSE_CHANGE_TICKET,
- scheduleId, changeId, respString);
+ scheduleId, changeId, respString);
}
}
break;
default: {
String message = response.readEntity(String.class);
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),
- response.toString() + " : " + message);
+ response.toString() + " : " + message);
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_CLOSE_CHANGE_TICKET,
- scheduleId, changeId, message);
+ scheduleId, changeId, message);
}
}
} catch (ProcessingException e) {
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_CLOSE_CHANGE_TICKET, scheduleId,
- changeId, e.toString());
+ changeId, e.toString());
} finally {
Mdc.restore(mdcSave);
}
@@ -300,36 +348,38 @@ public class TmClient {
}
private Map<String, Object> getVariables(Schedule schedule, ChangeManagementGroup group, List<String> vnfNames,
- List<DomainData> domainData) {
- Long plannedStartDate = group.getStartTimeMillis();
- Long plannedEndDate = group.getFinishTimeMillis();
- Long validationStartTime = plannedStartDate + group.getNormalDurationInSecs();
- Long backoutStartTime = plannedEndDate - group.getAdditionalDurationInSecs();
+ List<DomainData> domainData) {
String requesterId = schedule.getUserId();
Map<String, Object> variables = new HashMap<String, Object>();
String vnfList = vnfNames.toString();
- if (vnfList.length() > Variables.vnfList.getMaxLength())
+ if (vnfList.length() > Variables.vnfList.getMaxLength()) {
vnfList = vnfList.substring(0, Variables.vnfList.getMaxLength());
- if (requesterId.length() > Variables.requesterId.getMaxLength())
+ }
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());
+ }
variables.put(Variables.vnfList.toString(), vnfList);
variables.put(Variables.vnfName.toString(), vnfNames.get(0));
variables.put(Variables.requesterId.toString(), requesterId);
+ Long plannedStartDate = group.getStartTimeMillis();
+ Long plannedEndDate = group.getFinishTimeMillis();
variables.put(Variables.plannedStartDate.toString(), plannedStartDate / 1000);
variables.put(Variables.plannedEndDate.toString(), plannedEndDate / 1000);
+ Long validationStartTime = plannedStartDate + group.getNormalDurationInSecs();
+ Long backoutStartTime = plannedEndDate - group.getAdditionalDurationInSecs();
variables.put(Variables.validationStartTime.toString(), validationStartTime / 1000);
variables.put(Variables.backoutStartTime.toString(), backoutStartTime / 1000);
// These will be display UTC -
variables.put(Variables.validationStartTimeDisplay.toString(),
- ISODateTimeFormat.dateTimeNoMillis().print(validationStartTime));
+ ISODateTimeFormat.dateTimeNoMillis().print(validationStartTime));
variables.put(Variables.backoutStartTimeDisplay.toString(),
- ISODateTimeFormat.dateTimeNoMillis().print(backoutStartTime));
+ ISODateTimeFormat.dateTimeNoMillis().print(backoutStartTime));
variables.put(Variables.plannedStartTimeDisplay.toString(),
- ISODateTimeFormat.dateTimeNoMillis().print(plannedStartDate));
+ ISODateTimeFormat.dateTimeNoMillis().print(plannedStartDate));
variables.put(Variables.plannedEndTimeDisplay.toString(),
- ISODateTimeFormat.dateTimeNoMillis().print(plannedEndDate));
+ ISODateTimeFormat.dateTimeNoMillis().print(plannedEndDate));
// Ticket field values can be passed in via the DomainData
JsonNode defaultValues = buildCreateRequest.getYaml("DefaultChangeTicketProperties");
@@ -384,24 +434,24 @@ public class TmClient {
}
} else {
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),
- response.toString() + " : " + "Response is empty");
+ response.toString() + " : " + "Response is empty");
throw new CMSException(Status.EXPECTATION_FAILED, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,
- scheduleId, "Response is empty");
+ scheduleId, "Response is empty");
}
}
break;
default: {
String message = response.readEntity(String.class);
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),
- response.toString() + " : " + message);
+ response.toString() + " : " + message);
throw new CMSException(Status.EXPECTATION_FAILED, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,
- scheduleId, message);
+ scheduleId, message);
}
}
} catch (ProcessingException e) {
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
throw new CMSException(Status.EXPECTATION_FAILED, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET, scheduleId,
- e.toString());
+ e.toString());
} finally {
Mdc.restore(mdcSave);
}
@@ -409,7 +459,7 @@ public class TmClient {
}
private String postUpdateChangeTicket(JsonNode updateChangeRecord, String scheduleId, String changeId)
- throws CMSException {
+ throws CMSException {
Map<String, String> mdcSave = Mdc.save();
try {
String url = env.getProperty("vtm.url") + env.getProperty("vtm.updatePath");
@@ -429,50 +479,21 @@ public class TmClient {
default: {
String message = response.readEntity(String.class);
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),
- response.toString() + " : " + message);
+ response.toString() + " : " + message);
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_UPDATE_CHANGE_TICKET,
- scheduleId, changeId, message);
+ scheduleId, changeId, message);
}
}
} catch (ProcessingException e) {
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_UPDATE_CHANGE_TICKET, scheduleId,
- changeId, e.toString());
+ changeId, e.toString());
} finally {
Mdc.restore(mdcSave);
}
return changeId;
}
- private Response vtmPostOld(String url, Object request, String scheduleId) throws CMSException {
- Response response = null;
- try {
- String user = env.getProperty("vtm.user");
- String pass = pm.getProperty("vtm.pass", "");
- // Cannot provide changeId. Interesting.
- // This should be replaced by fetch
- // For now, make a best effort to get the passed changeId
-
- Client client = ClientBuilder.newClient();
- client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(new CMSOClientFilters());
- WebTarget target = client.target(url);
- Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
- ObjectMapper mapper = new ObjectMapper();
- String jsonRequest = mapper.writeValueAsString(request);
- debug.debug("vTM URL = " + url + " user=" + user + " : " + jsonRequest);
- response = invocationBuilder.post(Entity.json(request));
- // String message = response.readEntity(String.class);
- // debug.debug("Return from " + url + " : " + response.toString() + "\n" +
- // message);
- debug.debug("Return from " + url + " : " + response.toString());
- } catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.toString());
- throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET, scheduleId,
- e.getMessage());
- }
- return response;
- }
private Response tmPost(Endpoint ep, Object request, String scheduleId) throws CMSException {
Response response = null;
@@ -488,7 +509,7 @@ public class TmClient {
Client client = ClientBuilder.newClient();
client.register(new BasicAuthenticatorFilter(user, pass));
- client.register(new CMSOClientFilters());
+ client.register(new CmsoClientFilters());
WebTarget target = client.target(url);
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);
ObjectMapper mapper = new ObjectMapper();
@@ -503,25 +524,31 @@ public class TmClient {
} catch (ProcessingException e) {
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.toString());
url = tmEndpoints.getNextEndpoint(ep, endpoints);
- if (url == null || !tryNextURL(e)) {
+ if (url == null || !tryNextUrl(e)) {
throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,
- scheduleId, e.getMessage());
+ scheduleId, e.getMessage());
}
} catch (Exception e) {
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.toString());
throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,
- scheduleId, e.getMessage());
+ scheduleId, e.getMessage());
}
}
return response;
}
- private boolean tryNextURL(ProcessingException e) {
- if (e.getCause() instanceof UnknownHostException)
+ private boolean tryNextUrl(ProcessingException exc) {
+ if (exc.getCause() instanceof UnknownHostException) {
return true;
+ }
return true;
}
+ /**
+ * Health check.
+ *
+ * @return the health check component
+ */
public HealthCheckComponent healthCheck() {
// No op
HealthCheckComponent hcc = new HealthCheckComponent();
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmEndpoints.java b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmEndpoints.java
index b72eef4..97e4538 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmEndpoints.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmEndpoints.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,6 +31,8 @@
package org.onap.optf.cmso.ticketmgt;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -38,13 +40,10 @@ import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
@Component
public class TmEndpoints {
private static EELFLogger log = EELFManager.getInstance().getLogger(TmEndpoints.class);
- private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
@@ -72,8 +71,15 @@ public class TmEndpoints {
private boolean legacyLoaded = false;
private Map<Endpoint, List<String>> endpointMap = new HashMap<>();
- private Map<Endpoint, String> endpointMapOK = new HashMap<>();
+ private Map<Endpoint, String> endpointMapOk = new HashMap<>();
+ /**
+ * Gets the endpoint.
+ *
+ * @param ep the ep
+ * @param endpoints the endpoints
+ * @return the endpoint
+ */
public String getEndpoint(Endpoint ep, List<String> endpoints) {
loadLegacy();
endpoints.clear();
@@ -82,11 +88,11 @@ public class TmEndpoints {
if (endpoints.size() > 0) {
// Make an attempt to return the most recent "working" endpoint.
//
- synchronized (endpointMapOK) {
- endpoint = endpointMapOK.get(ep);
+ synchronized (endpointMapOk) {
+ endpoint = endpointMapOk.get(ep);
if (endpoint == null) {
endpoint = endpoints.get(0);
- endpointMapOK.put(ep, endpoint);
+ endpointMapOk.put(ep, endpoint);
}
}
endpoints.remove(endpoint);
@@ -96,21 +102,29 @@ public class TmEndpoints {
// Call this if the previous enpoint failed to connect.
// An attempt to track the most recent "working" endpoint.
+ /**
+ * Gets the next endpoint.
+ *
+ * @param ep the ep
+ * @param endpoints the endpoints
+ * @return the next endpoint
+ */
public String getNextEndpoint(Endpoint ep, List<String> endpoints) {
String endpoint = null;
if (endpoints.size() > 0) {
endpoint = endpoints.remove(0);
- synchronized (endpointMapOK) {
+ synchronized (endpointMapOk) {
// Let's hope this one works.
- endpointMapOK.put(ep, endpoint);
+ endpointMapOk.put(ep, endpoint);
}
}
return endpoint;
}
private synchronized void loadLegacy() {
- if (legacyLoaded)
+ if (legacyLoaded) {
return;
+ }
log.info("Loading legacy endpoints");
endpointMap = new HashMap<>();
addToEndpointMap(Endpoint.CREATE);
@@ -128,6 +142,7 @@ public class TmEndpoints {
list.add(env.getProperty(ep.toString()));
}
+ @Override
public String toString() {
return endpointMap.toString();
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmStatusClient.java b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmStatusClient.java
index e5c14b1..3d13b6f 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmStatusClient.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/TmStatusClient.java
@@ -1,42 +1,41 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.ticketmgt;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.UUID;
import javax.transaction.Transactional;
import org.onap.optf.cmso.common.CMSStatusEnum;
import org.onap.optf.cmso.common.LogMessages;
@@ -51,13 +50,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.att.eelf.i18n.EELFResourceManager;
@Component
public class TmStatusClient {
- private static EELFLogger log = EELFManager.getInstance().getLogger(TmStatusClient.class);
private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@@ -85,42 +80,48 @@ public class TmStatusClient {
Environment env;
@Autowired
- ScheduleDAO scheduleDAO;
+ ScheduleDAO scheduleDao;
@Autowired
- ChangeManagementScheduleDAO cmScheduleDAO;
+ ChangeManagementScheduleDAO cmScheduleDao;
@Autowired
- ChangeManagementGroupDAO cmGroupDAO;
+ ChangeManagementGroupDAO cmGroupDao;
@Autowired
TmClient tmClient;
+ /**
+ * Check status.
+ *
+ * @param id the id
+ */
@Transactional
- public void checkStatus(Integer id) {
+ public void checkStatus(String id) {
debug.debug("Entered checkStatus id=" + id);
try {
// Multiple cmso instance support - re-get the record with a Schedule lock
- Schedule s = scheduleDAO.lockOne(id);
- if (!s.getStatus().equals(CMSStatusEnum.NotificationsInitiated.toString())) {
- debug.debug(s.getScheduleId() + " is no longer in " + CMSStatusEnum.NotificationsInitiated.toString()
- + " : it is " + s.getStatus());
+ UUID uuid = UUID.fromString(id);
+ Schedule sch = scheduleDao.lockOne(uuid);
+ if (!sch.getStatus().equals(CMSStatusEnum.NotificationsInitiated.toString())) {
+ debug.debug(sch.getScheduleId() + " is no longer in " + CMSStatusEnum.NotificationsInitiated.toString()
+ + " : it is " + sch.getStatus());
// Attempt at avoiding race condition in a load balance env. ?
return;
}
Map<GroupAuditStatus, List<ChangeManagementGroup>> groupStatus =
- new HashMap<GroupAuditStatus, List<ChangeManagementGroup>>();
- List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(id);
+ new HashMap<GroupAuditStatus, List<ChangeManagementGroup>>();
+ List<ChangeManagementGroup> groups = cmGroupDao.findBySchedulesID(uuid);
// Close tickets for completed VNFs
for (ChangeManagementGroup group : groups) {
- processGroup(s, group);
+ processGroup(sch, group);
}
// Check overall status of schedule.
//
for (ChangeManagementGroup group : groups) {
- GroupAuditStatus status = auditGroupStatus(s, group);
+ GroupAuditStatus status = auditGroupStatus(sch, group);
List<ChangeManagementGroup> list = groupStatus.get(status);
if (list == null) {
list = new ArrayList<ChangeManagementGroup>();
@@ -129,16 +130,17 @@ public class TmStatusClient {
list.add(group);
}
// In progress
- if (groupStatus.containsKey(GroupAuditStatus.InProgress))
+ if (groupStatus.containsKey(GroupAuditStatus.InProgress)) {
return;
+ }
//
if (groupStatus.containsKey(GroupAuditStatus.CompletedWithErrors)) {
- s.setStatus(CMSStatusEnum.CompletedWithError.toString());
+ sch.setStatus(CMSStatusEnum.CompletedWithError.toString());
}
if (groupStatus.containsKey(GroupAuditStatus.Completed)) {
- s.setStatus(CMSStatusEnum.Completed.toString());
+ sch.setStatus(CMSStatusEnum.Completed.toString());
}
- scheduleDAO.save(s);
+ scheduleDao.save(sch);
} catch (Exception e) {
errors.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -147,18 +149,17 @@ public class TmStatusClient {
}
}
- private void processGroup(Schedule s, ChangeManagementGroup group) throws CMSException {
- debug.debug("{Processing status of " + s.getScheduleId() + " group=" + group.getGroupId());
+ private void processGroup(Schedule sch, ChangeManagementGroup group) throws CMSException {
+ debug.debug("{Processing status of " + sch.getScheduleId() + " group=" + group.getGroupId());
// Get status of all VNFs within a ticket within the group (Tickets will not
// span groups)
Map<String, List<ChangeManagementSchedule>> failed = new HashMap<String, List<ChangeManagementSchedule>>();
Map<String, List<ChangeManagementSchedule>> inProgress = new HashMap<String, List<ChangeManagementSchedule>>();
Map<String, List<ChangeManagementSchedule>> completed = new HashMap<String, List<ChangeManagementSchedule>>();
Map<String, List<ChangeManagementSchedule>> tmClosed = new HashMap<String, List<ChangeManagementSchedule>>();
- List<ChangeManagementSchedule> cmSchedules = cmScheduleDAO.findByChangeManagementGroupId(group.getId());
+ List<ChangeManagementSchedule> cmSchedules = cmScheduleDao.findByChangeManagementGroupId(group.getUuid());
for (ChangeManagementSchedule cmSchedule : cmSchedules) {
String status = cmSchedule.getStatus();
- String changeId = cmSchedule.getTmChangeId();
String tmStatus = cmSchedule.getTmStatus();
CMSStatusEnum cmsStatus = CMSStatusEnum.Completed.fromString(status);
switch (cmsStatus) {
@@ -183,43 +184,47 @@ public class TmStatusClient {
case ScheduledImmediate:
default:
errors.applicationEvent(
- "Unexpected Change Management schedule event status {0} encountered after notification : scheduleId={1} vnfName={2}",
- status, s.getScheduleId(), cmSchedule.getVnfName());
+ "Unexpected Change Management schedule event status {0} encountered "
+ + "after notification : scheduleId={1} vnfName={2}",
+ status, sch.getScheduleId(), cmSchedule.getVnfName());
break;
}
- if (tmStatus != null && tmStatus.equals("Closed"))
+ if (tmStatus != null && tmStatus.equals("Closed")) {
addTo(tmClosed, cmSchedule);
+ }
}
- debug.debug("{Status of " + s.getScheduleId() + " Group " + group.getGroupId() + "\ncompleted="
- + completed.keySet().toString() + "\ninProgress=" + inProgress.keySet().toString() + "\nfailed="
- + failed.keySet().toString() + "\ntmCLosed=" + tmClosed.keySet().toString());
+ debug.debug("{Status of " + sch.getScheduleId() + " Group " + group.getGroupId() + "\ncompleted="
+ + completed.keySet().toString() + "\ninProgress=" + inProgress.keySet().toString() + "\nfailed="
+ + failed.keySet().toString() + "\ntmCLosed=" + tmClosed.keySet().toString());
// Remove all tickets from completed where there are still 'Triggered' VNFs
- for (String changeId : inProgress.keySet())
+ for (String changeId : inProgress.keySet()) {
completed.remove(changeId);
+ }
// Remove all tickets from completed where the ticket is already closed.
- for (String changeId : tmClosed.keySet())
+ for (String changeId : tmClosed.keySet()) {
completed.remove(changeId);
+ }
// Do not know what to do with failed
for (String changeId : failed.keySet()) {
completed.remove(changeId);
- closeTheTicket(s, group, changeId, failed.get(changeId), ClosureCode.Unsuccessful,
- "Change management request failed for one or more VNFs");
+ closeTheTicket(sch, group, changeId, failed.get(changeId), ClosureCode.Unsuccessful,
+ "Change management request failed for one or more VNFs");
}
// Remaining completed tickets should be closed
- debug.debug("{Final status of " + s.getScheduleId() + " Group " + group.getGroupId() + "\ncompleted="
- + completed.keySet().toString() + "\ninProgress=" + inProgress.keySet().toString() + "\nfailed="
- + failed.keySet().toString() + "\ntmCLosed=" + tmClosed.keySet().toString());
+ debug.debug("{Final status of " + sch.getScheduleId() + " Group " + group.getGroupId() + "\ncompleted="
+ + completed.keySet().toString() + "\ninProgress=" + inProgress.keySet().toString() + "\nfailed="
+ + failed.keySet().toString() + "\ntmCLosed=" + tmClosed.keySet().toString());
for (String changeId : completed.keySet()) {
- closeTheTicket(s, group, changeId, completed.get(changeId), ClosureCode.Successful,
- ClosureCode.Successful.toString());
+ closeTheTicket(sch, group, changeId, completed.get(changeId), ClosureCode.Successful,
+ ClosureCode.Successful.toString());
}
}
- private GroupAuditStatus auditGroupStatus(Schedule s, ChangeManagementGroup group) {
+ private GroupAuditStatus auditGroupStatus(Schedule sch, ChangeManagementGroup group) {
// Determine group status and synchronize VNF status with Ticket status.
Map<String, List<ChangeManagementSchedule>> failed = new HashMap<String, List<ChangeManagementSchedule>>();
Map<String, List<ChangeManagementSchedule>> inProgress = new HashMap<String, List<ChangeManagementSchedule>>();
@@ -229,8 +234,7 @@ public class TmStatusClient {
Set<String> allNames = new HashSet<String>();
Set<String> failedNames = new HashSet<String>();
Set<String> completedNames = new HashSet<String>();
- Long startDate = group.getStartTimeMillis();
- List<ChangeManagementSchedule> cmSchedules = cmScheduleDAO.findByChangeManagementGroupId(group.getId());
+ List<ChangeManagementSchedule> cmSchedules = cmScheduleDao.findByChangeManagementGroupId(group.getUuid());
for (ChangeManagementSchedule cmSchedule : cmSchedules) {
String vnfName = cmSchedule.getVnfName();
vnfNames.add(vnfName);
@@ -262,17 +266,20 @@ public class TmStatusClient {
case ScheduledImmediate:
default:
errors.applicationEvent(
- "Unexpected Change Management schedule event status {0} encountered after notification : scheduleId={1} vnfName={2}",
- status, s.getScheduleId(), cmSchedule.getVnfName());
+ "Unexpected Change Management schedule event status {0} encountered"
+ + " after notification : scheduleId={1} vnfName={2}",
+ status, sch.getScheduleId(), cmSchedule.getVnfName());
break;
}
- if (tmStatus != null && tmStatus.equals("Closed"))
+ if (tmStatus != null && tmStatus.equals("Closed")) {
addTo(tmClosed, cmSchedule);
+ }
}
// We have at least 1 ticket with VNFs in progress. Leave schedule status as is.
- if (inProgress.size() > 0)
+ if (inProgress.size() > 0) {
return GroupAuditStatus.InProgress;
+ }
// All VNFs are either failed or completed (or there is a bug.)
@@ -288,7 +295,6 @@ public class TmStatusClient {
}
private void addTo(Map<String, List<ChangeManagementSchedule>> map, ChangeManagementSchedule cmSchedule) {
- String status = cmSchedule.getStatus();
String changeId = cmSchedule.getTmChangeId();
List<ChangeManagementSchedule> list = map.get(changeId);
if (list == null) {
@@ -299,14 +305,15 @@ public class TmStatusClient {
}
- private void closeTheTicket(Schedule s, ChangeManagementGroup group, String changeId,
- List<ChangeManagementSchedule> list, ClosureCode closureCode, String closingComments) throws CMSException {
+ private void closeTheTicket(Schedule sch, ChangeManagementGroup group, String changeId,
+ List<ChangeManagementSchedule> list, ClosureCode closureCode, String closingComments)
+ throws CMSException {
debug.debug("Closing ticket " + changeId + ":" + closureCode);
try {
- tmClient.closeTicket(s, group, list, changeId, closureCode, closingComments);
+ tmClient.closeTicket(sch, group, list, changeId, closureCode, closingComments);
for (ChangeManagementSchedule cms : list) {
cms.setTmStatus("Closed");
- cmScheduleDAO.save(cms);
+ cmScheduleDao.save(cms);
}
} catch (CMSException e) {
throw e;
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/bean/BuildCreateRequest.java b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/bean/BuildCreateRequest.java
index 0b7c319..8c8cd6f 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/bean/BuildCreateRequest.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/ticketmgt/bean/BuildCreateRequest.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright © 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,6 +31,13 @@
package org.onap.optf.cmso.ticketmgt.bean;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.node.TextNode;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.io.File;
import java.util.Iterator;
import java.util.List;
@@ -40,14 +47,10 @@ import org.onap.optf.cmso.common.LogMessages;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.fasterxml.jackson.databind.node.TextNode;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+/**
+ * The Class BuildCreateRequest.
+ */
@Component
public class BuildCreateRequest {
@@ -58,6 +61,9 @@ public class BuildCreateRequest {
// This is for example purposes only ans every provider
// will have unique requirements.
// This assumes multiple VNFs can appear on a single ticket
+ /**
+ * The Enum Variables.
+ */
//
public enum Variables {
vnfList(168), requesterId(50), plannedStartDate(15), plannedEndDate(15), validationStartTime(
@@ -71,19 +77,30 @@ public class BuildCreateRequest {
this.maxLength = max;
}
+ /**
+ * Gets the max length.
+ *
+ * @return the max length
+ */
public int getMaxLength() {
return maxLength;
}
}
- private static EELFLogger log = EELFManager.getInstance().getLogger(BuildCreateRequest.class);
- private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
Environment env;
+ /**
+ * Creates the change record request.
+ *
+ * @param variables the variables
+ * @param assetList the asset list
+ * @param workflowName the workflow name
+ * @return the json node
+ */
public JsonNode createChangeRecordRequest(Map<String, Object> variables, List<TmAsset> assetList,
String workflowName) {
JsonNode rawjson = getYaml("CreateChangeTicket");
@@ -91,24 +108,48 @@ public class BuildCreateRequest {
return json;
}
+ /**
+ * Creates the close cancel change record.
+ *
+ * @param variables the variables
+ * @return the json node
+ */
public JsonNode createCloseCancelChangeRecord(Map<String, Object> variables) {
JsonNode rawjson = getYaml("CloseCancelChangeRecord");
JsonNode json = substituteJson(rawjson, variables);
return json;
}
+ /**
+ * Creates the cancel change record.
+ *
+ * @param variables the variables
+ * @return the json node
+ */
public JsonNode createCancelChangeRecord(Map<String, Object> variables) {
JsonNode rawjson = getYaml("CancelChangeRecord");
JsonNode json = substituteJson(rawjson, variables);
return json;
}
+ /**
+ * Creates the update change record.
+ *
+ * @param variables the variables
+ * @return the json node
+ */
public JsonNode createUpdateChangeRecord(Map<String, Object> variables) {
JsonNode rawjson = getYaml("UpdateChangeRecord");
JsonNode json = substituteJson(rawjson, variables);
return json;
}
+ /**
+ * Creates the get change record.
+ *
+ * @param variables the variables
+ * @return the json node
+ */
public JsonNode createGetChangeRecord(Map<String, Object> variables) {
JsonNode rawjson = getYaml("GetChangeRecord");
JsonNode json = substituteJson(rawjson, variables);
@@ -171,17 +212,27 @@ public class BuildCreateRequest {
}
private boolean isInteger(String name) {
- if (name.equals(Variables.plannedEndDate.toString()))
+ if (name.equals(Variables.plannedEndDate.toString())) {
return true;
- if (name.equals(Variables.plannedStartDate.toString()))
+ }
+ if (name.equals(Variables.plannedStartDate.toString())) {
return true;
- if (name.equals(Variables.actualStartDate.toString()))
+ }
+ if (name.equals(Variables.actualStartDate.toString())) {
return true;
- if (name.equals(Variables.actualEndDate.toString()))
+ }
+ if (name.equals(Variables.actualEndDate.toString())) {
return true;
+ }
return false;
}
+ /**
+ * Gets the yaml.
+ *
+ * @param workflowName the workflow name
+ * @return the yaml
+ */
public JsonNode getYaml(String workflowName) {
JsonNode json = null;
// Get the YAML file for this workflow
diff --git a/cmso-service/src/main/resources/logmessages.properties b/cmso-service/src/main/resources/logmessages.properties
index e339117..cd85191 100644
--- a/cmso-service/src/main/resources/logmessages.properties
+++ b/cmso-service/src/main/resources/logmessages.properties
@@ -57,3 +57,4 @@ UNAUTHORIZED UNAUTHORIZED|Authorization failed.|No resolution needed|No action i
UNAUTHENTICATED UNAUTHENTICATED|Authentication failed.|No resolution needed|No action is required
UNRECOGNIZED_MSO_STATUS UNRECOGNIZED_MSO_STATUS|Unrecognized status returned by MSO {0}|No resolution needed|No action is required
UNABLE_TO_PARSE_MSO_RESPONSE UNABLE_TO_PARSE_MSO_RESPONSE|Unable to parse status message from MSO {0} : {1}|No resolution needed|No action is required
+MISSING_VALID_GROUP_FOR_ELEMENT MISSING_VALID_GROUP_FOR_ELEMENT|Element {0} returned by optimizer has invalid group id|No resolution needed|No action is required
diff --git a/cmso-service/src/test/java/org/onap/optf/cmso/AuthProviderTest.java b/cmso-service/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
index c8613f8..500c42b 100644
--- a/cmso-service/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
+++ b/cmso-service/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
@@ -28,20 +28,20 @@
* limitations under the License.
*/
-
package org.onap.optf.cmso;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
@RunWith(MockitoJUnitRunner.class)
public class AuthProviderTest {
diff --git a/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java b/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java
index 8a3aa58..acfbaae 100644
--- a/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java
+++ b/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java
@@ -1,57 +1,52 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import org.onap.optf.cmso.model.ApprovalType;
-import org.onap.optf.cmso.model.Domain;
-import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
-
-public class JpaInit {
-
- private static AtomicBoolean initialized = new AtomicBoolean(false);
-
- public static void init(TestEntityManager entityManager) {
- if (initialized.compareAndSet(true, true))
- return;
- Domain d = new Domain();
- d.setDomain("ChangeManagement");
- entityManager.persist(d);
- ApprovalType at = new ApprovalType();
- at.setApprovalCount(1);
- at.setDomain("ChangeManagement");
- at.setApprovalType("Tier 2");
- entityManager.persist(at);
- entityManager.flush();
-
- }
-}
+/*
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================================================
+ *
+ */
+
+package org.onap.optf.cmso;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.onap.optf.cmso.model.ApprovalType;
+import org.onap.optf.cmso.model.Domain;
+import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
+
+/**
+ * The Class JpaInit.
+ */
+public class JpaInit {
+
+ private static AtomicBoolean initialized = new AtomicBoolean(false);
+
+ /**
+ * Inits the.
+ *
+ * @param entityManager the entity manager
+ */
+ public static void init(TestEntityManager entityManager) {
+ if (initialized.compareAndSet(true, true)) {
+ return;
+ }
+ Domain dom = new Domain();
+ dom.setDomain("ChangeManagement");
+ entityManager.persist(dom);
+ ApprovalType at = new ApprovalType();
+ at.setApprovalCount(1);
+ at.setDomain("ChangeManagement");
+ at.setApprovalType("Tier 2");
+ entityManager.persist(at);
+ entityManager.flush();
+
+ }
+}
diff --git a/cmso-service/src/test/java/org/onap/optf/cmso/JtestHelper.java b/cmso-service/src/test/java/org/onap/optf/cmso/JtestHelper.java
index d0b03e5..f83cd88 100644
--- a/cmso-service/src/test/java/org/onap/optf/cmso/JtestHelper.java
+++ b/cmso-service/src/test/java/org/onap/optf/cmso/JtestHelper.java
@@ -1,61 +1,55 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.Map;
-import java.util.Scanner;
-import org.apache.commons.lang3.text.StrSubstitutor;
-
-public class JtestHelper {
- private static String templatefolder = "src/test/templates" + File.separator;
-
- public static String template(String filename, Map<String, String> values) {
- String data = "";
- Scanner s = null;
- try {
- File t = new File(templatefolder + filename);
- s = new Scanner(t);
- s.useDelimiter("\\Z");
- data = s.next();
- StrSubstitutor ss = new StrSubstitutor(values);
- data = ss.replace(data);
- } catch (FileNotFoundException e) {
- data = "";
- } finally {
- if (s != null)
- s.close();
- }
- return data;
- }
-}
+/*
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================================================
+ *
+ */
+
+package org.onap.optf.cmso;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Map;
+import java.util.Scanner;
+import org.apache.commons.text.StrSubstitutor;
+
+public class JtestHelper {
+ private static String templatefolder = "src/test/templates" + File.separator;
+
+ /**
+ * Template.
+ *
+ * @param filename the filename
+ * @param values the values
+ * @return the string
+ */
+ public static String template(String filename, Map<String, String> values) {
+ String data = "";
+ Scanner sc = null;
+ try {
+ File tfld = new File(templatefolder + filename);
+ sc = new Scanner(tfld);
+ sc.useDelimiter("\\Z");
+ data = sc.next();
+ StrSubstitutor ss = new StrSubstitutor(values);
+ data = ss.replace(data);
+ } catch (FileNotFoundException e) {
+ data = "";
+ } finally {
+ if (sc != null) {
+ sc.close();
+ }
+ }
+ return data;
+ }
+}
diff --git a/cmso-service/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java b/cmso-service/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
index aace25e..8070e41 100644
--- a/cmso-service/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
+++ b/cmso-service/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
@@ -1,49 +1,36 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import javax.servlet.http.HttpServletRequest;
-
-public class MockHttpServletRequest {
- public StringBuffer url = new StringBuffer("http://localhost:8089/cmso/v1/ChangeManagement/schedules/");
- public HttpServletRequest request = mock(HttpServletRequest.class);
-
- MockHttpServletRequest() {
-
- when(request.getRequestURL()).thenReturn(url);
- when(request.getHeader("Authorization")).thenReturn("BasicbTEzODc3OnNjaGVkdWxlci1SMTgwMiE=");
-
- }
-
-}
+/*
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END=========================================================================================
+ *
+ */
+
+package org.onap.optf.cmso.service.rs;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class MockHttpServletRequest {
+ public StringBuffer url = new StringBuffer("http://localhost:8089/cmso/v1/ChangeManagement/schedules/");
+ public HttpServletRequest request = mock(HttpServletRequest.class);
+
+ MockHttpServletRequest() {
+
+ when(request.getRequestURL()).thenReturn(url);
+ when(request.getHeader("Authorization")).thenReturn("BasicbTEzODc3OnNjaGVkdWxlci1SMTgwMiE=");
+
+ }
+
+}
diff --git a/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java b/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
index faf408b..cf0b8bf 100644
--- a/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
+++ b/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
@@ -1,41 +1,40 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.utilities;
import org.onap.optf.cmso.common.PropertiesManagement;
public class PropertiesAdmin {
+ /**
+ * Test properties admin.
+ *
+ * @param args arguments
+ */
public static void main(String[] args) {
- PropertiesManagement pm = new PropertiesManagement();
if (args.length < 1) {
System.out.println("Missing argument");
return;
@@ -44,9 +43,8 @@ public class PropertiesAdmin {
if (args[0].startsWith("dec:")) {
value = PropertiesManagement.getDecryptedValue(args[0].substring(4));
} else {
- value = pm.getEncryptedValue(args[0]);
+ value = PropertiesManagement.getEncryptedValue(args[0]);
}
System.out.println(args[0] + " : " + value);
}
-
}
diff --git a/cmso-ticketmgt/data/a.json b/cmso-ticketmgt/data/a.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/cmso-ticketmgt/data/a.json
@@ -0,0 +1 @@
+{}
diff --git a/cmso-ticketmgt/pom.xml b/cmso-ticketmgt/pom.xml
index 2012bfb..1274360 100644
--- a/cmso-ticketmgt/pom.xml
+++ b/cmso-ticketmgt/pom.xml
@@ -22,12 +22,12 @@
<version>1.0.1-SNAPSHOT</version>
</parent>
- <groupId>org.onap.optf.cmso</groupId>
+ <groupId>org.onap.optf.cmso.tcketmgt</groupId>
<artifactId>cmso-ticketmgt</artifactId>
<packaging>jar</packaging>
- <name>cmso</name>
+ <name>cmso-ticketmgt</name>
<properties>
<maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
@@ -155,10 +155,6 @@
</dependency>
<dependency>
<groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
@@ -378,7 +374,7 @@
<apiVersion>1.23</apiVersion>
<images>
<image>
- <name>onap/optf-cmso-tciketmgt</name>
+ <name>onap/optf-cmso-ticketmgt</name>
<alias>onap-optf-cmso-tciketmgt</alias>
<build>
<cleanup>true</cleanup>
diff --git a/cmso-ticketmgt/src/main/java/org/onap/observations/Mdc.java b/cmso-ticketmgt/src/main/java/org/onap/observations/Mdc.java
index cf49ccd..e2b8220 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/observations/Mdc.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/observations/Mdc.java
@@ -39,12 +39,11 @@ import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_DESC;
import static com.att.eelf.configuration.Configuration.MDC_STATUS_CODE;
import static com.att.eelf.configuration.Configuration.MDC_TARGET_ENTITY;
import static com.att.eelf.configuration.Configuration.MDC_TARGET_SERVICE_NAME;
-
+import com.att.eelf.utils.Stopwatch;
import java.net.URI;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
-
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientResponseContext;
@@ -52,172 +51,157 @@ import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response.StatusType;
-
import org.onap.observations.MessageHeaders.HeadersEnum;
import org.slf4j.MDC;
-import com.att.eelf.utils.Stopwatch;
-
/**
- * ECOMP EELF logging MDC fields not defined in the MDC Configuration (i.e.
- * MDC_ALERT_SEVERITY)
+ * ECOMP EELF logging MDC fields not defined in the MDC Configuration (i.e. MDC_ALERT_SEVERITY)
**/
public class Mdc {
- public static final String SERVICE_NAME = "CSS-Scheduler";
- public enum Enum {
- // BeginTimestamp,
- // EndTimeStamp,
- // RequestId,
- // ServiceInstanceId,
- VirtualServerName,
- // ServiceName,
- // PartnerName,
- // StatusCOde,
- // ResponseCode,
- // ResponseDescription,
- // InstanceUUID,
- // AlertSeverity,
- // ServerIPAddress,
- // ElapsedTime,
- // ServerFQDN,
- // RemoteHost,
- ClassName, Unused,
- // ProcessKey,
- CustomField1, CustomField2, CustomField3, CustomField4,
- // TargetVirtualEntity,
- // TargetEntity,
- // TargetServiceName,
- ErrorCode, ErrorDescription, Timer,
- }
-
- public static String getCaller(int back)
- {
- StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
- return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName();
- }
-
- public static void setCaller(int back)
- {
- String caller = MDC.get(Enum.ClassName.name());
- if (caller == null)
- MDC.put(Enum.ClassName.name(), getCaller(back));
- }
-
- public static void setObservation(ObservationInterface o)
- {
- MDC.put(Enum.CustomField4.name(), o.name());
- }
-
- public static void clearCaller()
- {
- MDC.remove(Enum.ClassName.name());
- }
-
- public static Map<String, String> save()
- {
- Map<String, String> save = MDC.getCopyOfContextMap();
- return save;
- }
-
- public static void restore(Map<String, String> mdcSave)
- {
- MDC.clear();
- for (String name : mdcSave.keySet())
- MDC.put(name, mdcSave.get(name));
- }
-
-
-
- public static void setRequestIdIfNotSet(String requestId) {
- if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals(""))
- {
- setRequestId(requestId);
- }
- }
-
- public static void setRequestId(String requestId) {
- MDC.put(MDC_KEY_REQUEST_ID, requestId);
- }
-
- public static void metricStart(ClientRequestContext requestContext) {
- MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
- setPartnerTargetFromUri(requestContext.getUri());
- }
-
- public static void metricEnd(ClientResponseContext response)
- {
-
- Date now = new Date();
- //MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- setResponseInfo(response.getStatusInfo());
-
- }
- public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest)
- {
- MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
- MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost());
- MDC.put(Enum.ClassName.name(), getCaller(4));
- MultivaluedMap<String, String> headers = requestContext.getHeaders();
- String transactionId = (String) headers.getFirst(HeadersEnum.TransactionID.toString());
- if (transactionId != null)
- {
- setRequestId(transactionId);
- }
- else
- {
- setRequestId(UUID.randomUUID().toString());
- }
-
- }
-
- public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response)
- {
- Date now = new Date();
- //MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
- MDC.put(Enum.ClassName.name(), getCaller(4));
-
- setResponseInfo(response.getStatusInfo());
-
- }
-
- private static void setResponseInfo(StatusType statusInfo)
- {
- Integer status = statusInfo.getStatusCode();
- String completed = "ERROR";
- if (status >=200 && status < 300)
- {
- completed = "COMPLETE";
- }
- MDC.put(MDC_RESPONSE_CODE, status.toString());
- MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase());
- MDC.put(MDC_STATUS_CODE, completed);
- }
-
- public static void setEvent(String requestID) {
- MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
- MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
- setRequestId(requestID);
- }
-
- private static void setPartnerTargetFromUri(URI uri)
- {
- try
- {
- MDC.put(MDC_PARTNER_NAME, uri.getHost());
- MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort());
- MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath());
- }
- catch (Exception e)
- {
- MDC.put(MDC_PARTNER_NAME, "UNKNOWN");
- MDC.put(MDC_TARGET_ENTITY, "UNKNOWN");
- MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN");
- }
- }
-
-
-} \ No newline at end of file
+ public static final String SERVICE_NAME = "CSS-Scheduler";
+
+ public enum Enum {
+ // BeginTimestamp,
+ // EndTimeStamp,
+ // RequestId,
+ // ServiceInstanceId,
+ VirtualServerName,
+ // ServiceName,
+ // PartnerName,
+ // StatusCOde,
+ // ResponseCode,
+ // ResponseDescription,
+ // InstanceUUID,
+ // AlertSeverity,
+ // ServerIPAddress,
+ // ElapsedTime,
+ // ServerFQDN,
+ // RemoteHost,
+ ClassName,
+ Unused,
+ // ProcessKey,
+ CustomField1,
+ CustomField2,
+ CustomField3,
+ CustomField4,
+ // TargetVirtualEntity,
+ // TargetEntity,
+ // TargetServiceName,
+ ErrorCode,
+ ErrorDescription,
+ Timer,
+ }
+
+ public static String getCaller(int back) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
+ return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName();
+ }
+
+ public static void setCaller(int back) {
+ String caller = MDC.get(Enum.ClassName.name());
+ if (caller == null)
+ MDC.put(Enum.ClassName.name(), getCaller(back));
+ }
+
+ public static void setObservation(ObservationInterface o) {
+ MDC.put(Enum.CustomField4.name(), o.name());
+ }
+
+ public static void clearCaller() {
+ MDC.remove(Enum.ClassName.name());
+ }
+
+ public static Map<String, String> save() {
+ Map<String, String> save = MDC.getCopyOfContextMap();
+ return save;
+ }
+
+ public static void restore(Map<String, String> mdcSave) {
+ MDC.clear();
+ for (String name : mdcSave.keySet())
+ MDC.put(name, mdcSave.get(name));
+ }
+
+
+
+ public static void setRequestIdIfNotSet(String requestId) {
+ if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals("")) {
+ setRequestId(requestId);
+ }
+ }
+
+ public static void setRequestId(String requestId) {
+ MDC.put(MDC_KEY_REQUEST_ID, requestId);
+ }
+
+ public static void metricStart(ClientRequestContext requestContext) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setPartnerTargetFromUri(requestContext.getUri());
+ }
+
+ public static void metricEnd(ClientResponseContext response) {
+
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost());
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = (String) headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId != null) {
+ setRequestId(transactionId);
+ } else {
+ setRequestId(UUID.randomUUID().toString());
+ }
+
+ }
+
+ public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response) {
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ private static void setResponseInfo(StatusType statusInfo) {
+ Integer status = statusInfo.getStatusCode();
+ String completed = "ERROR";
+ if (status >= 200 && status < 300) {
+ completed = "COMPLETE";
+ }
+ MDC.put(MDC_RESPONSE_CODE, status.toString());
+ MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase());
+ MDC.put(MDC_STATUS_CODE, completed);
+ }
+
+ public static void setEvent(String requestID) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setRequestId(requestID);
+ }
+
+ private static void setPartnerTargetFromUri(URI uri) {
+ try {
+ MDC.put(MDC_PARTNER_NAME, uri.getHost());
+ MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort());
+ MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath());
+ } catch (Exception e) {
+ MDC.put(MDC_PARTNER_NAME, "UNKNOWN");
+ MDC.put(MDC_TARGET_ENTITY, "UNKNOWN");
+ MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN");
+ }
+ }
+
+
+}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/observations/MessageHeaders.java b/cmso-ticketmgt/src/main/java/org/onap/observations/MessageHeaders.java
index d8f80a2..c936444 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/observations/MessageHeaders.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/observations/MessageHeaders.java
@@ -1,26 +1,26 @@
/*
* Copyright © 2019 AT&T Intellectual Property.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -30,7 +30,6 @@
package org.onap.observations;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -38,15 +37,17 @@ import java.util.Set;
public class MessageHeaders {
public enum HeadersEnum {
- UNDEFINED("UNDEFINED"), TransactionID("X-TransactionId"), FromAppID("X-FromAppId"), MinorVersion(
- "X-MinorVersion"), PatchVersion("X-PatchVersion"), LatestVersion("X-LatestVersion"),;
+ UNDEFINED("UNDEFINED"),
+ TransactionID("X-TransactionId"),
+ FromAppID("X-FromAppId"),
+ MinorVersion("X-MinorVersion"),
+ PatchVersion("X-PatchVersion"),
+ LatestVersion("X-LatestVersion"),;
private final String text;
- private final ArrayList<String> list;
private HeadersEnum(String text) {
this.text = text;
- this.list = new ArrayList<>();
}
@Override
diff --git a/cmso-ticketmgt/src/main/java/org/onap/observations/Observation.java b/cmso-ticketmgt/src/main/java/org/onap/observations/Observation.java
index 0e1b1da..83b8f8d 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/observations/Observation.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/observations/Observation.java
@@ -29,97 +29,87 @@
*/
package org.onap.observations;
-import org.apache.log4j.Level;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
+import org.apache.log4j.Level;
+
+
+public class Observation {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Observation.class);
+ private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
+ private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+ // *************************************************************************************************
+ public static void report(ObservationInterface o, Exception e, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(o);
+ if (o.getAudit()) {
+ audit.info(o, e, arguments);
+ }
+ if (o.getMetric()) {
+ metrics.info(o, e, arguments);
+ }
+ Level l = o.getLevel();
+ switch (l.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(o, arguments);
+ debug.debug(o, e, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(o, e, arguments);
+ debug.debug(o, e, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(o, arguments);
+ debug.debug(o, e, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.trace(o, e, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(o, e, arguments);
+ break;
+ default:
+ log.info(o, e, arguments);
+ }
+ Mdc.clearCaller();
+ }
-public class Observation
-{
- private static EELFLogger log = EELFManager.getInstance().getLogger(Observation.class);
- private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
- private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
- private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
- private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
-
- //*************************************************************************************************
- public static void report(ObservationInterface o, Exception e, String ...arguments)
- {
- Mdc.setCaller(4);
- Mdc.setObservation(o);
- if (o.getAudit())
- {
- audit.info(o, e, arguments);
- }
- if (o.getMetric())
- {
- metrics.info(o, e, arguments);
- }
- Level l = o.getLevel();
- switch (l.toInt())
- {
- case Level.WARN_INT:
- errors.warn(o, arguments);
- debug.debug(o, e, arguments);
- break;
- case Level.INFO_INT:
- log.info(o, e, arguments);
- debug.debug(o, e, arguments);
- break;
- case Level.ERROR_INT:
- errors.error(o, arguments);
- debug.debug(o, e, arguments);
- break;
- case Level.TRACE_INT:
- debug.trace(o, e, arguments);
- break;
- case Level.DEBUG_INT:
- debug.debug(o, e, arguments);
- break;
- default:
- log.info(o, e, arguments);
- }
- Mdc.clearCaller();
- }
-
- public static void report(ObservationInterface o, String ...arguments)
- {
- Mdc.setCaller(4);
- Mdc.setObservation(o);
- if (o.getAudit())
- {
- audit.info(o, arguments);
- }
- if (o.getMetric())
- {
- metrics.info(o, arguments);
- }
- Level l = o.getLevel();
- switch (l.toInt())
- {
- case Level.WARN_INT:
- errors.warn(o, arguments);
- debug.debug(o, arguments);
- break;
- case Level.INFO_INT:
- log.info(o, arguments);
- debug.debug(o, arguments);
- break;
- case Level.ERROR_INT:
- errors.error(o, arguments);
- debug.debug(o, arguments);
- break;
- case Level.TRACE_INT:
- debug.debug(o, arguments);
- break;
- case Level.DEBUG_INT:
- debug.debug(o, arguments);
- break;
- default:
- log.info(o, arguments);
- }
- Mdc.clearCaller();
- }
+ public static void report(ObservationInterface o, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(o);
+ if (o.getAudit()) {
+ audit.info(o, arguments);
+ }
+ if (o.getMetric()) {
+ metrics.info(o, arguments);
+ }
+ Level l = o.getLevel();
+ switch (l.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(o, arguments);
+ debug.debug(o, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(o, arguments);
+ debug.debug(o, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(o, arguments);
+ debug.debug(o, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.debug(o, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(o, arguments);
+ break;
+ default:
+ log.info(o, arguments);
+ }
+ Mdc.clearCaller();
+ }
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationInterface.java b/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationInterface.java
index 16305bc..7a16a3f 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationInterface.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationInterface.java
@@ -29,20 +29,24 @@
*/
package org.onap.observations;
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
import javax.ws.rs.core.Response.Status;
-
import org.apache.log4j.Level;
-import com.att.eelf.i18n.EELFResolvableErrorEnum;
+public interface ObservationInterface extends EELFResolvableErrorEnum {
+ public Enum<?> getValue();
+
+ public Level getLevel();
+
+ public String getMessage();
+
+ public Status getStatus();
+
+ public String getDomain();
+
+ public String name();
+
+ public Boolean getAudit();
-public interface ObservationInterface extends EELFResolvableErrorEnum
-{
- public Enum<?> getValue();
- public Level getLevel();
- public String getMessage();
- public Status getStatus();
- public String getDomain();
- public String name();
- public Boolean getAudit();
- public Boolean getMetric();
-} \ No newline at end of file
+ public Boolean getMetric();
+}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationObject.java b/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationObject.java
index 639db76..f41c134 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationObject.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/observations/ObservationObject.java
@@ -29,81 +29,97 @@
*/
package org.onap.observations;
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
import javax.ws.rs.core.Response.Status;
-
import org.apache.log4j.Level;
-import com.att.eelf.i18n.EELFResolvableErrorEnum;
-import com.att.eelf.i18n.EELFResourceManager;
+public class ObservationObject implements ObservationInterface {
+
+ // *************************************************************************************************
+ // Interface class that matches the ObservationInteface pattern
+ // This will be used in case we decide to provide external overrides and we need to instantiate
+ // For now, we'll just use the Enum itself.
+ //
+ //
+ private Enum<?> value = null;
+ private Level level = null;;
+ private String message = null;
+ private Status status = null;
+ private String domain = null;
+ private Boolean metric = false;
+ private Boolean audit = false;
+
+ public ObservationObject(ObservationInterface o) {
+ this.value = o.getValue();
+ this.level = o.getLevel();
+ this.message = o.getMessage();
+ this.status = o.getStatus();
+ this.domain = o.getDomain();
+ this.metric = o.getMetric();
+ this.audit = o.getAudit();
+
+ }
+
+ public Enum<?> getValue() {
+ return value;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ @Override
+ public String getDomain() {
+ return domain;
+ }
+
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ @Override
+ public String name() {
+ return value.name();
+ }
+
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ public String getMessage(String... arguments) {
+ return EELFResourceManager.format((EELFResolvableErrorEnum) value, arguments);
+ }
+
+ public void setValue(Enum<?> value) {
+ this.value = value;
+ }
+
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
-public class ObservationObject implements ObservationInterface
-{
-
- //*************************************************************************************************
- // Interface class that matches the ObservationInteface pattern
- // This will be used in case we decide to provide external overrides and we need to instantiate
- // For now, we'll just use the Enum itself.
- //
- //
- private Enum<?> value = null;
- private Level level = null;;
- private String message = null;
- private Status status = null;
- private String domain = null;
- private Boolean metric = false;
- private Boolean audit = false;
- public ObservationObject(ObservationInterface o)
- {
- this.value = o.getValue();
- this.level = o.getLevel();
- this.message = o.getMessage();
- this.status = o.getStatus();
- this.domain = o.getDomain();
- this.metric = o.getMetric();
- this.audit = o.getAudit();
-
- }
- public Enum<?> getValue() {return value;}
- @Override
- public String getMessage() {return message;}
- @Override
- public Status getStatus() {return status;}
- @Override
- public String getDomain() {return domain;}
-
- @Override
- public Level getLevel() {
- return level;
- }
- @Override
- public String name() {
- return value.name();
- }
- @Override
- public Boolean getAudit() {
- return audit;
- }
- @Override
- public Boolean getMetric() {
- return metric;
- }
-
- public String getMessage(String ...arguments) {
- return EELFResourceManager.format((EELFResolvableErrorEnum)value, arguments);
- }
- public void setValue(Enum<?> value) {
- this.value = value;
- }
- public void setLevel(Level level) {
- this.level = level;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- public void setStatus(Status status) {
- this.status = status;
- }
+ public void setStatus(Status status) {
+ this.status = status;
+ }
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
index b238561..eb9ddad 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
@@ -41,8 +41,10 @@ import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
public class CMSEnvironmentPostProcessor implements EnvironmentPostProcessor {
- // TODO tested in ONAP springboot and this is called before all of the properties files have been loaded...
- // perhaps there is a post post processor? Until this works. DB password will be in the clear in the proeprties files.
+ // TODO tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ // proeprties files.
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
String pwd = environment.getProperty("cmso.database.password");
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
index b6a59e3..115177c 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
@@ -1,6 +1,6 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
+ * Copyright � 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright � 2018 IBM.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,6 +31,8 @@
package org.onap.optf.cmso.common;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
@@ -38,8 +40,6 @@ import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.core.MultivaluedMap;
import javax.xml.bind.DatatypeConverter;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
public class BasicAuthenticatorFilter implements ClientRequestFilter {
private static EELFLogger log = EELFManager.getInstance().getLogger(BasicAuthenticatorFilter.class);
@@ -47,7 +47,7 @@ public class BasicAuthenticatorFilter implements ClientRequestFilter {
private final String password;
public BasicAuthenticatorFilter(String user, String password) {
- this.user = user;
+ this.user = user;
this.password = password;
log.info("user: " + user + " pass:" + password);
}
@@ -67,7 +67,7 @@ public class BasicAuthenticatorFilter implements ClientRequestFilter {
throw new IllegalStateException("Cannot encode with UTF-8", ex);
}
}
-
+
public static String getUser(HttpServletRequest request) {
String user = "";
String header = request.getHeader("Authorization");
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/CMSRequestError.java b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/CMSRequestError.java
index 1be9603..d3688f6 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/CMSRequestError.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/CMSRequestError.java
@@ -1,27 +1,27 @@
/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
+ * Copyright � 2017-2018 AT&T Intellectual Property.
+ * Modifications Copyright � 2018 IBM.
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,16 +31,13 @@
package org.onap.optf.cmso.common;
+import com.fasterxml.jackson.annotation.JsonProperty;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.annotation.JsonProperty;
public class CMSRequestError implements Serializable {
private static final long serialVersionUID = 1L;
- private static EELFLogger log = EELFManager.getInstance().getLogger(CMSRequestError.class);
@JsonProperty
RequestError requestError;
@@ -62,10 +59,11 @@ public class CMSRequestError implements Serializable {
private RequestError(String messageId, String text, List<String> variables) {
this.messageId = "Scheduler." + messageId;
- this.text = text;
+ this.text = text;
this.variables = variables;
}
+ @Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(messageId).append(":").append(text).append(":").append(variables);
@@ -74,6 +72,7 @@ public class CMSRequestError implements Serializable {
}
}
+ @Override
public String toString() {
return requestError.toString();
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
index 8c1f2c6..77fdb11 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
@@ -31,17 +31,15 @@
package org.onap.optf.cmso.common;
-import java.io.UnsupportedEncodingException;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
-import javax.xml.bind.DatatypeConverter;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
@Component
public class PropertiesManagement {
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/exceptions/CMSException.java b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/exceptions/CMSException.java
index 68418d6..0ab80a0 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/exceptions/CMSException.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/cmso/common/exceptions/CMSException.java
@@ -31,16 +31,13 @@
package org.onap.optf.cmso.common.exceptions;
+import com.att.eelf.i18n.EELFResourceManager;
import java.util.ArrayList;
import java.util.List;
-
import javax.ws.rs.core.Response.Status;
-
import org.onap.observations.ObservationInterface;
import org.onap.optf.cmso.common.CMSRequestError;
-import com.att.eelf.i18n.EELFResourceManager;
-
public class CMSException extends Exception {
private static final long serialVersionUID = 1L;
@@ -51,7 +48,7 @@ public class CMSException extends Exception {
public CMSException(Status status, ObservationInterface messageCode, String... args) {
super(EELFResourceManager.format(messageCode, args));
- this.status = status;
+ this.status = status;
this.messageCode = messageCode;
for (String arg : args)
variables.add(arg);
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/Application.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/Application.java
index eca406d..7392e2b 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/Application.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/Application.java
@@ -31,11 +31,12 @@
package org.onap.optf.ticketmgt;
+import com.att.eelf.configuration.Configuration;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import java.net.InetAddress;
import java.util.TimeZone;
-
import javax.annotation.PostConstruct;
-
import org.onap.optf.ticketmgt.common.LogMessages;
import org.slf4j.MDC;
import org.springframework.boot.SpringApplication;
@@ -51,15 +52,11 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
-import com.att.eelf.configuration.Configuration;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
@SpringBootApplication
@ComponentScan(basePackages = {"org.onap.optf.ticketmgt"})
@EnableAsync
-@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
+@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class Application extends SpringBootServletInitializer {
private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
@@ -99,6 +96,6 @@ public class Application extends SpringBootServletInitializer {
return tomcat;
}
-
+
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/ApplicationPropertiesFiles.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/ApplicationPropertiesFiles.java
index 8cd70a6..0fd1c45 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/ApplicationPropertiesFiles.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/ApplicationPropertiesFiles.java
@@ -36,9 +36,6 @@ import org.springframework.context.annotation.PropertySources;
@Configuration
-@PropertySources({
- @PropertySource("file:etc/config/ticketmgt.properties"),
-})
-public class ApplicationPropertiesFiles
-{
-} \ No newline at end of file
+@PropertySources({@PropertySource("file:etc/config/ticketmgt.properties"),})
+public class ApplicationPropertiesFiles {
+}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/AuthProvider.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/AuthProvider.java
index 43ded66..6749b72 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/AuthProvider.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/AuthProvider.java
@@ -31,7 +31,6 @@
package org.onap.optf.ticketmgt;
import java.util.ArrayList;
-
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
@@ -43,24 +42,21 @@ import org.springframework.stereotype.Component;
@Component
@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
-public class AuthProvider
- implements AuthenticationProvider {
-
- @Autowired
- Environment env;
-
+public class AuthProvider implements AuthenticationProvider {
+
+ @Autowired
+ Environment env;
+
@Override
public Authentication authenticate(Authentication authentication) {
String name = authentication.getName();
String password = authentication.getCredentials().toString();
- //TODO check credentials until we enable AAF
- return new UsernamePasswordAuthenticationToken(
- name, password, new ArrayList<>());
+ // TODO check credentials until we enable AAF
+ return new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>());
}
-
+
@Override
public boolean supports(Class<?> authentication) {
- return authentication.equals(
- UsernamePasswordAuthenticationToken.class);
+ return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/CMSEnvironmentPostProcessor.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/CMSEnvironmentPostProcessor.java
index f5c6345..d955e75 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/CMSEnvironmentPostProcessor.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/CMSEnvironmentPostProcessor.java
@@ -33,7 +33,6 @@ package org.onap.optf.ticketmgt;
import java.util.HashMap;
import java.util.Map;
-
import org.onap.optf.cmso.common.PropertiesManagement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
@@ -42,8 +41,10 @@ import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
public class CMSEnvironmentPostProcessor implements EnvironmentPostProcessor {
- // TODO tested in ONAP springboot and this is called before all of the properties files have been loaded...
- // perhaps there is a post post processor? Until this works. DB password will be in the clear in the proeprties files.
+ // TODO tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ // proeprties files.
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
String pwd = environment.getProperty("cmso.database.password");
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/JerseyConfiguration.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/JerseyConfiguration.java
index 3bc0153..46c99ee 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/JerseyConfiguration.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/JerseyConfiguration.java
@@ -31,12 +31,15 @@
package org.onap.optf.ticketmgt;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
import java.util.logging.Logger;
-
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
-
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.logging.LoggingFeature;
import org.glassfish.jersey.server.ResourceConfig;
@@ -51,12 +54,6 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.MapperFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-
@Component
@ApplicationPath("/")
public class JerseyConfiguration extends ResourceConfig {
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SecurityConfig.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SecurityConfig.java
index 27f9019..8abccf0 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SecurityConfig.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SecurityConfig.java
@@ -44,20 +44,20 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur
@ComponentScan("org.onap.optf")
@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
-
+
@Autowired
private AuthProvider authProvider;
-
+
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
-
+
auth.authenticationProvider(authProvider);
}
-
+
@Override
protected void configure(HttpSecurity http) throws Exception {
-
+
http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
-
+
}
-} \ No newline at end of file
+}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SpringProfiles.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SpringProfiles.java
index 2cb2c99..b73959d 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SpringProfiles.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/SpringProfiles.java
@@ -19,11 +19,10 @@
*/
package org.onap.optf.ticketmgt;
-public class SpringProfiles
-{
+public class SpringProfiles {
- public static final String AAF_AUTHENTICATION = "aaf-auth";
- public static final String PROPRIETARY__AUTHENTICATION = "proprietary-auth";
+ public static final String AAF_AUTHENTICATION = "aaf-auth";
+ public static final String PROPRIETARY__AUTHENTICATION = "proprietary-auth";
- private SpringProfiles(){}
+ private SpringProfiles() {}
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafAuthorizationFilter.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafAuthorizationFilter.java
index 53a8d52..9f1f2d1 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafAuthorizationFilter.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafAuthorizationFilter.java
@@ -20,12 +20,10 @@
package org.onap.optf.ticketmgt.aaf;
import java.io.IOException;
-
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
import org.onap.observations.Observation;
import org.onap.optf.cmso.common.exceptions.CMSException;
import org.onap.optf.ticketmgt.SpringProfiles;
@@ -43,7 +41,7 @@ import org.springframework.stereotype.Component;
@Component
@Profile(SpringProfiles.AAF_AUTHENTICATION)
@PropertySource("file:${server.local.startpath}/aaf/permissions.properties")
-public class AafAuthorizationFilter extends OrderedRequestContextFilter {
+public class AafAuthorizationFilter extends OrderedRequestContextFilter {
@Value("${permission.type}")
String type;
@@ -54,22 +52,22 @@ public class AafAuthorizationFilter extends OrderedRequestContextFilter {
public AafAuthorizationFilter() {
this.setOrder(FilterPriority.AAF_AUTHORIZATION.getPriority());
-
+
}
@Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
String permission = String.format("%s|%s|%s", type, instance, request.getMethod().toLowerCase());
- if(request.getRequestURI().matches("^.*/util/echo$")){
+ if (request.getRequestURI().matches("^.*/util/echo$")) {
filterChain.doFilter(request, response);
}
- if(!request.isUserInRole(permission)){
- Observation.report(LogMessages.UNAUTHORIZED);
- ResponseFormatter.errorResponse(request, response,
- new CMSException(LogMessages.UNAUTHORIZED.getStatus(),
- LogMessages.UNAUTHORIZED, ""));
- }else{
- filterChain.doFilter(request,response);
+ if (!request.isUserInRole(permission)) {
+ Observation.report(LogMessages.UNAUTHORIZED);
+ ResponseFormatter.errorResponse(request, response,
+ new CMSException(LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ } else {
+ filterChain.doFilter(request, response);
}
}
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafFilter.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafFilter.java
index 89d6e3b..4d6c44f 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafFilter.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/AafFilter.java
@@ -22,12 +22,10 @@ package org.onap.optf.ticketmgt.aaf;
import java.io.IOException;
import java.util.Properties;
-
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
import org.onap.aaf.cadi.PropAccess;
import org.onap.aaf.cadi.filter.CadiFilter;
import org.onap.observations.Observation;
@@ -57,14 +55,14 @@ public class AafFilter extends OrderedRequestContextFilter {
}
@Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
- if(!request.getRequestURI().matches("^.*/util/echo$")){
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ if (!request.getRequestURI().matches("^.*/util/echo$")) {
cadiFilter.doFilter(request, response, filterChain);
- if(response.getStatus() >=400 && response.getStatus() < 500){
- Observation.report(LogMessages.UNAUTHENTICATED);
- ResponseFormatter.errorResponse(request, response,
- new CMSException(LogMessages.UNAUTHENTICATED.getStatus(),
- LogMessages.UNAUTHENTICATED, ""));
+ if (response.getStatus() >= 400 && response.getStatus() < 500) {
+ Observation.report(LogMessages.UNAUTHENTICATED);
+ ResponseFormatter.errorResponse(request, response, new CMSException(
+ LogMessages.UNAUTHENTICATED.getStatus(), LogMessages.UNAUTHENTICATED, ""));
}
} else {
filterChain.doFilter(request, response);
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/FilterPriority.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/FilterPriority.java
index 0a74a97..4b9bd9d 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/FilterPriority.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/FilterPriority.java
@@ -22,8 +22,9 @@ package org.onap.optf.ticketmgt.aaf;
import org.springframework.core.Ordered;
public enum FilterPriority {
- AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE),
- AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1); //higher number = lower priority
+ AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE), AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1); // higher number
+ // = lower
+ // priority
private final int priority;
@@ -31,5 +32,7 @@ public enum FilterPriority {
priority = p;
}
- public int getPriority() { return priority; }
+ public int getPriority() {
+ return priority;
+ }
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/ResponseFormatter.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/ResponseFormatter.java
index 626776c..16dd74e 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/ResponseFormatter.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/aaf/ResponseFormatter.java
@@ -20,19 +20,15 @@
package org.onap.optf.ticketmgt.aaf;
import java.io.IOException;
-
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.ws.rs.core.MediaType;
-
import org.onap.optf.cmso.common.exceptions.CMSException;
class ResponseFormatter {
- private static final String ACCEPT_HEADER = "accept";
- static void errorResponse(HttpServletRequest request, HttpServletResponse response, CMSException error) throws IOException {
- String accept = request.getHeader(ACCEPT_HEADER) == null ? MediaType.APPLICATION_JSON : request.getHeader(ACCEPT_HEADER);
+ static void errorResponse(HttpServletRequest request, HttpServletResponse response, CMSException error)
+ throws IOException {
response.setStatus(error.getStatus().getStatusCode());
response.getWriter().write(error.getRequestError().toString());
response.getWriter().flush();
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/Availability.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/Availability.java
index 15d8c5c..c650354 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/Availability.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/Availability.java
@@ -31,5 +31,5 @@
package org.onap.optf.ticketmgt.common;
public enum Availability {
-full, partial, unavailable
+ full, partial, unavailable
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/LogMessages.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/LogMessages.java
index caf7e8b..be7b4c9 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/LogMessages.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/common/LogMessages.java
@@ -32,178 +32,186 @@
package org.onap.optf.ticketmgt.common;
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
-
import javax.ws.rs.core.Response.Status;
-
import org.apache.log4j.Level;
import org.onap.observations.ObservationInterface;
-import com.att.eelf.configuration.EELFManager;
-import com.att.eelf.i18n.EELFResourceManager;
-
public enum LogMessages implements ObservationInterface {
- FETCH_TICKET("Fetch ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
- CREATE_TICKET("Create Ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
- CANCEL_TICKET("Cancel ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
- UPDATE_TICKET("Update ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
- GET_ACTIVE_TICKETS("Get active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
- SEARCH_TICKETS("Search tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
- DELETE_ACTIVE_TICKETS("Delete active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
- POLL_ACTIVE_TICKETS("Polling active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
-
- TICKET_NOT_FOUND("Ticket not found id={0}", Status.NOT_FOUND, Level.INFO),
- INVALID_ATTRIBUTE("Invalid attribute {0}={1}", Status.BAD_REQUEST, Level.INFO),
- MISSING_REQUIRED_ATTRIBUTE("Missing required attribute '{0}'", Status.BAD_REQUEST, Level.INFO),
- INVALID_REQUEST("The input data structure is incorrect", Status.BAD_REQUEST, Level.INFO),
- REQUEST_TIMED_OUT("Request timed out.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
- UNEXPECTED_EXCEPTION("Unexpected exception encountered during processing. Please contact support : {0}", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
-
- UNDEFINED_FILTER_ATTRIBUTE("Undefined filter attribute {0}", Status.BAD_REQUEST, Level.INFO),
- INVALID_DATE_FILTER("Invalid date filter provided {0}=(1}", Status.BAD_REQUEST, Level.INFO),
-
- INCOMING_MESSAGE("Incoming message method={0} path={1}", Status.OK, Level.INFO, true, false),
- INCOMING_MESSAGE_RESPONSE("Message response method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
- OUTGOING_MESSAGE("Outgoing message method={0} path={1}", Status.OK, Level.INFO, true, false),
- OUTGOING_MESSAGE_RETURNED("Outgoing message returned method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
-
- UNEXPECTED_RESPONSE("Unexpected response from {0} HTTP Status={1} : {2}", Status.OK, Level.INFO),
- INVALID_CHANGE_WINDOW("Change window end time {1} must be after start time {0}", Status.OK, Level.INFO),
- EXPECTED_EXCEPTION("Expected exception encountered during processing. {0}", Status.OK, Level.INFO),
- UNABLE_TO_UPDATE_TICKET("Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}", Status.OK, Level.INFO),
- UNAUTHORIZED("Authorization failed.", Status.FORBIDDEN, Level.INFO),
- UNAUTHENTICATED("Authentication failed.", Status.UNAUTHORIZED, Level.INFO),
-
- ;
- private final String defaultId;
- private final String defaultMessage;
- private final String defaultResolution;
- private final String defaultAction;
-
- private final Status status;
- private final Level level;
- private final Boolean audit;
- private final Boolean metric;
-
-
- private LogMessages(String message, Status code, Level l)
- {
- defaultMessage = message;
- level=l;
- status = code;
- this.defaultId = this.name();
- this.defaultResolution = "No resolution needed";
- this.defaultAction = "No action is required";
- this.audit = false;
- this.metric = false;
- }
-
- private LogMessages(String message, Status code, Level l, Boolean audit, Boolean metric)
- {
- defaultMessage = message;
- level=l;
- status = code;
- this.audit = audit;
- this.metric = metric;
- this.defaultId = this.name();
- this.defaultResolution = "No resolution needed";
- this.defaultAction = "No action is required";
- }
-
- private LogMessages(String message, Status code, Level l, String id, String resolution, String action)
- {
- level=l;
- status = code;
- defaultMessage = message;
- this.defaultId = id;
- this.defaultResolution = resolution;
- this.defaultAction = action;
- this.audit = false;
- this.metric = false;
- }
-
- static {
- EELFResourceManager.loadMessageBundle("logmessages");
- }
-
- public String genProperties()
- {
- // Use this to regenerate properties file. The desire to change messages without updating code is
- // well understood, but the developer should be able to code the defaults without having to update 2 different files and
- // get it wrong.
- StringBuilder sb = new StringBuilder();
- sb.append("# Generated from ").append(this.getClass().getName()).append("\n");
- for (LogMessages lm : values())
- {
- sb.append(lm.name());
- sb.append(" ").append(lm.defaultId);
- sb.append("|").append(lm.defaultMessage);
- sb.append("|").append(lm.defaultResolution);
- sb.append("|").append(lm.defaultAction);
- sb.append("\n");
- }
- return sb.toString();
- }
-
-
- // interface methods
- @Override
- public Level getLevel() {return level;}
- @Override
- public String getMessage() {return defaultMessage;}
- @Override
- public Status getStatus() {return status;}
- @Override
- public Enum<?> getValue() {return this;}
- @Override
- public String getDomain() {return this.getClass().getSimpleName();}
- @Override
- public Boolean getAudit() { return audit; }
- @Override
- public Boolean getMetric() { return metric; }
-
- public static void main(String argv[])
- {
- System.out.println(LogMessages.UNEXPECTED_EXCEPTION.genProperties());
- try
- {
- Files.write(Paths.get("src/main/resources/logmessages.properties"), LogMessages.UNEXPECTED_EXCEPTION.genProperties().getBytes());
- }
- catch (IOException e)
- {
- EELFManager.getInstance().getDebugLogger().debug("Failed to update properties file.", e);
-
- }
- StringBuilder sb = new StringBuilder();
- sb.append("<html><body><h1>Cell Site Selection Scheduler mS Observations</h1>\n<table border=\"1\">\n<tr>");
- sb.append("<td>Code</td> ");
- sb.append("<td>Log Level</td> ");
- sb.append("<td>Message</td> ");
- sb.append("</tr>\n");
- for (LogMessages m : LogMessages.values())
- {
- if (m.level == Level.ERROR || m.level == Level.WARN || m.level == Level.FATAL)
- {
- sb.append("<tr>");
- sb.append("<td>").append(m.name()).append("</td> ");
- sb.append("<td>").append(m.level).append("</td> ");
- sb.append("<td>").append(m.defaultMessage).append("</td> ");
- sb.append("</tr>\n");
- }
- }
- try
- {
- Files.write(Paths.get("logmessages.html"), sb.toString().getBytes());
- }
- catch (IOException e)
- {
- EELFManager.getInstance().getDebugLogger().debug("Failed to update properties html file.", e);
-
- }
-
- }
+ FETCH_TICKET("Fetch ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ CREATE_TICKET("Create Ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ CANCEL_TICKET("Cancel ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ UPDATE_TICKET("Update ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ GET_ACTIVE_TICKETS("Get active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ SEARCH_TICKETS("Search tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ DELETE_ACTIVE_TICKETS("Delete active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ POLL_ACTIVE_TICKETS("Polling active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+
+ TICKET_NOT_FOUND("Ticket not found id={0}", Status.NOT_FOUND, Level.INFO),
+ INVALID_ATTRIBUTE("Invalid attribute {0}={1}", Status.BAD_REQUEST, Level.INFO),
+ MISSING_REQUIRED_ATTRIBUTE("Missing required attribute '{0}'", Status.BAD_REQUEST, Level.INFO),
+ INVALID_REQUEST("The input data structure is incorrect", Status.BAD_REQUEST, Level.INFO),
+ REQUEST_TIMED_OUT("Request timed out.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ UNEXPECTED_EXCEPTION("Unexpected exception encountered during processing. Please contact support : {0}",
+ Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+
+ UNDEFINED_FILTER_ATTRIBUTE("Undefined filter attribute {0}", Status.BAD_REQUEST, Level.INFO),
+ INVALID_DATE_FILTER("Invalid date filter provided {0}=(1}", Status.BAD_REQUEST, Level.INFO),
+
+ INCOMING_MESSAGE("Incoming message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ INCOMING_MESSAGE_RESPONSE("Message response method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE("Outgoing message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE_RETURNED("Outgoing message returned method={0} path={1} status={2}", Status.OK, Level.INFO, true,
+ false),
+
+ UNEXPECTED_RESPONSE("Unexpected response from {0} HTTP Status={1} : {2}", Status.OK, Level.INFO),
+ INVALID_CHANGE_WINDOW("Change window end time {1} must be after start time {0}", Status.OK, Level.INFO),
+ EXPECTED_EXCEPTION("Expected exception encountered during processing. {0}", Status.OK, Level.INFO),
+ UNABLE_TO_UPDATE_TICKET("Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}",
+ Status.OK, Level.INFO),
+ UNAUTHORIZED("Authorization failed.", Status.FORBIDDEN, Level.INFO),
+ UNAUTHENTICATED("Authentication failed.", Status.UNAUTHORIZED, Level.INFO),
+
+ ;
+ private final String defaultId;
+ private final String defaultMessage;
+ private final String defaultResolution;
+ private final String defaultAction;
+
+ private final Status status;
+ private final Level level;
+ private final Boolean audit;
+ private final Boolean metric;
+
+
+ private LogMessages(String message, Status code, Level l) {
+ defaultMessage = message;
+ level = l;
+ status = code;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ this.audit = false;
+ this.metric = false;
+ }
+
+ private LogMessages(String message, Status code, Level l, Boolean audit, Boolean metric) {
+ defaultMessage = message;
+ level = l;
+ status = code;
+ this.audit = audit;
+ this.metric = metric;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ }
+
+ private LogMessages(String message, Status code, Level l, String id, String resolution, String action) {
+ level = l;
+ status = code;
+ defaultMessage = message;
+ this.defaultId = id;
+ this.defaultResolution = resolution;
+ this.defaultAction = action;
+ this.audit = false;
+ this.metric = false;
+ }
+
+ static {
+ EELFResourceManager.loadMessageBundle("logmessages");
+ }
+
+ public String genProperties() {
+ // Use this to regenerate properties file. The desire to change messages without updating code is
+ // well understood, but the developer should be able to code the defaults without having to update 2
+ // different files and
+ // get it wrong.
+ StringBuilder sb = new StringBuilder();
+ sb.append("# Generated from ").append(this.getClass().getName()).append("\n");
+ for (LogMessages lm : values()) {
+ sb.append(lm.name());
+ sb.append(" ").append(lm.defaultId);
+ sb.append("|").append(lm.defaultMessage);
+ sb.append("|").append(lm.defaultResolution);
+ sb.append("|").append(lm.defaultAction);
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+
+ // interface methods
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ @Override
+ public String getMessage() {
+ return defaultMessage;
+ }
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ @Override
+ public Enum<?> getValue() {
+ return this;
+ }
+
+ @Override
+ public String getDomain() {
+ return this.getClass().getSimpleName();
+ }
+
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ public static void main(String argv[]) {
+ System.out.println(LogMessages.UNEXPECTED_EXCEPTION.genProperties());
+ try {
+ Files.write(Paths.get("src/main/resources/logmessages.properties"),
+ LogMessages.UNEXPECTED_EXCEPTION.genProperties().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties file.", e);
+
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("<html><body><h1>Cell Site Selection Scheduler mS Observations</h1>\n<table border=\"1\">\n<tr>");
+ sb.append("<td>Code</td> ");
+ sb.append("<td>Log Level</td> ");
+ sb.append("<td>Message</td> ");
+ sb.append("</tr>\n");
+ for (LogMessages m : LogMessages.values()) {
+ if (m.level == Level.ERROR || m.level == Level.WARN || m.level == Level.FATAL) {
+ sb.append("<tr>");
+ sb.append("<td>").append(m.name()).append("</td> ");
+ sb.append("<td>").append(m.level).append("</td> ");
+ sb.append("<td>").append(m.defaultMessage).append("</td> ");
+ sb.append("</tr>\n");
+ }
+ }
+ try {
+ Files.write(Paths.get("logmessages.html"), sb.toString().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties html file.", e);
+
+ }
+
+ }
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOClientFilters.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOClientFilters.java
index c42b253..c013453 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOClientFilters.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOClientFilters.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -32,53 +32,42 @@
package org.onap.optf.ticketmgt.filters;
import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
-
import java.io.IOException;
-
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.ClientResponseContext;
import javax.ws.rs.client.ClientResponseFilter;
import javax.ws.rs.core.MultivaluedMap;
-
import org.onap.observations.Mdc;
import org.onap.observations.MessageHeaders;
import org.onap.observations.MessageHeaders.HeadersEnum;
import org.onap.observations.Observation;
import org.onap.optf.ticketmgt.common.LogMessages;
-import org.onap.optf.ticketmgt.service.rs.TicketManagementImpl;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Component
public class CMSOClientFilters implements ClientRequestFilter, ClientResponseFilter {
- private static EELFLogger log = EELFManager.getInstance().getLogger(TicketManagementImpl.class);
private static String appId = "cmso";
@Override
public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
- // On the way back
- Mdc.metricEnd(responseContext);
- Mdc.setCaller(17);
- Observation.report(LogMessages.OUTGOING_MESSAGE_RETURNED,
- requestContext.getMethod(),
- requestContext.getUri().getPath().toString(),
- responseContext.getStatusInfo().toString());
+ // On the way back
+ Mdc.metricEnd(responseContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE_RETURNED, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString(), responseContext.getStatusInfo().toString());
}
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
- // On the way out
- Mdc.metricStart(requestContext);
- Mdc.setCaller(17);
- Observation.report(LogMessages.OUTGOING_MESSAGE,
- requestContext.getMethod(),
- requestContext.getUri().getPath().toString());
+ // On the way out
+ Mdc.metricStart(requestContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString());
MultivaluedMap<String, Object> headers = requestContext.getHeaders();
String transactionId = (String) headers.getFirst(MessageHeaders.HeadersEnum.TransactionID.toString());
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOContainerFilters.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOContainerFilters.java
index a8f08b3..162a6ba 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOContainerFilters.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/filters/CMSOContainerFilters.java
@@ -33,7 +33,6 @@ package org.onap.optf.ticketmgt.filters;
import java.io.IOException;
import java.util.UUID;
-
import javax.annotation.Priority;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.WebApplicationException;
@@ -46,7 +45,6 @@ import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.ext.Provider;
-
import org.onap.observations.Mdc;
import org.onap.observations.MessageHeaders;
import org.onap.observations.MessageHeaders.HeadersEnum;
@@ -60,18 +58,17 @@ import org.springframework.stereotype.Component;
public class CMSOContainerFilters implements ContainerRequestFilter, ContainerResponseFilter {
- @Context
- private HttpServletRequest servletRequest;
+ @Context
+ private HttpServletRequest servletRequest;
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
- throws IOException {
+ throws IOException {
try {
- Mdc.auditEnd(requestContext, responseContext);
- Observation.report(LogMessages.INCOMING_MESSAGE_RESPONSE,
- requestContext.getMethod(),
- requestContext.getUriInfo().getPath().toString(),
- responseContext.getStatusInfo().toString());
+ Mdc.auditEnd(requestContext, responseContext);
+ Observation.report(LogMessages.INCOMING_MESSAGE_RESPONSE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString(),
+ responseContext.getStatusInfo().toString());
MultivaluedMap<String, String> reqHeaders = requestContext.getHeaders();
MultivaluedMap<String, Object> respHeaders = responseContext.getHeaders();
String minorVersion = (String) reqHeaders.getFirst(HeadersEnum.MinorVersion.toString());
@@ -81,9 +78,9 @@ public class CMSOContainerFilters implements ContainerRequestFilter, ContainerRe
} catch (Exception e) {
if (e instanceof WebApplicationException) {
- Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
} else {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
}
}
}
@@ -92,10 +89,9 @@ public class CMSOContainerFilters implements ContainerRequestFilter, ContainerRe
public void filter(ContainerRequestContext requestContext) throws IOException {
try {
// On the way in
- Mdc.auditStart(requestContext, servletRequest);
- Observation.report(LogMessages.INCOMING_MESSAGE,
- requestContext.getMethod(),
- requestContext.getUriInfo().getPath().toString());
+ Mdc.auditStart(requestContext, servletRequest);
+ Observation.report(LogMessages.INCOMING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString());
String majorVersion = requestContext.getUriInfo().getPath();
if (majorVersion != null) {
@@ -133,7 +129,7 @@ public class CMSOContainerFilters implements ContainerRequestFilter, ContainerRe
Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
throw e;
} else {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
}
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminTool.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminTool.java
index d7e0c94..1ab6db0 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminTool.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminTool.java
@@ -31,6 +31,11 @@
package org.onap.optf.ticketmgt.service.rs;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@@ -38,17 +43,10 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
@Api("Administration")
@Path("/{apiVersion}")
@@ -61,11 +59,10 @@ public interface AdminTool {
@Produces({MediaType.TEXT_PLAIN})
@RequestMapping(value = "/{apiVersion}/admin/{id}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN)
@ApiOperation(value = "", notes = "Returns encrypted value of id.", response = String.class)
- @ApiResponses(
- value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 400, message = "Request failed")})
- public Response exec(
- @ApiParam(value = "v1|v2") @PathVariable @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Identifier") @PathVariable @PathParam("id") String id);
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Request failed")})
+ public Response exec(@ApiParam(
+ value = "v1|v2") @PathVariable @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Identifier") @PathVariable @PathParam("id") String id);
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminToolImpl.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminToolImpl.java
index 89ecdab..f619711 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminToolImpl.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AdminToolImpl.java
@@ -31,28 +31,26 @@
package org.onap.optf.ticketmgt.service.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-
import org.onap.optf.cmso.common.PropertiesManagement;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
@Controller
public class AdminToolImpl implements AdminTool {
private static EELFLogger log = EELFManager.getInstance().getLogger(AdminToolImpl.class);
-
- @Context
+
+ @Context
UriInfo uri;
-
- @Context
+
+ @Context
HttpServletRequest request;
-
+
@Override
public Response exec(String apiVersion, String id) {
log.info("AdminTool.exec entered " + uri.getPath());
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterface.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterface.java
index 60fccd1..cf9c269 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterface.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterface.java
@@ -31,6 +31,11 @@
package org.onap.optf.ticketmgt.service.rs;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
@@ -40,7 +45,6 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.onap.optf.cmso.common.CMSRequestError;
import org.onap.optf.ticketmgt.service.rs.models.ActiveTicketsRequest;
import org.onap.optf.ticketmgt.service.rs.models.ActiveTicketsResponse;
@@ -48,72 +52,65 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
@Api("Availability Interface")
@Path("/{apiVersion}")
@Produces({MediaType.APPLICATION_JSON})
public interface AvailabilityInterface {
// ******************************************************************
-
+
@POST
@Path("/activetickets")
@Produces({MediaType.APPLICATION_JSON})
- @RequestMapping(value = "/{apiVersion}/activetickets", method = RequestMethod.POST,
- consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
- @ApiOperation(value = "Request Active Tickets", notes = "API to support conflict avoidance. Retrieves the active ticket data for the "
- + "passed criteria to detemine availability of passed elements within the passed time window."
- + "\nIf the request results in asynchronous processging, IN_PROGRESS status will be returned and the "
- + "optimizer will begin to poll the request until COMPLETED.",
- response = ActiveTicketsResponse.class)
- @ApiResponses(
- value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 400, message = "Bad request", response = CMSRequestError.class),
+ @RequestMapping(value = "/{apiVersion}/activetickets", method = RequestMethod.POST,
+ consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "Request Active Tickets",
+ notes = "API to support conflict avoidance. Retrieves the active ticket data for the "
+ + "passed criteria to detemine availability of passed elements within the passed time window."
+ + "\nIf the request results in asynchronous processging, IN_PROGRESS status will be returned and the "
+ + "optimizer will begin to poll the request until COMPLETED.",
+ response = ActiveTicketsResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Bad request", response = CMSRequestError.class),
@ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response getActiveTickets(
- @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(value="v1") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Active ticket criteria (elements and change windows).") ActiveTicketsRequest activeTicketsRequest
- );
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Active ticket criteria (elements and change windows).") ActiveTicketsRequest activeTicketsRequest);
@GET
@Path("/activetickets/{id}")
@Produces({MediaType.APPLICATION_JSON})
- @RequestMapping(value = "/{apiVersion}/activetickets/{id}", method = RequestMethod.GET,
- consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
- @ApiOperation(value = "Poll Active Tickets Request", notes = "Poll for the status of the request id. Optimizser will "
- + " poll until status is COMPLETED and issue acknowledge (DELETE) API to acknowledge the "
- + "receipt of the response.",
- response = ActiveTicketsResponse.class)
- @ApiResponses(
- value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 404, message = "Not found.", response = CMSRequestError.class),
+ @RequestMapping(value = "/{apiVersion}/activetickets/{id}", method = RequestMethod.GET,
+ consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "Poll Active Tickets Request",
+ notes = "Poll for the status of the request id. Optimizser will "
+ + " poll until status is COMPLETED and issue acknowledge (DELETE) API to acknowledge the "
+ + "receipt of the response.",
+ response = ActiveTicketsResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 404, message = "Not found.", response = CMSRequestError.class),
@ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response pollActiveTickets(
- @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(value="v1") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Active tickets request id.") @PathParam("id") String id
- );
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Active tickets request id.") @PathParam("id") String id);
@DELETE
@Path("/activetickets/{id}")
@Produces({MediaType.APPLICATION_JSON})
- @RequestMapping(value = "/{apiVersion}/activetickets/{id}", method = RequestMethod.DELETE,
- consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
+ @RequestMapping(value = "/{apiVersion}/activetickets/{id}", method = RequestMethod.DELETE,
+ consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
@ApiOperation(value = "Acknowledge Active Tickets Response", notes = "API call used to acknowledge the receipt"
- + " of a COMPLETED asynchronous request to enable the Ticket Management service to remove it from their cache."
- + " The service may remove from the cache on the poll request. The optimizer will treat Not found reponse on as normal.",
- response = ActiveTicketsResponse.class)
- @ApiResponses(
- value = {@ApiResponse(code = 204, message = "OK"),
- @ApiResponse(code = 404, message = "Not found", response = CMSRequestError.class),
+ + " of a COMPLETED asynchronous request to enable the Ticket Management service to remove it from their cache."
+ + " The service may remove from the cache on the poll request. The optimizer will treat Not found reponse on as normal.",
+ response = ActiveTicketsResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 204, message = "OK"),
+ @ApiResponse(code = 404, message = "Not found", response = CMSRequestError.class),
@ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response deleteActiveTicketsRequest(
- @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(value="v1") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Active tickets request id.") @PathParam("id") String id
- );
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Active tickets request id.") @PathParam("id") String id);
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterfaceImpl.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterfaceImpl.java
index 9538f46..06c9e42 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterfaceImpl.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/AvailabilityInterfaceImpl.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,11 +31,12 @@
package org.onap.optf.ticketmgt.service.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-
import org.onap.observations.Observation;
import org.onap.optf.ticketmgt.common.LogMessages;
import org.onap.optf.ticketmgt.service.rs.models.ActiveTicketsRequest;
@@ -46,93 +47,90 @@ import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
@Controller
-public class AvailabilityInterfaceImpl implements AvailabilityInterface {
+public class AvailabilityInterfaceImpl implements AvailabilityInterface {
+ @SuppressWarnings("unused")
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
Environment env;
-
- @Context
+
+ @Context
UriInfo uri;
-
- @Context
+
+ @Context
HttpServletRequest request;
- @Override
- public Response getActiveTickets(String apiVersion, ActiveTicketsRequest activeTicketsRequest)
- {
- // TODO Auto-generated method stub
- String id = activeTicketsRequest.getRequestId();
+ @Override
+ public Response getActiveTickets(String apiVersion, ActiveTicketsRequest activeTicketsRequest) {
+ // TODO Auto-generated method stub
+ String id = activeTicketsRequest.getRequestId();
Observation.report(LogMessages.GET_ACTIVE_TICKETS, "Received", request.getRemoteAddr(), id, "");
Response response = null;
- try
- {
- ActiveTicketsResponse atr = new ActiveTicketsResponse();
- atr.setRequestId(activeTicketsRequest.getRequestId());
- atr.setStatus(ActiveTicketResponseStatus.COMPLETED);
+ try {
+ ActiveTicketsResponse atr = new ActiveTicketsResponse();
+ atr.setRequestId(activeTicketsRequest.getRequestId());
+ atr.setStatus(ActiveTicketResponseStatus.COMPLETED);
response = Response.ok(atr).build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.GET_ACTIVE_TICKETS, "Returned", request.getRemoteAddr(), id, response.getStatusInfo().toString());
- return response;
- }
+ Observation.report(LogMessages.GET_ACTIVE_TICKETS, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
- @Override
- public Response pollActiveTickets(String apiVersion, String id) {
- // TODO Auto-generated method stub
+ @Override
+ public Response pollActiveTickets(String apiVersion, String id) {
+ // TODO Auto-generated method stub
Observation.report(LogMessages.POLL_ACTIVE_TICKETS, "Received", request.getRemoteAddr(), id, "");
Response response = null;
- try
- {
- ActiveTicketsResponse atr = new ActiveTicketsResponse();
- atr.setRequestId(id);
- atr.setStatus(ActiveTicketResponseStatus.COMPLETED);
+ try {
+ ActiveTicketsResponse atr = new ActiveTicketsResponse();
+ atr.setRequestId(id);
+ atr.setStatus(ActiveTicketResponseStatus.COMPLETED);
response = Response.ok(atr).build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.POLL_ACTIVE_TICKETS, "Returned", request.getRemoteAddr(), id, response.getStatusInfo().toString());
- return response;
- }
+ Observation.report(LogMessages.POLL_ACTIVE_TICKETS, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
- @Override
- public Response deleteActiveTicketsRequest(String apiVersion, String id) {
- // TODO Auto-generated method stub
+ @Override
+ public Response deleteActiveTicketsRequest(String apiVersion, String id) {
+ // TODO Auto-generated method stub
Observation.report(LogMessages.DELETE_ACTIVE_TICKETS, "Received", request.getRemoteAddr(), id, "");
Response response = null;
- try
- {
+ try {
response = Response.noContent().build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.DELETE_ACTIVE_TICKETS, "Returned", request.getRemoteAddr(), id, response.getStatusInfo().toString());
- return response;
- }
+ Observation.report(LogMessages.DELETE_ACTIVE_TICKETS, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheck.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheck.java
index d15c858..6819d99 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheck.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheck.java
@@ -31,6 +31,11 @@
package org.onap.optf.ticketmgt.service.rs;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@@ -39,17 +44,10 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.onap.optf.ticketmgt.service.rs.models.HealthCheckMessage;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
@Api("Administration")
@Path("/{apiVersion}")
@Produces({MediaType.APPLICATION_JSON})
@@ -62,8 +60,8 @@ public interface HealthCheck {
@RequestMapping(value = "/{apiVersion}/health", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON)
@ApiOperation(value = "", notes = "Returns health status of server.", response = HealthCheckMessage.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 400, message = "Not healthy", response = HealthCheckMessage.class)})
- public Response healthCheck(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Check Interfaces") @QueryParam("checkInterfaces") @DefaultValue(value = "true") Boolean checkInterfaces);
+ @ApiResponse(code = 400, message = "Not healthy", response = HealthCheckMessage.class)})
+ public Response healthCheck(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Check Interfaces") @QueryParam("checkInterfaces") @DefaultValue(
+ value = "true") Boolean checkInterfaces);
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheckImpl.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheckImpl.java
index c23e092..efc57ec 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheckImpl.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/HealthCheckImpl.java
@@ -31,20 +31,18 @@
package org.onap.optf.ticketmgt.service.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-
import org.onap.optf.ticketmgt.service.rs.models.HealthCheckComponent;
import org.onap.optf.ticketmgt.service.rs.models.HealthCheckMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
@Controller
public class HealthCheckImpl implements HealthCheck {
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@@ -53,11 +51,11 @@ public class HealthCheckImpl implements HealthCheck {
@Autowired
Environment env;
-
- @Context
+
+ @Context
UriInfo uri;
-
- @Context
+
+ @Context
HttpServletRequest request;
@Override
@@ -90,7 +88,7 @@ public class HealthCheckImpl implements HealthCheck {
String url = env.getProperty("spring.datasource.url");
hcc.setUrl(url);
try {
- //List<ApprovalType> approvalTypes = approvalTypeDAO.findByDomain("HealthCheck");
+ // List<ApprovalType> approvalTypes = approvalTypeDAO.findByDomain("HealthCheck");
hcc.setHealthy(true);
hcc.setStatus("OK");
} catch (Exception e) {
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagement.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagement.java
index 13e7f6d..96c2ada 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagement.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagement.java
@@ -31,6 +31,11 @@
package org.onap.optf.ticketmgt.service.rs;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
@@ -42,16 +47,9 @@ import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.onap.optf.cmso.common.CMSRequestError;
import org.onap.optf.ticketmgt.service.rs.models.TicketData;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-
@Api("Ticket Management")
@Path("/{apiVersion}")
@Produces({MediaType.APPLICATION_JSON})
@@ -61,39 +59,36 @@ public interface TicketManagement {
@Path("/ticket/{id}")
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "Fetch Ticket", notes = "Returns ticket information for the provided ticket id.",
- response = TicketData.class)
+ response = TicketData.class)
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 404, message = "No record found", response = CMSRequestError.class),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
- public Response fetchTicket(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Unique ticket identifier") @PathParam("id") String id);
+ @ApiResponse(code = 404, message = "No record found", response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response fetchTicket(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Unique ticket identifier") @PathParam("id") String id);
// ******************************************************************
@POST
@Path("/ticket/")
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "Create Ticket", notes = "Creates a ticket for the passed data")
- @ApiResponses(
- value = {@ApiResponse(code = 200, message = "Ticket Created. Ticket Id returned.", response=TicketData.class),
+ @ApiResponses(value = {
+ @ApiResponse(code = 200, message = "Ticket Created. Ticket Id returned.",
+ response = TicketData.class),
@ApiResponse(code = 400, message = "Bad request.", response = CMSRequestError.class),
@ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
- public Response createTicket(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Data for creating a ticket") TicketData ticketData);
+ public Response createTicket(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Data for creating a ticket") TicketData ticketData);
// ******************************************************************
@PUT
@Path("/ticket/")
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "Update Ticket", notes = "Updates a ticket to the passed data")
- @ApiResponses(
- value = {@ApiResponse(code = 204, message = "Ticket Updated."),
+ @ApiResponses(value = {@ApiResponse(code = 204, message = "Ticket Updated."),
@ApiResponse(code = 400, message = "Bad request.", response = CMSRequestError.class),
@ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
- public Response updateTicket(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Data for updating a ticket") TicketData ticketData);
+ public Response updateTicket(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Data for updating a ticket") TicketData ticketData);
// ******************************************************************
@DELETE
@@ -101,35 +96,33 @@ public interface TicketManagement {
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "Cancel the ticket", notes = "Cancels the ticket.")
@ApiResponses(value = {@ApiResponse(code = 204, message = "Delete successful"),
- @ApiResponse(code = 404, message = "No record found", response = CMSRequestError.class),
- @ApiResponse(code = 400, message = "Bad request", response = CMSRequestError.class),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 404, message = "No record found", response = CMSRequestError.class),
+ @ApiResponse(code = 400, message = "Bad request", response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response deleteScheduleRequest(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Ticket id to uniquely identify the ticket being deleted.") @PathParam("id") String id);
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Ticket id to uniquely identify the ticket being deleted.") @PathParam("id") String id);
+
-
// ******************************************************************
@GET
@Path("/tickets")
@Produces({MediaType.APPLICATION_JSON})
@ApiOperation(value = "Search Tickets", notes = "Returns a list of based upon the filter criteria.",
- response = TicketData.class, responseContainer = "List")
+ response = TicketData.class, responseContainer = "List")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
- @ApiResponse(code = 400, message = "Bad request", response = CMSRequestError.class),
- @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ @ApiResponse(code = 400, message = "Bad request", response = CMSRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
public Response searchTcikets(
- @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
- @ApiParam(value = "Ticket identifier",
- allowMultiple = true) @QueryParam("id") String id,
- @ApiParam(value = "Element Id",
- allowMultiple = true) @QueryParam("elementId") String elementId,
- @ApiParam(value = "Start time <low>,<high>",
- allowMultiple = true) @QueryParam("startTime") String startTime,
- @ApiParam(value = "Finish time <low>,<high>",
- allowMultiple = true) @QueryParam("finishTime") String finishTime,
- @ApiParam(value = "Maximum number of tickets to return") @QueryParam("maxTickets") Integer maxTickets,
- @ApiParam(value = "Return tickets > last id") @QueryParam("lastId") String lastId);
+ @ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Ticket identifier", allowMultiple = true) @QueryParam("id") String id,
+ @ApiParam(value = "Element Id", allowMultiple = true) @QueryParam("elementId") String elementId,
+ @ApiParam(value = "Start time <low>,<high>",
+ allowMultiple = true) @QueryParam("startTime") String startTime,
+ @ApiParam(value = "Finish time <low>,<high>",
+ allowMultiple = true) @QueryParam("finishTime") String finishTime,
+ @ApiParam(value = "Maximum number of tickets to return") @QueryParam("maxTickets") Integer maxTickets,
+ @ApiParam(value = "Return tickets > last id") @QueryParam("lastId") String lastId);
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagementImpl.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagementImpl.java
index 4346f0b..6583c5e 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagementImpl.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/TicketManagementImpl.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,15 +31,15 @@
package org.onap.optf.ticketmgt.service.rs;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
-
import org.onap.observations.Observation;
import org.onap.optf.ticketmgt.common.LogMessages;
import org.onap.optf.ticketmgt.service.rs.models.TicketData;
@@ -48,133 +48,131 @@ import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
@Controller
-public class TicketManagementImpl implements TicketManagement {
+public class TicketManagementImpl implements TicketManagement {
+ @SuppressWarnings("unused")
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@Autowired
Environment env;
-
- @Context
+
+ @Context
UriInfo uri;
-
- @Context
+
+ @Context
HttpServletRequest request;
- @Override
- public Response fetchTicket(String apiVersion, String id) {
- // TODO Auto-generated method stub
+ @Override
+ public Response fetchTicket(String apiVersion, String id) {
+ // TODO Auto-generated method stub
Observation.report(LogMessages.FETCH_TICKET, "Received", request.getRemoteAddr(), id, "");
Response response = null;
- try
- {
- TicketData td = new TicketData();
- td.setId(id);
+ try {
+ TicketData td = new TicketData();
+ td.setId(id);
response = Response.ok(td).build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.FETCH_TICKET, "Returned", request.getRemoteAddr(), id, response.getStatusInfo().toString());
+ Observation.report(LogMessages.FETCH_TICKET, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
return response;
- }
+ }
- @Override
- public Response createTicket(String apiVersion, TicketData ticketData) {
- // TODO Auto-generated method stub
+ @Override
+ public Response createTicket(String apiVersion, TicketData ticketData) {
+ // TODO Auto-generated method stub
String id = UUID.randomUUID().toString();
Observation.report(LogMessages.CREATE_TICKET, "Received", request.getRemoteAddr(), id, "");
Response response = null;
- try
- {
- ticketData.setId(id);
+ try {
+ ticketData.setId(id);
response = Response.ok(ticketData).build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.CREATE_TICKET, "Returned", request.getRemoteAddr(), id, response.getStatusInfo().toString());
+ Observation.report(LogMessages.CREATE_TICKET, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
return response;
- }
+ }
- @Override
- public Response updateTicket(String apiVersion, TicketData ticketData) {
- // TODO Auto-generated method stub
+ @Override
+ public Response updateTicket(String apiVersion, TicketData ticketData) {
+ // TODO Auto-generated method stub
String id = ticketData.getId();
Observation.report(LogMessages.UPDATE_TICKET, "Received", request.getRemoteAddr(), id, "");
Response response = null;
- try
- {
+ try {
response = Response.noContent().build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.UPDATE_TICKET, "Returned", request.getRemoteAddr(), id, response.getStatusInfo().toString());
- return response;
- }
+ Observation.report(LogMessages.UPDATE_TICKET, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
- @Override
- public Response searchTcikets(String apiVersion, String id, String elementId, String startTime, String finishTime,
- Integer maxTickets, String lastId) {
- // TODO Auto-generated method stub
- // TODO Auto-generated method stub
+ @Override
+ public Response searchTcikets(String apiVersion, String id, String elementId, String startTime, String finishTime,
+ Integer maxTickets, String lastId) {
+ // TODO Auto-generated method stub
+ // TODO Auto-generated method stub
Observation.report(LogMessages.SEARCH_TICKETS, "Received", request.getRemoteAddr(), uri.getPath(), "");
Response response = null;
List<TicketData> list = new ArrayList<>();
- try
- {
+ try {
response = Response.ok(list).build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.SEARCH_TICKETS, "Returned", request.getRemoteAddr(), uri.getPath(), response.getStatusInfo().toString());
- return response;
- }
+ Observation.report(LogMessages.SEARCH_TICKETS, "Returned", request.getRemoteAddr(), uri.getPath(),
+ response.getStatusInfo().toString());
+ return response;
+ }
- @Override
- public Response deleteScheduleRequest(String apiVersion, String id) {
+ @Override
+ public Response deleteScheduleRequest(String apiVersion, String id) {
Observation.report(LogMessages.CANCEL_TICKET, "Received", request.getRemoteAddr(), id, "");
Response response = null;
- try
- {
+ try {
response = Response.noContent().build();
-// } catch (CMSException e) {
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-// Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
-// response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
} catch (Exception e) {
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
response = Response.serverError().build();
}
- Observation.report(LogMessages.CANCEL_TICKET, "Returned", request.getRemoteAddr(), id, response.getStatusInfo().toString());
- return response;
- }
+ Observation.report(LogMessages.CANCEL_TICKET, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsRequest.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsRequest.java
index 9c979de..34093f9 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsRequest.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsRequest.java
@@ -31,19 +31,18 @@
package org.onap.optf.ticketmgt.service.rs.models;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
-@ApiModel(value = "Ticket Management Request", description = "Request to retrieve active tickets for the provided elements.")
+@ApiModel(value = "Ticket Management Request",
+ description = "Request to retrieve active tickets for the provided elements.")
public class ActiveTicketsRequest implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(ActiveTicketsRequest.class);
@@ -52,57 +51,56 @@ public class ActiveTicketsRequest implements Serializable {
private String requestId;
@ApiModelProperty(
- value = "Implementation specific name value pairs provided to be passed to Ticket Management query .")
+ value = "Implementation specific name value pairs provided to be passed to Ticket Management query .")
private List<NameValue> commonData;
- @ApiModelProperty(
- value = "Lists of desired change windows for which TicketData will be returned.")
+ @ApiModelProperty(value = "Lists of desired change windows for which TicketData will be returned.")
private List<ChangeWindow> changeWindows = new ArrayList<>();
@ApiModelProperty(value = "List of the elements for which TicketData will be returned.")
private List<ElementCriteria> elements = new ArrayList<>();
public String getRequestId() {
- return requestId;
- }
+ return requestId;
+ }
- public void setRequestId(String requestId) {
- this.requestId = requestId;
- }
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
- public List<NameValue> getCommonData() {
- return commonData;
- }
+ public List<NameValue> getCommonData() {
+ return commonData;
+ }
- public void setCommonData(List<NameValue> commonData) {
- this.commonData = commonData;
- }
+ public void setCommonData(List<NameValue> commonData) {
+ this.commonData = commonData;
+ }
- public List<ChangeWindow> getChangeWindows() {
- return changeWindows;
- }
+ public List<ChangeWindow> getChangeWindows() {
+ return changeWindows;
+ }
- public void setChangeWindows(List<ChangeWindow> changeWindows) {
- this.changeWindows = changeWindows;
- }
+ public void setChangeWindows(List<ChangeWindow> changeWindows) {
+ this.changeWindows = changeWindows;
+ }
- public List<ElementCriteria> getElements() {
- return elements;
- }
+ public List<ElementCriteria> getElements() {
+ return elements;
+ }
- public void setElements(List<ElementCriteria> elements) {
- this.elements = elements;
- }
+ public void setElements(List<ElementCriteria> elements) {
+ this.elements = elements;
+ }
- public String toString() {
+ public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsResponse.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsResponse.java
index d3d5f7d..579f36a 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsResponse.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ActiveTicketsResponse.java
@@ -1,27 +1,27 @@
/*
* Copyright © 2017-2019 AT&T Intellectual Property.
* Modifications Copyright © 2018 IBM.
- *
+ *
* Licensed 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.
- *
- *
+ *
+ *
* Unless otherwise specified, all documentation contained herein is licensed
* under the Creative Commons License, Attribution 4.0 Intl. (the "License");
* you may not use this documentation except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* https://creativecommons.org/licenses/by/4.0/
- *
+ *
* Unless required by applicable law or agreed to in writing, documentation
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,73 +31,77 @@
package org.onap.optf.ticketmgt.service.rs.models;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
-@ApiModel(value = "Ticket Management Response", description = "Response to active ticket query for the requested elements.")
+@ApiModel(value = "Ticket Management Response",
+ description = "Response to active ticket query for the requested elements.")
public class ActiveTicketsResponse implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(ActiveTicketsResponse.class);
- public enum ActiveTicketResponseStatus
- {
- IN_PROGESS,
- COMPLETED,
+ public enum ActiveTicketResponseStatus {
+ IN_PROGESS, COMPLETED, FAILED,
}
+
@ApiModelProperty(value = "Unique Id of the request")
private String requestId;
- @ApiModelProperty(value = "List of TicketData for the requested elements. A single ticket may apply to more than 1 passed elementId.")
+ @ApiModelProperty(
+ value = "List of TicketData for the requested elements. A single ticket may apply to more than 1 passed elementId.")
private List<TicketData> elements = new ArrayList<>();
-
- @ApiModelProperty(value = "Status of ticket request. IN_PROGRESS will indicate asynchronous processing is required.")
+
+ @ApiModelProperty(
+ value = "Status of ticket request. IN_PROGRESS will indicate asynchronous processing is required.")
private ActiveTicketResponseStatus status;
-
+
@ApiModelProperty(value = "If request is asynchronous (IN_PROGRESS), suggested interval to the next poll.")
private Integer pollingSeconds;
-
+
+ @ApiModelProperty(value = "Error message for FAILED.")
+ private String errorMessage;
+
public String getRequestId() {
- return requestId;
- }
+ return requestId;
+ }
- public void setRequestId(String requestId) {
- this.requestId = requestId;
- }
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
- public List<TicketData> getElements() {
- return elements;
- }
+ public List<TicketData> getElements() {
+ return elements;
+ }
- public void setElements(List<TicketData> elements) {
- this.elements = elements;
- }
+ public void setElements(List<TicketData> elements) {
+ this.elements = elements;
+ }
- public ActiveTicketResponseStatus getStatus() {
- return status;
- }
+ public ActiveTicketResponseStatus getStatus() {
+ return status;
+ }
- public void setStatus(ActiveTicketResponseStatus status) {
- this.status = status;
- }
+ public void setStatus(ActiveTicketResponseStatus status) {
+ this.status = status;
+ }
- public Integer getPollingSeconds() {
- return pollingSeconds;
- }
+ public Integer getPollingSeconds() {
+ return pollingSeconds;
+ }
- public void setPollingSeconds(Integer pollingSeconds) {
- this.pollingSeconds = pollingSeconds;
- }
+ public void setPollingSeconds(Integer pollingSeconds) {
+ this.pollingSeconds = pollingSeconds;
+ }
- public String toString() {
+ @Override
+ public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ChangeWindow.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ChangeWindow.java
index 9b88cf2..31a49de 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ChangeWindow.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ChangeWindow.java
@@ -31,31 +31,27 @@
package org.onap.optf.ticketmgt.service.rs.models;
-import java.io.Serializable;
-import java.util.Date;
-
-import org.springframework.format.annotation.DateTimeFormat;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.Date;
+import org.springframework.format.annotation.DateTimeFormat;
-@ApiModel(value = "Change Window",
- description = "Time window for which tickets are to returned")
+@ApiModel(value = "Change Window", description = "Time window for which tickets are to returned")
public class ChangeWindow implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(ChangeWindow.class);
@ApiModelProperty(value = "Earliest time for which changes may begin.")
- @DateTimeFormat(pattern="yyyy-MM-dd'T'hh:mm:ss'Z'")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
private Date startTime;
@ApiModelProperty(value = "Latest time by which all changes must be completed.")
- @DateTimeFormat(pattern="yyyy-MM-dd'T'hh:mm:ss'Z'")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
private Date endTime;
public Date getStartTime() {
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ElementCriteria.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ElementCriteria.java
index 8b812a2..0043dd3 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ElementCriteria.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/ElementCriteria.java
@@ -30,13 +30,12 @@
******************************************************************************/
package org.onap.optf.ticketmgt.service.rs.models;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
@ApiModel(value = "Element Critera", description = "Element criteria for retrieving active tickets.")
public class ElementCriteria implements Serializable {
private static final long serialVersionUID = 1L;
@@ -47,20 +46,20 @@ public class ElementCriteria implements Serializable {
@ApiModelProperty(value = "Implementation specific element data.")
public List<NameValue> elementData = new ArrayList<>();
- public String getElementId() {
- return elementId;
- }
+ public String getElementId() {
+ return elementId;
+ }
- public void setElementId(String elementId) {
- this.elementId = elementId;
- }
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
- public List<NameValue> getElementData() {
- return elementData;
- }
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
- public void setElementData(List<NameValue> elementData) {
- this.elementData = elementData;
- }
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
}
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckComponent.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckComponent.java
index 8717987..dafe38e 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckComponent.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckComponent.java
@@ -31,14 +31,12 @@
package org.onap.optf.ticketmgt.service.rs.models;
-import java.io.Serializable;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
@ApiModel
public class HealthCheckComponent implements Serializable {
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckMessage.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckMessage.java
index fd313fd..e36f54e 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckMessage.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/HealthCheckMessage.java
@@ -31,16 +31,14 @@
package org.onap.optf.ticketmgt.service.rs.models;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
@ApiModel
public class HealthCheckMessage implements Serializable {
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/NameValue.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/NameValue.java
index dbbcac7..c5c53b2 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/NameValue.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/NameValue.java
@@ -31,19 +31,15 @@
package org.onap.optf.ticketmgt.service.rs.models;
-import java.io.Serializable;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
-@ApiModel(value = "Name Value Data",
- description = "Instance of a name/value")
+@ApiModel(value = "Name Value Data", description = "Instance of a name/value")
public class NameValue implements Serializable {
private static final long serialVersionUID = 1L;
private static EELFLogger log = EELFManager.getInstance().getLogger(NameValue.class);
@@ -53,29 +49,29 @@ public class NameValue implements Serializable {
@ApiModelProperty(value = "Value.")
private Object value;
-
-
+
+
public String getName() {
- return name;
- }
+ return name;
+ }
- public void setName(String name) {
- this.name = name;
- }
+ public void setName(String name) {
+ this.name = name;
+ }
- public Object getValue() {
- return value;
- }
+ public Object getValue() {
+ return value;
+ }
- public void setValue(Object value) {
- this.value = value;
- }
+ public void setValue(Object value) {
+ this.value = value;
+ }
- public String toString() {
+ public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
diff --git a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/TicketData.java b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/TicketData.java
index b7014b2..486034f 100644
--- a/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/TicketData.java
+++ b/cmso-ticketmgt/src/main/java/org/onap/optf/ticketmgt/service/rs/models/TicketData.java
@@ -34,15 +34,12 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-
import org.onap.optf.ticketmgt.common.Availability;
import org.springframework.format.annotation.DateTimeFormat;
-
import com.att.eelf.configuration.EELFLogger;
import com.att.eelf.configuration.EELFManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
-
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -55,71 +52,72 @@ public class TicketData implements Serializable {
private String id;
@ApiModelProperty(value = "Scheduled start time of change.")
- @DateTimeFormat(pattern="yyyy-MM-dd'T'hh:mm:ss'Z'")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
private Date startTime;
@ApiModelProperty(value = "Scheduled end time of change.")
- @DateTimeFormat(pattern="yyyy-MM-dd'T'hh:mm:ss'Z'")
+ @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
private Date endTime;
@ApiModelProperty(value = "Availability of element(s) during change window")
private Availability availability;
- @ApiModelProperty(value = "List elementIds of elements being changed. At least one maps to elementId in the request")
+ @ApiModelProperty(
+ value = "List elementIds of elements being changed. At least one maps to elementId in the request")
private List<String> elementIds = new ArrayList<>();
-
+
@ApiModelProperty(value = "Details of the change.")
private String changeDetails;
-
+
public String getId() {
- return id;
- }
+ return id;
+ }
- public void setId(String id) {
- this.id = id;
- }
+ public void setId(String id) {
+ this.id = id;
+ }
- public Date getStartTime() {
- return startTime;
- }
+ public Date getStartTime() {
+ return startTime;
+ }
- public void setStartTime(Date startTime) {
- this.startTime = startTime;
- }
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
- public Date getEndTime() {
- return endTime;
- }
+ public Date getEndTime() {
+ return endTime;
+ }
- public void setEndTime(Date endTime) {
- this.endTime = endTime;
- }
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
- public Availability getAvailability() {
- return availability;
- }
+ public Availability getAvailability() {
+ return availability;
+ }
- public void setAvailability(Availability availability) {
- this.availability = availability;
- }
+ public void setAvailability(Availability availability) {
+ this.availability = availability;
+ }
- public List<String> getElementIds() {
- return elementIds;
- }
+ public List<String> getElementIds() {
+ return elementIds;
+ }
- public void setElementIds(List<String> elementIds) {
- this.elementIds = elementIds;
- }
+ public void setElementIds(List<String> elementIds) {
+ this.elementIds = elementIds;
+ }
- public String getChangeDetails() {
- return changeDetails;
- }
+ public String getChangeDetails() {
+ return changeDetails;
+ }
- public void setChangeDetails(String changeDetails) {
- this.changeDetails = changeDetails;
- }
+ public void setChangeDetails(String changeDetails) {
+ this.changeDetails = changeDetails;
+ }
- public String toString() {
+ public String toString() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(this);
diff --git a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/JtestHelper.java b/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/JtestHelper.java
deleted file mode 100644
index eb013a6..0000000
--- a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/JtestHelper.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.util.Map;
-import java.util.Scanner;
-import org.apache.commons.lang3.text.StrSubstitutor;
-
-public class JtestHelper {
- private static String templatefolder = "src/test/templates" + File.separator;
-
- public static String template(String filename, Map<String, String> values) {
- String data = "";
- Scanner s = null;
- try {
- File t = new File(templatefolder + filename);
- s = new Scanner(t);
- s.useDelimiter("\\Z");
- data = s.next();
- StrSubstitutor ss = new StrSubstitutor(values);
- data = ss.replace(data);
- } catch (FileNotFoundException e) {
- data = "";
- } finally {
- if (s != null)
- s.close();
- }
- return data;
- }
-}
diff --git a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java b/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
deleted file mode 100644
index cb5f9df..0000000
--- a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.service.rs;
-
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import javax.servlet.http.HttpServletRequest;
-
-public class MockHttpServletRequest {
- public StringBuffer url = new StringBuffer("http://localhost:8089/cmso/v1/ChangeManagement/schedules/");
- public HttpServletRequest request = mock(HttpServletRequest.class);
-
- MockHttpServletRequest() {
-
- when(request.getRequestURL()).thenReturn(url);
- when(request.getHeader("Authorization")).thenReturn("BasicbTEzODc3OnNjaGVkdWxlci1SMTgwMiE=");
-
- }
-
-}
diff --git a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java b/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
deleted file mode 100644
index e5a4ee3..0000000
--- a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright 2018 IBM.
- *
- * Licensed 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.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * 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.onap.optf.cmso.utilities;
-
-import org.onap.optf.cmso.common.PropertiesManagement;
-
-public class PropertiesAdmin {
- public static void main(String[] args) {
- PropertiesManagement pm = new PropertiesManagement();
- if (args.length < 1) {
- System.out.println("Missing argument");
- return;
- }
- String value = "";
- if (args[0].startsWith("dec:")) {
- value = PropertiesManagement.getDecryptedValue(args[0].substring(4));
- } else {
- value = pm.getEncryptedValue(args[0]);
- }
- System.out.println(args[0] + " : " + value);
- }
-
-}
diff --git a/cmso-topology/data/vnf1.json b/cmso-topology/data/vnf1.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/cmso-topology/data/vnf1.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/cmso-topology/etc/config/README.txt b/cmso-topology/etc/config/README.txt
new file mode 100644
index 0000000..f815955
--- /dev/null
+++ b/cmso-topology/etc/config/README.txt
@@ -0,0 +1,3 @@
+The files in this etc/config folder are here for testing locally on eclipse.
+
+The files actually deployed are elsewhere
diff --git a/cmso-topology/etc/config/cadi.properties b/cmso-topology/etc/config/cadi.properties
new file mode 100644
index 0000000..5135d1d
--- /dev/null
+++ b/cmso-topology/etc/config/cadi.properties
@@ -0,0 +1,4 @@
+
+cadi_loglevel=DEBUG
+cadi_prop_files=src/main/resources/aaf/org.onap.oof.props
+
diff --git a/cmso-topology/etc/config/topology.properties b/cmso-topology/etc/config/topology.properties
new file mode 100644
index 0000000..5ca252f
--- /dev/null
+++ b/cmso-topology/etc/config/topology.properties
@@ -0,0 +1,30 @@
+#-------------------------------------------------------------------------------
+# Copyright 2017-2019 AT&T Intellectual Property.
+# Modifications Copyright 2018 IBM.
+#
+# Licensed 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.
+#
+#
+# Unless otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the ??License?);
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# 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.
+#-------------------------------------------------------------------------------
diff --git a/cmso-topology/pom.xml b/cmso-topology/pom.xml
new file mode 100644
index 0000000..a426a82
--- /dev/null
+++ b/cmso-topology/pom.xml
@@ -0,0 +1,516 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ============LICENSE_START=======================================================
+ org.onap.optf.cmso ================================================================================
+ Copyright © 2019 AT&T Intellectual Property. All rights reserved. ================================================================================
+ Licensed 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. ============LICENSE_END========================================================= -->
+
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onap.optf.cmso</groupId>
+ <artifactId>cmso</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.onap.optf.cmso.topology</groupId>
+ <artifactId>cmso-topology</artifactId>
+
+ <packaging>jar</packaging>
+
+ <name>cmso</name>
+
+ <properties>
+ <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
+
+ <cmso.project.version>${project.version}</cmso.project.version>
+ <cmso.build.timestamp>${maven.build.timestamp}</cmso.build.timestamp>
+
+ <service.name>cmso</service.name>
+ <release-tag>Casablanca</release-tag>
+ <name.space>org.onap.optf.cmso</name.space>
+ <serviceArtifactName>cmso</serviceArtifactName>
+
+ <java.version>1.8</java.version>
+ <eelf.version>1.0.0</eelf.version>
+ <pact.version>3.3.9</pact.version>
+ <spring.version>5.0.10.RELEASE</spring.version>
+ <spring.boot.version>2.1.3.RELEASE</spring.boot.version>
+ <swagger.core.version>2.0.0</swagger.core.version>
+
+ <maven.compiler.target>1.8</maven.compiler.target>
+ <maven.compiler.source>1.8</maven.compiler.source>
+ <build.number>${maven.build.timestamp}</build.number>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format>
+ <mariadb.version>2.2.1</mariadb.version>
+ <swagger.directory>${basedir}/src/main/resources/META-INF/resources/swagger/</swagger.directory>
+ <aaf.version>2.1.4</aaf.version>
+
+ <!-- Sonar -->
+ <ilib.version>2.0.7</ilib.version>
+ <sonar.language>java</sonar.language>
+ <jacoco.path>${basedir}/target/jacoco_report</jacoco.path>
+ <jacoco.itPath>${basedir}/target/jacoco_itReport</jacoco.itPath>
+ <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
+ <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
+ <sonar.jacoco.reportPath>${basedir}/target/jacoco-ut.exec</sonar.jacoco.reportPath>
+ <sonar.jacoco.itReportPath>${basedir}/target/jacoco-it.exec</sonar.jacoco.itReportPath>
+ <sonar.surefire.reportsPath>${basedir}/target/surefire-reports</sonar.surefire.reportsPath>
+ <sonar.failsafe.reportsPath>${basedir}/target/failsafe-reports</sonar.failsafe.reportsPath>
+
+ <docker.push.registry>localhost:5000</docker.push.registry>
+ <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry>
+ <docker.skip.build>false</docker.skip.build>
+ <docker.skip.push>false</docker.skip.push>
+ <docker.skip.tag>false</docker.skip.tag>
+ <skip.staging.artifacts>false</skip.staging.artifacts>
+
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <!-- Spring boot -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>${spring.boot.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-jersey</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-security</artifactId>
+ </dependency>
+ <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader-tools</artifactId>
+ </dependency> -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-data-jpa</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ </dependency>
+ <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>
+ </dependency> -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-configuration-processor</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-expression</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-tx</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context-support</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ <version>${eelf.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ </exclusion>
+
+ </exclusions>
+ </dependency>
+ <!-- <dependency> <groupId>org.onap.aaf.authz</groupId> <artifactId>aaf-cadi-aaf</artifactId>
+ <version>2.1.1</version> </dependency> -->
+ <dependency>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>javax.ws.rs-api</artifactId>
+ <version>2.1</version>
+ </dependency>
+
+ <!--Swagger Dependencies -->
+ <dependency>
+ <groupId>io.swagger.core.v3</groupId>
+ <artifactId>swagger-jaxrs2</artifactId>
+ <version>${swagger.core.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.swagger.core.v3</groupId>
+ <artifactId>swagger-jaxrs2-servlet-initializer</artifactId>
+ <version>${swagger.core.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-jersey2-jaxrs</artifactId>
+ <version>1.5.0</version>
+ </dependency>
+
+
+ <!-- Database -->
+ <dependency>
+ <groupId>org.mariadb.jdbc</groupId>
+ <artifactId>mariadb-java-client</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>joda-time</groupId>
+ <artifactId>joda-time</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-text</artifactId>
+ <version>1.6</version>
+ </dependency>
+ <!-- Testing Dependencies -->
+ <!-- <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId>
+ <version>1.7.4</version> <scope>test</scope> </dependency> -->
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>1.9.5</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <version>0.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.aaf.authz</groupId>
+ <artifactId>aaf-cadi-aaf</artifactId>
+ <version>${aaf.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <finalName>cmso-topology</finalName>
+ <plugins>
+ <plugin>
+ <groupId>au.com.dius</groupId>
+ <artifactId>pact-jvm-provider-maven_2.11</artifactId>
+ <version>${pact.version}</version>
+ <configuration>
+ <!--pactBrokerUrl,user name,password and project version required only
+ for consumer -->
+ <pactBrokerUrl>${BROKER_URL}</pactBrokerUrl>
+ <pactBrokerUsername>pactadmin</pactBrokerUsername>
+ <pactBrokerPassword>pactadmin</pactBrokerPassword>
+ <projectVersion>1.0.0</projectVersion>
+ <!-- service provider required only for producer -->
+ <serviceProviders>
+ <serviceProvider>
+ <name>core</name>
+ <protocol>http</protocol>
+ <host>${APP_URL}</host>
+ <port>${APP_PORT}</port>
+ <path>/</path>
+ <pactBroker>
+ <url>${BROKER_URL}</url>
+ <authentication>
+ <username>pactadmin</username>
+ <password>pactadmin</password>
+ </authentication>
+ </pactBroker>
+ </serviceProvider>
+ </serviceProviders>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>com.github.kongchen</groupId>
+ <artifactId>swagger-maven-plugin</artifactId>
+ <version>3.1.5</version>
+ <configuration>
+ <apiSources>
+ <apiSource>
+ <locations>
+ <location>org.onap.optf.cmso.topology.service.rs</location>
+ </locations>
+ <basePath>/topology</basePath>
+ <info>
+ <title>${project.artifactId}</title>
+ <version>${project.version}</version>
+ </info>
+ <swaggerDirectory>${swagger.directory}</swaggerDirectory>
+ </apiSource>
+ </apiSources>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>compile</phase>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.groovy.maven</groupId>
+ <artifactId>gmaven-plugin</artifactId>
+ <version>1.0</version>
+ <executions>
+ <execution>
+ <phase>validate</phase>
+ <goals>
+ <goal>execute</goal>
+ </goals>
+ <configuration>
+ <source>${project.basedir}/src/main/script/TagVersion.groovy</source>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <artifactId>exec-maven-plugin</artifactId>
+ <groupId>org.codehaus.mojo</groupId>
+ </plugin>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <version>${spring.boot.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>repackage</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>0.26.0</version>
+ <configuration>
+ <verbose>true</verbose>
+ <apiVersion>1.23</apiVersion>
+ <images>
+ <image>
+ <name>onap/optf-cmso-tciketmgt</name>
+ <alias>onap-optf-cmso-tciketmgt</alias>
+ <build>
+ <cleanup>true</cleanup>
+ <tags>
+ <tag>latest</tag>
+ <tag>${project.docker.latesttagtimestamp.version}</tag>
+ <tag>${project.docker.latesttag.version}</tag>
+ </tags>
+ <dockerFile>${project.basedir}/src/main/docker/Dockerfile</dockerFile>
+ <assembly>
+ <descriptor>${project.basedir}/src/main/docker/assembly/cmso-files.xml</descriptor>
+ <name>onap-cmso-topology</name>
+ </assembly>
+ </build>
+ </image>
+ </images>
+ </configuration>
+ <executions>
+ <execution>
+ <id>generate-images</id>
+ <phase>install</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>push-images</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>build</goal>
+ <goal>push</goal>
+ </goals>
+ <configuration>
+ <image>onap/optf-cmso-topology:%l</image>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <!-- mention the logback.xml location through system property or environment
+ variable to edit logback.xml at run time -->
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>etc/config</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>${basedir}/truststore</directory>
+ <targetPath>${basedir}/target/truststore</targetPath>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>${basedir}/bin</directory>
+ <targetPath>${basedir}/target/bin</targetPath>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>${basedir}/data</directory>
+ <targetPath>${basedir}/target/data</targetPath>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ </resources>
+ <pluginManagement>
+ <plugins>
+ <!--This plugin's configuration is used to store Eclipse m2e settings
+ only. It has no influence on the Maven build itself. -->
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>
+ com.github.kongchen
+ </groupId>
+ <artifactId>
+ swagger-maven-plugin
+ </artifactId>
+ <versionRange>
+ [3.1.5]
+ </versionRange>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <profiles>
+ <profile>
+ <id>snapshot</id>
+ <activation>
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <properties>
+ <versionSuffix>-${build.number}-${release-tag}</versionSuffix>
+ </properties>
+ </profile>
+ <profile>
+ <id>next-stable</id>
+ <properties>
+ <versionSuffix>-${release-tag}</versionSuffix>
+ </properties>
+ </profile>
+ <profile>
+ <id>last-stable</id>
+ <properties>
+ <versionSuffix>-${release-tag}</versionSuffix>
+ </properties>
+ </profile>
+ </profiles>
+</project>
diff --git a/cmso-topology/src/main/docker/Dockerfile b/cmso-topology/src/main/docker/Dockerfile
new file mode 100644
index 0000000..4c663b4
--- /dev/null
+++ b/cmso-topology/src/main/docker/Dockerfile
@@ -0,0 +1,33 @@
+FROM ubuntu:16.04
+
+MAINTAINER "The Onap Team"
+LABEL Description="This image contains ubuntu 16.04 with the openjdk installed" Version="16.04-8"
+ENV APP_HOME=/opt/app/cmso
+ARG http_proxy
+ARG https_proxy
+ENV HTTP_PROXY=$http_proxy
+ENV HTTPS_PROXY=$https_proxy
+ENV http_proxy=$HTTP_PROXY
+ENV https_proxy=$HTTPS_PROXY
+
+RUN test -n "$http_proxy" && echo "Acquire::Proxy \"http://$http_proxy\";" > /etc/apt/apt.conf.d/02proxy || true && \
+ apt-get update && \
+ apt-get -y dist-upgrade && \
+ apt-get install -y openjdk-8-jre-headless
+
+COPY onap-cmso-topology/cmso-topology.jar ${APP_HOME}/app.jar
+
+VOLUME /share/etc
+VOLUME /share/logs
+VOLUME /share/debug-logs
+
+COPY onap-cmso-topology/startService.sh ${APP_HOME}/startService.sh
+COPY onap-cmso-topology/data ${APP_HOME}/data
+
+RUN chmod 700 ${APP_HOME}/startService.sh
+RUN ln -s /share/etc ${APP_HOME}/etc
+RUN ln -s /share/logs ${APP_HOME}/logs
+RUN ln -s /share/debug-logs ${APP_HOME}/debug-logs
+
+WORKDIR ${APP_HOME}
+ENTRYPOINT ./startService.sh
diff --git a/cmso-topology/src/main/docker/assembly/cmso-files.xml b/cmso-topology/src/main/docker/assembly/cmso-files.xml
new file mode 100644
index 0000000..8d6b2f3
--- /dev/null
+++ b/cmso-topology/src/main/docker/assembly/cmso-files.xml
@@ -0,0 +1,64 @@
+<!-- ============LICENSE_START=======================================================
+ CMSO ================================================================================
+ Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. ================================================================================
+ Licensed 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. ============LICENSE_END========================================================= -->
+
+<assembly
+ xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd">
+ <id>cmso-files</id>
+
+ <formats>
+ <format>tar.gz</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+
+
+ <fileSets>
+ <!-- include config files -->
+ <fileSet>
+ <includes>
+ <include>${project.build.finalName}.jar</include>
+ </includes>
+ <directory>${project.build.directory}</directory>
+ <outputDirectory>/</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <includes>
+ <include>**</include>
+ </includes>
+ <directory>src/main/docker/extra-files</directory>
+ <outputDirectory>/</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <includes>
+ <include>**</include>
+ </includes>
+ <directory>data</directory>
+ <outputDirectory>/data</outputDirectory>
+ </fileSet>
+ <fileSet>
+ <directory>${project.basedir}/src/main/resources</directory>
+ <outputDirectory>./resources</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <directory>${project.basedir}/etc/config</directory>
+ <outputDirectory>./</outputDirectory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </fileSet>
+
+ </fileSets>
+
+</assembly>
diff --git a/cmso-topology/src/main/docker/extra-files/startService.sh b/cmso-topology/src/main/docker/extra-files/startService.sh
new file mode 100644
index 0000000..199c637
--- /dev/null
+++ b/cmso-topology/src/main/docker/extra-files/startService.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+VM_ARGS="${VM_ARGS} -Dserver.local.startpath=${RESOURCES_HOME}"
+
+echo "VM_ARGS="${VM_ARGS}
+
+java -Djava.security.egd=file:/dev/./urandom ${VM_ARGS} -Xms256m -Xmx1024m -jar ./app.jar
diff --git a/cmso-topology/src/main/java/org/onap/observations/Mdc.java b/cmso-topology/src/main/java/org/onap/observations/Mdc.java
new file mode 100644
index 0000000..5c2bd5f
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/Mdc.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import static com.att.eelf.configuration.Configuration.MDC_BEGIN_TIMESTAMP;
+import static com.att.eelf.configuration.Configuration.MDC_END_TIMESTAMP;
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+import static com.att.eelf.configuration.Configuration.MDC_PARTNER_NAME;
+import static com.att.eelf.configuration.Configuration.MDC_REMOTE_HOST;
+import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_CODE;
+import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_DESC;
+import static com.att.eelf.configuration.Configuration.MDC_STATUS_CODE;
+import static com.att.eelf.configuration.Configuration.MDC_TARGET_ENTITY;
+import static com.att.eelf.configuration.Configuration.MDC_TARGET_SERVICE_NAME;
+
+import com.att.eelf.utils.Stopwatch;
+import java.net.URI;
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response.StatusType;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.slf4j.MDC;
+
+/**
+ * ECOMP EELF logging MDC fields not defined in the MDC Configuration (i.e. MDC_ALERT_SEVERITY)
+ **/
+public class Mdc {
+
+ /** The Constant SERVICE_NAME. */
+ public static final String SERVICE_NAME = "CSS-Scheduler";
+
+ /**
+ * The Enum Enum.
+ */
+ public enum Enum {
+ // BeginTimestamp,
+ // EndTimeStamp,
+ // RequestId,
+ // ServiceInstanceId,
+ VirtualServerName,
+ // ServiceName,
+ // PartnerName,
+ // StatusCOde,
+ // ResponseCode,
+ // ResponseDescription,
+ // InstanceUUID,
+ // AlertSeverity,
+ // ServerIPAddress,
+ // ElapsedTime,
+ // ServerFQDN,
+ // RemoteHost,
+ ClassName,
+ Unused,
+ // ProcessKey,
+ CustomField1,
+ CustomField2,
+ CustomField3,
+ CustomField4,
+ // TargetVirtualEntity,
+ // TargetEntity,
+ // TargetServiceName,
+ ErrorCode,
+ ErrorDescription,
+ Timer,
+ }
+
+ /**
+ * Gets the caller.
+ *
+ * @param back the back
+ * @return the caller
+ */
+ public static String getCaller(int back) {
+ StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
+ return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName();
+ }
+
+ /**
+ * Sets the caller.
+ *
+ * @param back the new caller
+ */
+ public static void setCaller(int back) {
+ String caller = MDC.get(Enum.ClassName.name());
+ if (caller == null) {
+ MDC.put(Enum.ClassName.name(), getCaller(back));
+ }
+ }
+
+ /**
+ * Sets the observation.
+ *
+ * @param obs the new observation
+ */
+ public static void setObservation(ObservationInterface obs) {
+ MDC.put(Enum.CustomField4.name(), obs.name());
+ }
+
+ /**
+ * Clear caller.
+ */
+ public static void clearCaller() {
+ MDC.remove(Enum.ClassName.name());
+ }
+
+ /**
+ * Save.
+ *
+ * @return the map
+ */
+ public static Map<String, String> save() {
+ Map<String, String> save = MDC.getCopyOfContextMap();
+ return save;
+ }
+
+ /**
+ * Restore.
+ *
+ * @param mdcSave the mdc save
+ */
+ public static void restore(Map<String, String> mdcSave) {
+ MDC.clear();
+ for (String name : mdcSave.keySet()) {
+ MDC.put(name, mdcSave.get(name));
+ }
+ }
+
+
+
+ /**
+ * Sets the request id if not set.
+ *
+ * @param requestId the new request id if not set
+ */
+ public static void setRequestIdIfNotSet(String requestId) {
+ if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals("")) {
+ setRequestId(requestId);
+ }
+ }
+
+ /**
+ * Sets the request id.
+ *
+ * @param requestId the new request id
+ */
+ public static void setRequestId(String requestId) {
+ MDC.put(MDC_KEY_REQUEST_ID, requestId);
+ }
+
+ /**
+ * Metric start.
+ *
+ * @param requestContext the request context
+ */
+ public static void metricStart(ClientRequestContext requestContext) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setPartnerTargetFromUri(requestContext.getUri());
+ }
+
+ /**
+ * Metric end.
+ *
+ * @param response the response
+ */
+ public static void metricEnd(ClientResponseContext response) {
+
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ /**
+ * Audit start.
+ *
+ * @param requestContext the request context
+ * @param servletRequest the servlet request
+ */
+ public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost());
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId != null) {
+ setRequestId(transactionId);
+ } else {
+ setRequestId(UUID.randomUUID().toString());
+ }
+
+ }
+
+ /**
+ * Audit end.
+ *
+ * @param requestContext the request context
+ * @param response the response
+ */
+ public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response) {
+ Date now = new Date();
+ // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now));
+ MDC.put(Enum.ClassName.name(), getCaller(4));
+
+ setResponseInfo(response.getStatusInfo());
+
+ }
+
+ private static void setResponseInfo(StatusType statusInfo) {
+ Integer status = statusInfo.getStatusCode();
+ String completed = "ERROR";
+ if (status >= 200 && status < 300) {
+ completed = "COMPLETE";
+ }
+ MDC.put(MDC_RESPONSE_CODE, status.toString());
+ MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase());
+ MDC.put(MDC_STATUS_CODE, completed);
+ }
+
+ /**
+ * Sets the event.
+ *
+ * @param requestId the new event
+ */
+ public static void setEvent(String requestId) {
+ MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date()));
+ MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP));
+ setRequestId(requestId);
+ }
+
+ private static void setPartnerTargetFromUri(URI uri) {
+ try {
+ MDC.put(MDC_PARTNER_NAME, uri.getHost());
+ MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort());
+ MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath());
+ } catch (Exception e) {
+ MDC.put(MDC_PARTNER_NAME, "UNKNOWN");
+ MDC.put(MDC_TARGET_ENTITY, "UNKNOWN");
+ MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN");
+ }
+ }
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java b/cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java
new file mode 100644
index 0000000..fe6cea2
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * The Class MessageHeaders.
+ */
+public class MessageHeaders {
+
+ /**
+ * The Enum HeadersEnum.
+ */
+ public enum HeadersEnum {
+ UNDEFINED("UNDEFINED"),
+ TransactionID("X-TransactionId"),
+ FromAppID("X-FromAppId"),
+ MinorVersion("X-MinorVersion"),
+ PatchVersion("X-PatchVersion"),
+ LatestVersion("X-LatestVersion"),;
+
+ private final String text;
+
+ private HeadersEnum(String text) {
+ this.text = text;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ return text;
+ }
+ }
+
+ /** The Constant supportedMajorVersions. */
+ public static final Map<String, String> supportedMajorVersions = new HashMap<String, String>();
+
+ static {
+ supportedMajorVersions.put("v1", "0");
+ supportedMajorVersions.put("v2", "0");
+ }
+
+ /** The Constant supportedMajorMinorVersions. */
+ public static final Set<String> supportedMajorMinorVersions = new HashSet<String>();
+
+ static {
+ supportedMajorMinorVersions.add("v1.0");
+ supportedMajorMinorVersions.add("v2.0");
+ }
+
+ /** The Constant latestVersion. */
+ public static final String latestVersion = "2.0.0";
+
+ /** The Constant patchVersion. */
+ public static final String patchVersion = "0";
+
+ /**
+ * From string.
+ *
+ * @param text the text
+ * @return the headers enum
+ */
+ public static HeadersEnum fromString(String text) {
+ for (HeadersEnum e : HeadersEnum.values()) {
+ if (e.text.equals(text)) {
+ return e;
+ }
+ }
+ return HeadersEnum.UNDEFINED;
+ }
+
+ /**
+ * Gets the patch version.
+ *
+ * @return the patch version
+ */
+ public static String getPatchVersion() {
+ return patchVersion;
+ }
+
+ /**
+ * Gets the latest version.
+ *
+ * @return the latest version
+ */
+ public static String getLatestVersion() {
+ return latestVersion;
+ }
+
+ /**
+ * Validate major version.
+ *
+ * @param major the major
+ * @return true, if successful
+ */
+ public static boolean validateMajorVersion(String major) {
+ String majorKey = major.toLowerCase();
+ if (!supportedMajorVersions.containsKey(majorKey)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Validate major minor version.
+ *
+ * @param major the major
+ * @param minor the minor
+ * @return true, if successful
+ */
+ public static boolean validateMajorMinorVersion(String major, String minor) {
+ String majorKey = major.toLowerCase();
+ if (!supportedMajorVersions.containsKey(majorKey)) {
+ return false;
+ }
+
+ if (minor != null) {
+ String majorMinorKey = majorKey + "." + minor;
+ return supportedMajorMinorVersions.contains(majorMinorKey);
+ }
+ return true;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/observations/Observation.java b/cmso-topology/src/main/java/org/onap/observations/Observation.java
new file mode 100644
index 0000000..e1ec30c
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/Observation.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.apache.log4j.Level;
+import org.onap.optf.cmso.topology.Application;
+
+
+/**
+ * The Class Observation.
+ */
+public class Observation {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+ private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
+ private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param execpt the e
+ * @param arguments the arguments
+ */
+ // *************************************************************************************************
+ public static void report(ObservationInterface obs, Exception execpt, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, execpt, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, execpt, arguments);
+ }
+ Level lev = obs.getLevel();
+ switch (lev.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, execpt, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.trace(obs, execpt, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, execpt, arguments);
+ break;
+ default:
+ log.info(obs, execpt, arguments);
+ }
+ Mdc.clearCaller();
+ }
+
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param arguments the arguments
+ */
+ public static void report(ObservationInterface obs, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, arguments);
+ }
+ Level levl = obs.getLevel();
+ switch (levl.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.debug(obs, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, arguments);
+ break;
+ default:
+ log.info(obs, arguments);
+ }
+ Mdc.clearCaller();
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java b/cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java
new file mode 100644
index 0000000..0dce93d
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+public interface ObservationInterface extends EELFResolvableErrorEnum {
+ public Enum<?> getValue();
+
+ public Level getLevel();
+
+ public String getMessage();
+
+ public Status getStatus();
+
+ public String getDomain();
+
+ public String name();
+
+ public Boolean getAudit();
+
+ public Boolean getMetric();
+}
diff --git a/cmso-topology/src/main/java/org/onap/observations/ObservationObject.java b/cmso-topology/src/main/java/org/onap/observations/ObservationObject.java
new file mode 100644
index 0000000..f1c1277
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/ObservationObject.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+
+/**
+ * The Class ObservationObject.
+ */
+public class ObservationObject implements ObservationInterface {
+
+ // *************************************************************************************************
+ // Interface class that matches the ObservationInteface pattern
+ // This will be used in case we decide to provide external overrides and we need to instantiate
+ // For now, we'll just use the Enum itself.
+ //
+ //
+ private Enum<?> value = null;
+
+ private Level level = null;
+ private String message = null;
+ private Status status = null;
+ private String domain = null;
+ private Boolean metric = false;
+ private Boolean audit = false;
+
+ /**
+ * Instantiates a new observation object.
+ *
+ * @param obs the o
+ */
+ public ObservationObject(ObservationInterface obs) {
+ this.value = obs.getValue();
+ this.level = obs.getLevel();
+ this.message = obs.getMessage();
+ this.status = obs.getStatus();
+ this.domain = obs.getDomain();
+ this.metric = obs.getMetric();
+ this.audit = obs.getAudit();
+
+ }
+
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ @Override
+ public Enum<?> getValue() {
+ return value;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @return the message
+ */
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
+ @Override
+ public String getDomain() {
+ return domain;
+ }
+
+ /**
+ * Gets the level.
+ *
+ * @return the level
+ */
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ /**
+ * Name.
+ *
+ * @return the string
+ */
+ @Override
+ public String name() {
+ return value.name();
+ }
+
+ /**
+ * Gets the audit.
+ *
+ * @return the audit
+ */
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ /**
+ * Gets the metric.
+ *
+ * @return the metric
+ */
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @param arguments the arguments
+ * @return the message
+ */
+ public String getMessagef(String... arguments) {
+ return EELFResourceManager.format((EELFResolvableErrorEnum) value, arguments);
+ }
+
+ /**
+ * Sets the value.
+ *
+ * @param value the new value
+ */
+ public void setValue(Enum<?> value) {
+ this.value = value;
+ }
+
+ /**
+ * Sets the level.
+ *
+ * @param level the new level
+ */
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ /**
+ * Sets the message.
+ *
+ * @param message the new message
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java b/cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java
new file mode 100644
index 0000000..7e15760
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+
+public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor {
+ // TODO tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ // proeprties files.
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ String pwd = environment.getProperty("cmso.database.password");
+ if (pwd != null) {
+ pwd = PropertiesManagement.getDecryptedValue(pwd);
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("spring.datasource.password", pwd);
+ MapPropertySource propertySource = new MapPropertySource("abc", map);
+ MutablePropertySources proeprtySources = environment.getPropertySources();
+ proeprtySources.addLast(propertySource);
+ }
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
new file mode 100644
index 0000000..e2602d0
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aaf.cadi.CadiWrap;
+import org.onap.aaf.cadi.Permission;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+/**
+ * AAF authorization filter.
+ */
+
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafAuthorizationFilter extends OrderedRequestContextFilter {
+
+ @Autowired
+ AafUserRoleProperties userRoleProperties;
+
+ /**
+ * Instantiates a new aaf authorization filter.
+ */
+ public AafAuthorizationFilter() {
+ this.setOrder(FilterPriority.AAF_AUTHORIZATION.getPriority());
+
+
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ try {
+ if (request instanceof CadiWrap) {
+ CadiWrap cw = (CadiWrap) request;
+ List<Permission> perms = cw.getPermissions(cw.getUserPrincipal());
+ if (userRoleProperties.processPermissions(request, perms)) {
+ filterChain.doFilter(request, response);
+ } else {
+ Observation.report(LogMessages.UNAUTHORIZED);
+ ResponseFormatter.errorResponse(request, response, new CmsoException(
+ LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
+ } else {
+ throw new Exception();
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ ResponseFormatter.errorResponse(request, response,
+ new CmsoException(LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
new file mode 100644
index 0000000..e396264
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import java.util.Properties;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.filter.CadiFilter;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.topology.Application;
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+/**
+ * AAF authentication filter.
+ */
+
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafFilter extends OrderedRequestContextFilter {
+
+ private final CadiFilter cadiFilter;
+
+ /**
+ * Instantiates a new aaf filter.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws ServletException the servlet exception
+ */
+ public AafFilter() throws IOException, ServletException {
+ Properties cadiProperties = new Properties();
+ cadiProperties.load(Application.class.getClassLoader().getResourceAsStream("cadi.properties"));
+ cadiFilter = new CadiFilter(new PropAccess(cadiProperties));
+ this.setOrder(FilterPriority.AAF_AUTHENTICATION.getPriority());
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ cadiFilter.doFilter(request, response, filterChain);
+ if (response.getStatus() == 401) {
+ Observation.report(LogMessages.UNAUTHENTICATED);
+ ResponseFormatter.errorResponse(request, response,
+ new CmsoException(LogMessages.UNAUTHENTICATED.getStatus(),
+ LogMessages.UNAUTHENTICATED, ""));
+ }
+ }
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
new file mode 100644
index 0000000..db58156
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+
+
+/**
+ * The Class AafPerm.
+ */
+public class AafPerm {
+ private String type;
+ private String instance;
+ private String action;
+ private Set<String> actions = new HashSet<>();
+
+ /**
+ * Gets the action.
+ *
+ * @return the action
+ */
+ public String getAction() {
+ return action;
+ }
+
+ /**
+ * Sets the action.
+ *
+ * @param action the new action
+ */
+ public void setAction(String action) {
+ this.action = action;
+ String[] list = action.split(",");
+ for (String a : list) {
+ actions.add(a);
+ }
+ }
+
+ /**
+ * Gets the type.
+ *
+ * @return the type
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * Sets the type.
+ *
+ * @param type the new type
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * Gets the single instance of AafPerm.
+ *
+ * @return single instance of AafPerm
+ */
+ public String getInstance() {
+ return instance;
+ }
+
+ /**
+ * Sets the instance.
+ *
+ * @param instance the new instance
+ */
+ public void setInstance(String instance) {
+ this.instance = instance;
+ }
+
+ /**
+ * Gets the actions.
+ *
+ * @return the actions
+ */
+ public Set<String> getActions() {
+ return actions;
+ }
+
+ /**
+ * Sets the actions.
+ *
+ * @param actions the new actions
+ */
+ public void setActions(Set<String> actions) {
+ this.actions = actions;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param userPerm the user perm
+ * @return true, if successful
+ */
+ public boolean matches(AAFPermission userPerm) {
+ if (type.equals(userPerm.getType())) {
+ if (userPerm.getInstance().equals("*") || instance.equals("*") || userPerm.getInstance().equals(instance)) {
+ for (String userAction : userPerm.getAction().split(",")) {
+ if (userAction.equals("*") || actions.contains("*") || actions.contains(userAction)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
new file mode 100644
index 0000000..787d786
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+@ComponentScan("org.onap.optf")
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafSecurityConfig extends WebSecurityConfigurerAdapter {
+
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+
+ http.csrf().disable();
+
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
new file mode 100644
index 0000000..65decec
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The Class AafUserRole.
+ */
+public class AafUserRole {
+ private String url = "";
+ private String[] pathParts = {};
+ private String perm = "";
+ private String method = "";
+ private List<AafPerm> aafPerms = new ArrayList<>();
+
+ /**
+ * Instantiates a new aaf user role.
+ *
+ * @param url the url
+ * @param perm the perm
+ */
+ public AafUserRole(String url, String perm) {
+ this.setUrl(url);
+ this.setPerm(perm);
+ pathParts = url.split("\\/");
+
+ String[] perms = perm.split(",");
+ for (String p : perms) {
+ String[] parts = p.split(" ");
+ if (parts.length == 2) {
+ method = parts[1];
+ } else {
+ method = "ALL";
+ }
+
+ String[] list = parts[0].split("\\|");
+ if (list.length == 3) {
+ AafPerm aafPerm = new AafPerm();
+ aafPerm.setAction(list[2]);
+ aafPerm.setInstance(list[1]);
+ aafPerm.setType(list[0]);
+ aafPerms.add(aafPerm);
+ }
+ }
+ }
+
+ /**
+ * Gets the url.
+ *
+ * @return the url
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ /**
+ * Sets the url.
+ *
+ * @param url the new url
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * Gets the perm.
+ *
+ * @return the perm
+ */
+ public String getPerm() {
+ return perm;
+ }
+
+ /**
+ * Sets the perm.
+ *
+ * @param perm the new perm
+ */
+ public void setPerm(String perm) {
+ this.perm = perm;
+ }
+
+ /**
+ * Gets the aaf perms.
+ *
+ * @return the aaf perms
+ */
+ public List<AafPerm> getAafPerms() {
+ return aafPerms;
+ }
+
+ /**
+ * Sets the aaf perms.
+ *
+ * @param aafPerms the new aaf perms
+ */
+ public void setAafPerms(List<AafPerm> aafPerms) {
+ this.aafPerms = aafPerms;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param path the path
+ * @param matchMethod the match method
+ * @return true, if successful
+ */
+ public boolean matches(String path, String matchMethod) {
+ if (!this.method.equalsIgnoreCase("ALL") && !this.method.equals("*") && !this.method.equals(matchMethod)) {
+ return false;
+ }
+ List<String> inNodes = new ArrayList<>();
+ List<String> matchNodes = new ArrayList<>();
+ String[] pathList = path.split("\\/");
+ for (String n : pathList) {
+ inNodes.add(n);
+ }
+ for (String n : pathParts) {
+ matchNodes.add(n);
+ }
+
+ while (!inNodes.isEmpty() && !matchNodes.isEmpty()) {
+ String inNode = inNodes.remove(0);
+ String matchNode = matchNodes.get(0);
+ if (matchNode.equals(inNode) || matchNode.equals("*")) {
+ matchNodes.remove(0);
+ } else {
+ if (!matchNode.equals("**")) {
+ return false;
+ }
+ }
+ }
+
+ //
+ if (inNodes.isEmpty() && matchNodes.isEmpty()) {
+ return true;
+ }
+
+ // We have incoming nodes remaining, see if we can wildcard them
+ if (matchNodes.size() == 1) {
+ if (matchNodes.get(0).equals("**")) {
+ return true;
+ }
+ if (inNodes.size() == 1 && matchNodes.get(0).equals("*")) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
new file mode 100644
index 0000000..2d252f8
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class uses a properties file to map URL patterns/method to AAF Permissions (AafPerm).
+ *
+ * @author jf9860
+ *
+ */
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafUserRoleProperties {
+ @Autowired
+ Environment env;
+
+ private List<AafUserRole> list = new ArrayList<>();
+
+ /**
+ * Initialize permissions.
+ */
+ @PostConstruct
+ public void initializePermissions() {
+ String userRolePropertiesName =
+ env.getProperty("aaf.user.roles", "src/main/resources/aaf/AAFUserRoles.properties");
+ Properties props = new Properties();
+ try {
+ props.load(new FileInputStream(new File(userRolePropertiesName)));
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ for (Object url : props.keySet()) {
+ Object value = props.get(url);
+ list.add(new AafUserRole((String) url, (String) value));
+ }
+ }
+
+ /**
+ * Gets the for url method.
+ *
+ * @param url the url
+ * @param method the method
+ * @return the for url method
+ */
+ public List<AafUserRole> getForUrlMethod(String url, String method) {
+ List<AafUserRole> userRoleList = new ArrayList<>();
+ for (AafUserRole aur : list) {
+ if (aur.matches(url, method)) {
+ userRoleList.add(aur);
+ }
+ }
+ return userRoleList;
+ }
+
+ /**
+ * Process permissions.
+ *
+ * @param request the request
+ * @param userPerms the user perms
+ * @return true, if successful
+ */
+ public boolean processPermissions(HttpServletRequest request, List<Permission> userPerms) {
+ try {
+ // Get list of perms that match incoming URL. May be more than 1...
+ // Users perms must match all that match URL
+ List<AafUserRole> perms = getForUrlMethod(request.getRequestURI(), request.getMethod());
+ int tested = 0;
+ int passed = 0;
+ for (AafUserRole perm : perms) {
+ for (AafPerm test : perm.getAafPerms()) {
+ tested++;
+ for (Permission userPerm : userPerms) {
+
+ if (test.matches((AAFPermission) userPerm)) {
+ passed++;
+ break;
+ }
+ }
+ }
+ }
+ // All permissions must be OK
+ if (tested > 0 && tested == passed) {
+ return true;
+ } else {
+ return false;
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return false;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
new file mode 100644
index 0000000..bfafbd8
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import org.springframework.core.Ordered;
+
+public enum FilterPriority {
+ AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE), AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1);
+ private final int priority;
+
+ FilterPriority(final int ppri) {
+ priority = ppri;
+ }
+
+ public int getPriority() {
+ return priority;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
new file mode 100644
index 0000000..518814e
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+
+class ResponseFormatter {
+
+
+ static void errorResponse(HttpServletRequest request, HttpServletResponse response, CmsoException error)
+ throws IOException {
+ response.setStatus(error.getStatus().getStatusCode());
+ response.getWriter().write(error.getRequestError().toString());
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
new file mode 100644
index 0000000..750e109
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.xml.bind.DatatypeConverter;
+
+public class BasicAuthenticatorFilter implements ClientRequestFilter {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(BasicAuthenticatorFilter.class);
+ private final String user;
+ private final String password;
+
+ /**
+ * Instantiates a new basic authenticator filter.
+ *
+ * @param user the user
+ * @param password the password
+ */
+ public BasicAuthenticatorFilter(String user, String password) {
+ this.user = user;
+ this.password = password;
+ log.info("user: " + user + " pass:" + password);
+ }
+
+ @Override
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+ final String basicAuthentication = getBasicAuthentication();
+ headers.add("Authorization", basicAuthentication);
+ }
+
+ private String getBasicAuthentication() {
+ String token = this.user + ":" + this.password;
+ try {
+ return "Basic " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException ex) {
+ throw new IllegalStateException("Cannot encode with UTF-8", ex);
+ }
+ }
+
+ /**
+ * Gets the user.
+ *
+ * @param request the request
+ * @return the user
+ */
+ public static String getUser(HttpServletRequest request) {
+ String user = "";
+ String header = request.getHeader("Authorization");
+ if (header != null) {
+ String[] auth = header.split("Basic ");
+ if (auth.length == 2) {
+ String token = getToken(auth[1]);
+ if (token.contains(":")) {
+ String[] tokens = token.split(":");
+ user = tokens[0];
+ }
+ }
+ }
+ return user;
+ }
+
+ private static String getToken(String auth) {
+ try {
+ String token = new String(DatatypeConverter.parseBase64Binary(auth));
+ return token;
+ } catch (Exception e) {
+ return auth;
+ }
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java
new file mode 100644
index 0000000..f644aca
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CmsoRequestError implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @JsonProperty
+ RequestError requestError;
+
+ public CmsoRequestError(String messageId, String text, List<String> variables) {
+ requestError = new RequestError(messageId, text, variables);
+ }
+
+ public CmsoRequestError(String messageId, String text) {
+ requestError = new RequestError(messageId, text, new ArrayList<String>());
+ }
+
+ public class RequestError {
+ @JsonProperty
+ private String messageId;
+ @JsonProperty
+ private String text;
+ @JsonProperty
+ private List<String> variables;
+
+ private RequestError(String messageId, String text, List<String> variables) {
+ this.messageId = "Scheduler." + messageId;
+ this.text = text;
+ this.variables = variables;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(messageId).append(":").append(text).append(":").append(variables);
+ return sb.toString();
+
+ }
+ }
+
+ @Override
+ public String toString() {
+ return requestError.toString();
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
new file mode 100644
index 0000000..1993b82
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PropertiesManagement {
+
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+
+ private static final String algorithm = "AES";
+ private static final String cipherMode = "CBC";
+ private static final String paddingScheme = "PKCS5Padding";
+ private static final String transformation = algorithm + "/" + cipherMode + "/" + paddingScheme;
+
+ private static final String initVector = "ONAPCMSOVECTORIV"; // 16 bytes IV
+
+ @Autowired
+ Environment env;
+
+ /**
+ * Gets the property.
+ *
+ * @param key the key
+ * @param defaultValue the default value
+ * @return the property
+ */
+ public String getProperty(String key, String defaultValue) {
+ String value = env.getProperty(key, defaultValue);
+ value = getDecryptedValue(value);
+ return value;
+ }
+
+ /**
+ * Gets the decrypted value.
+ *
+ * @param value the value
+ * @return the decrypted value
+ */
+ public static String getDecryptedValue(String value) {
+ if (value.startsWith("enc:")) {
+ String secret = getSecret();
+ value = decrypt(secret, initVector, value.substring(4));
+ }
+ return value;
+ }
+
+ /**
+ * Gets the encrypted value.
+ *
+ * @param value the value
+ * @return the encrypted value
+ */
+ public static String getEncryptedValue(String value) {
+ String secret = getSecret();
+ value = encrypt(secret, initVector, value);
+ return value;
+ }
+
+ private static final String encrypt(String key, String initVector, String value) {
+ try {
+ IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
+ SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
+ Cipher cipher = Cipher.getInstance(transformation);
+ cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
+ byte[] encrypted = cipher.doFinal(value.getBytes());
+ return Base64.encodeBase64String(encrypted);
+ } catch (Exception ex) {
+ errors.error("Unexpected exception {0}", ex.getMessage());
+ debug.debug("Unexpected exception", ex);
+ }
+
+ return null;
+ }
+
+ private static final String decrypt(String key, String initVector, String encrypted) {
+ try {
+ IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
+ SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
+ Cipher cipher = Cipher.getInstance(transformation);
+ cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
+ byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
+ return new String(original);
+ } catch (Exception ex) {
+ errors.error("Unexpected exception {0}", ex.getMessage());
+ debug.debug("Unexpected exception", ex);
+ }
+ return null;
+ }
+
+ private static String getSecret() {
+ return "ONAPCMSOSECRETIV";
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java
new file mode 100644
index 0000000..41476ee
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.common.exceptions;
+
+import com.att.eelf.i18n.EELFResourceManager;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.Response.Status;
+import org.onap.observations.ObservationInterface;
+import org.onap.optf.cmso.common.CmsoRequestError;
+
+public class CmsoException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ protected CmsoRequestError requestError = null;
+ private List<String> variables = new ArrayList<String>();
+ protected ObservationInterface messageCode;
+ protected Status status;
+
+ /**
+ * Instantiates a new cmso exception.
+ *
+ * @param status the status
+ * @param messageCode the message code
+ * @param args the args
+ */
+ public CmsoException(Status status, ObservationInterface messageCode, String... args) {
+ super(EELFResourceManager.format(messageCode, args));
+ this.status = status;
+ this.messageCode = messageCode;
+ for (String arg : args) {
+ variables.add(arg);
+ }
+ requestError = new CmsoRequestError(messageCode.name(), getMessage(), variables);
+ }
+
+ public Status getStatus() {
+ return status;
+ }
+
+ public ObservationInterface getMessageCode() {
+ return messageCode;
+ }
+
+ public String[] getVariables() {
+ return variables.toArray(new String[variables.size()]);
+ }
+
+ public CmsoRequestError getRequestError() {
+ return requestError;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java
new file mode 100644
index 0000000..7223166
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology;
+
+import com.att.eelf.configuration.Configuration;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.net.InetAddress;
+import java.util.TimeZone;
+import javax.annotation.PostConstruct;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.slf4j.MDC;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"org.onap.optf.cmso"})
+@EnableAsync
+
+@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
+public class Application extends SpringBootServletInitializer {
+
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(Application.class);
+ }
+
+ @PostConstruct
+ void started() {
+ // Make sure all datetimes are stored in UTC format.
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ }
+
+ public static void main(String[] args) {
+ initMdcData();
+ SpringApplication.run(Application.class, args);
+ }
+
+ protected static void initMdcData() {
+ MDC.clear();
+ try {
+ MDC.put(Configuration.MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
+ MDC.put("hostname", InetAddress.getLocalHost().getCanonicalHostName());
+ MDC.put("serviceName", System.getProperty("info.build.artifact"));
+ MDC.put("version", System.getProperty("info.build.version"));
+ MDC.put(Configuration.MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ log.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+
+ @Bean
+ public ServletWebServerFactory servletContainer() {
+ TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
+ return tomcat;
+ }
+
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java
new file mode 100644
index 0000000..3017222
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+
+
+@Configuration
+@PropertySources({@PropertySource("file:etc/config/topology.properties"),})
+public class ApplicationPropertiesFiles {
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java
new file mode 100644
index 0000000..511033d
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2019 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology;
+
+import java.util.ArrayList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+@Component
+@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
+
+public class AuthProvider implements AuthenticationProvider {
+
+ @Autowired
+ Environment env;
+
+ @Override
+ public Authentication authenticate(Authentication authentication) {
+ String name = authentication.getName();
+ String password = authentication.getCredentials().toString();
+ // TODO check credentials until we enable AAF
+ return new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>());
+ }
+
+ @Override
+ public boolean supports(Class<?> authentication) {
+ return authentication.equals(UsernamePasswordAuthenticationToken.class);
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java
new file mode 100644
index 0000000..e8d80bb
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+
+public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor {
+ // TODO tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ // proeprties files.
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ String pwd = environment.getProperty("cmso.database.password");
+ if (pwd != null) {
+ pwd = PropertiesManagement.getDecryptedValue(pwd);
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("spring.datasource.password", pwd);
+ MapPropertySource propertySource = new MapPropertySource("abc", map);
+ MutablePropertySources proeprtySources = environment.getPropertySources();
+ proeprtySources.addLast(propertySource);
+ }
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java
new file mode 100644
index 0000000..4a46505
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import java.util.logging.Logger;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.logging.LoggingFeature;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.servlet.ServletProperties;
+import org.onap.optf.cmso.topology.filters.CmsoContainerFilters;
+import org.onap.optf.cmso.topology.service.rs.AdminToolImpl;
+import org.onap.optf.cmso.topology.service.rs.HealthCheckImpl;
+import org.onap.optf.cmso.topology.service.rs.TopologyInterfaceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+@Component
+@ApplicationPath("/")
+public class JerseyConfiguration extends ResourceConfig {
+ private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());
+
+ /**
+ * Object mapper.
+ *
+ * @return the object mapper
+ */
+ @Bean
+ @Primary
+ public ObjectMapper objectMapper() {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
+ objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
+ return objectMapper;
+ }
+
+ /**
+ * Instantiates a new jersey configuration.
+ */
+ @Autowired
+ public JerseyConfiguration( /* LogRequestFilter lrf */ ) {
+ register(HealthCheckImpl.class);
+ register(AdminToolImpl.class);
+ register(TopologyInterfaceImpl.class);
+ property(ServletProperties.FILTER_FORWARD_ON_404, true);
+ // TODO: ONAP Conversion identify appropriate ONAP logging filters if any
+ // register(lrf, 6001);
+ // register(LogResponseFilter.class, 6004);
+
+ // TODO: Examine which logging features to enable
+ register(new LoggingFeature(log));
+ register(CmsoContainerFilters.class);
+ }
+
+ /**
+ * Jersey client.
+ *
+ * @return the client
+ */
+ @Bean
+ public Client jerseyClient() {
+ ClientConfig client = new ClientConfig();
+
+ // TODO: ONAP Conversion identify appropriate ONAP logging filters if any
+ // client.register(TransactionIdRequestFilter.class);
+ // client.register(TransactionIdResponseFilter.class);
+ // client.register(DateTimeParamConverterProvider.class);
+
+ return ClientBuilder.newClient(client);
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java
new file mode 100644
index 0000000..dfd44a6
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+@ComponentScan("org.onap.optf")
+@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Autowired
+ private AuthProvider authProvider;
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+
+ auth.authenticationProvider(authProvider);
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+
+ http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
+
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java
new file mode 100644
index 0000000..4e6455c
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology;
+
+public class SpringProfiles {
+
+ public static final String AAF_AUTHENTICATION = "aaf-auth";
+ public static final String PROPRIETARY__AUTHENTICATION = "proprietary-auth";
+
+ private SpringProfiles() {}
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java
new file mode 100644
index 0000000..8915653
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.common;
+
+public enum Availability {
+ full, partial, unavailable
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java
new file mode 100644
index 0000000..4ce4776
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.common;
+
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+import org.onap.observations.ObservationInterface;
+
+public enum LogMessages implements ObservationInterface {
+
+ FETCH_TICKET("Fetch ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ CREATE_TICKET("Create Ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ CANCEL_TICKET("Cancel ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ UPDATE_TICKET("Update ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ GET_CURRENT_TOPOLOGY("Get active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ SEARCH_TICKETS("Search tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+
+ TICKET_NOT_FOUND("Ticket not found id={0}", Status.NOT_FOUND, Level.INFO),
+ INVALID_ATTRIBUTE("Invalid attribute {0}={1}", Status.BAD_REQUEST, Level.INFO),
+ MISSING_REQUIRED_ATTRIBUTE("Missing required attribute '{0}'", Status.BAD_REQUEST, Level.INFO),
+ INVALID_REQUEST("The input data structure is incorrect", Status.BAD_REQUEST, Level.INFO),
+ REQUEST_TIMED_OUT("Request timed out.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ UNEXPECTED_EXCEPTION("Unexpected exception encountered during processing. Please contact support : {0}",
+ Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+
+ UNDEFINED_FILTER_ATTRIBUTE("Undefined filter attribute {0}", Status.BAD_REQUEST, Level.INFO),
+ INVALID_DATE_FILTER("Invalid date filter provided {0}=(1}", Status.BAD_REQUEST, Level.INFO),
+
+ INCOMING_MESSAGE("Incoming message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ INCOMING_MESSAGE_RESPONSE("Message response method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE("Outgoing message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE_RETURNED("Outgoing message returned method={0} path={1} status={2}", Status.OK, Level.INFO, true,
+ false),
+
+ UNEXPECTED_RESPONSE("Unexpected response from {0} HTTP Status={1} : {2}", Status.OK, Level.INFO),
+ INVALID_CHANGE_WINDOW("Change window end time {1} must be after start time {0}", Status.OK, Level.INFO),
+ EXPECTED_EXCEPTION("Expected exception encountered during processing. {0}", Status.OK, Level.INFO),
+ UNABLE_TO_UPDATE_TICKET("Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}",
+ Status.OK, Level.INFO),
+ UNAUTHORIZED("Authorization failed.", Status.FORBIDDEN, Level.INFO),
+ UNAUTHENTICATED("Authentication failed.", Status.UNAUTHORIZED, Level.INFO),
+
+ ;
+ private final String defaultId;
+ private final String defaultMessage;
+ private final String defaultResolution;
+ private final String defaultAction;
+
+ private final Status status;
+ private final Level level;
+ private final Boolean audit;
+ private final Boolean metric;
+
+
+ private LogMessages(String message, Status code, Level lev) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ this.audit = false;
+ this.metric = false;
+ }
+
+ private LogMessages(String message, Status code, Level lev, Boolean audit, Boolean metric) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.audit = audit;
+ this.metric = metric;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ }
+
+ private LogMessages(String message, Status code, Level lev, String id, String resolution, String action) {
+ level = lev;
+ status = code;
+ defaultMessage = message;
+ this.defaultId = id;
+ this.defaultResolution = resolution;
+ this.defaultAction = action;
+ this.audit = false;
+ this.metric = false;
+ }
+
+ static {
+ EELFResourceManager.loadMessageBundle("logmessages");
+ }
+
+ /**
+ * Gen properties.
+ *
+ * @return the string
+ */
+ public String genProperties() {
+ // Use this to regenerate properties file. The desire to change messages without updating code is
+ // well understood, but the developer should be able to code the defaults without having to update 2
+ // different files and
+ // get it wrong.
+ StringBuilder sb = new StringBuilder();
+ sb.append("# Generated from ").append(this.getClass().getName()).append("\n");
+ for (LogMessages lm : values()) {
+ sb.append(lm.name());
+ sb.append(" ").append(lm.defaultId);
+ sb.append("|").append(lm.defaultMessage);
+ sb.append("|").append(lm.defaultResolution);
+ sb.append("|").append(lm.defaultAction);
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+
+ // interface methods
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ @Override
+ public String getMessage() {
+ return defaultMessage;
+ }
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ @Override
+ public Enum<?> getValue() {
+ return this;
+ }
+
+ @Override
+ public String getDomain() {
+ return this.getClass().getSimpleName();
+ }
+
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * The main method.
+ *
+ * @param argv the arguments
+ */
+ public static void main(String[] argv) {
+ System.out.println(LogMessages.UNEXPECTED_EXCEPTION.genProperties());
+ try {
+ Files.write(Paths.get("src/main/resources/logmessages.properties"),
+ LogMessages.UNEXPECTED_EXCEPTION.genProperties().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties file.", e);
+
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("<html><body><h1>Cell Site Selection Scheduler mS Observations</h1>\n<table border=\"1\">\n<tr>");
+ sb.append("<td>Code</td> ");
+ sb.append("<td>Log Level</td> ");
+ sb.append("<td>Message</td> ");
+ sb.append("</tr>\n");
+ for (LogMessages m : LogMessages.values()) {
+ if (m.level == Level.ERROR || m.level == Level.WARN || m.level == Level.FATAL) {
+ sb.append("<tr>");
+ sb.append("<td>").append(m.name()).append("</td> ");
+ sb.append("<td>").append(m.level).append("</td> ");
+ sb.append("<td>").append(m.defaultMessage).append("</td> ");
+ sb.append("</tr>\n");
+ }
+ }
+ try {
+ Files.write(Paths.get("logmessages.html"), sb.toString().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties html file.", e);
+
+ }
+
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java
new file mode 100644
index 0000000..248ea43
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.filters;
+
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+
+import java.io.IOException;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.client.ClientResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import org.onap.observations.Mdc;
+import org.onap.observations.MessageHeaders;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Component;
+
+// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+@Component
+public class CmsoClientFilters implements ClientRequestFilter, ClientResponseFilter {
+
+ private static String appId = "cmso";
+
+ @Override
+ public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
+ // On the way back
+ Mdc.metricEnd(responseContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE_RETURNED, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString(), responseContext.getStatusInfo().toString());
+ }
+
+ @Override
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ // On the way out
+ Mdc.metricStart(requestContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString());
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+
+ String transactionId = (String) headers.getFirst(MessageHeaders.HeadersEnum.TransactionID.toString());
+ String mdcId = MDC.get(MDC_KEY_REQUEST_ID);
+ if (transactionId == null || transactionId.equals("")) {
+ if (mdcId != null) {
+ headers.add(HeadersEnum.TransactionID.toString(), mdcId);
+ }
+ }
+ headers.add(HeadersEnum.FromAppID.toString(), appId);
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java
new file mode 100644
index 0000000..2418aec
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.filters;
+
+import java.io.IOException;
+import java.util.UUID;
+import javax.annotation.Priority;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.ext.Provider;
+import org.onap.observations.Mdc;
+import org.onap.observations.MessageHeaders;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.stereotype.Component;
+
+@Priority(1)
+@Provider
+@Component
+public class CmsoContainerFilters implements ContainerRequestFilter, ContainerResponseFilter {
+
+
+ @Context
+ private HttpServletRequest servletRequest;
+
+ @Override
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+ try {
+ Mdc.auditEnd(requestContext, responseContext);
+ Observation.report(LogMessages.INCOMING_MESSAGE_RESPONSE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString(),
+ responseContext.getStatusInfo().toString());
+ MultivaluedMap<String, String> reqHeaders = requestContext.getHeaders();
+ MultivaluedMap<String, Object> respHeaders = responseContext.getHeaders();
+ String minorVersion = reqHeaders.getFirst(HeadersEnum.MinorVersion.toString());
+ respHeaders.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ respHeaders.add(HeadersEnum.LatestVersion.toString(), MessageHeaders.latestVersion);
+ respHeaders.add(HeadersEnum.PatchVersion.toString(), MessageHeaders.patchVersion);
+
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+ }
+
+ @Override
+ public void filter(ContainerRequestContext requestContext) throws IOException {
+ try {
+ // On the way in
+ Mdc.auditStart(requestContext, servletRequest);
+ Observation.report(LogMessages.INCOMING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString());
+
+ String majorVersion = requestContext.getUriInfo().getPath();
+ if (majorVersion != null) {
+
+ if (majorVersion.startsWith("dispatch/")) {
+ return;
+ }
+ majorVersion = majorVersion.replaceAll("/.*$", "");
+ }
+ if (!MessageHeaders.validateMajorVersion(majorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported Major version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+ }
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId == null) {
+ transactionId = UUID.randomUUID().toString();
+ headers.add(HeadersEnum.TransactionID.toString(), transactionId);
+ }
+ String minorVersion = headers.getFirst(HeadersEnum.MinorVersion.toString());
+ if (minorVersion == null) {
+ minorVersion = MessageHeaders.supportedMajorVersions.get(majorVersion);
+ headers.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ }
+ if (!MessageHeaders.validateMajorMinorVersion(majorVersion, minorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported API version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+
+ }
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ throw e;
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java
new file mode 100644
index 0000000..032c6f8
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+
+@Api("Administration")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface AdminTool {
+
+ // ******************************************************************
+ @GET
+ @Path("/admin/{id}")
+ @Produces({MediaType.TEXT_PLAIN})
+ @RequestMapping(value = "/{apiVersion}/admin/{id}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN)
+ @ApiOperation(value = "", notes = "Returns encrypted value of id.", response = String.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Request failed")})
+ public Response exec(@ApiParam(
+ value = "v1|v2") @PathVariable @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Identifier") @PathVariable @PathParam("id") String id);
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java
new file mode 100644
index 0000000..8b1893e
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class AdminToolImpl implements AdminTool {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(AdminToolImpl.class);
+
+
+ @Context
+ UriInfo uri;
+
+ @Context
+ HttpServletRequest request;
+
+ @Override
+ public Response exec(String apiVersion, String id) {
+ log.info("AdminTool.exec entered " + uri.getPath());
+ if (id.length() < 4) {
+ return Response.ok("").build();
+ }
+ String encrypted = PropertiesManagement.getEncryptedValue(id);
+ Response response = Response.ok(encrypted).build();
+ return response;
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java
new file mode 100644
index 0000000..d8d7943
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.optf.cmso.topology.service.rs.models.HealthCheckMessage;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Api("Administration")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface HealthCheck {
+
+ // ******************************************************************
+ @GET
+ @Path("/health")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/health", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "", notes = "Returns health status of server.", response = HealthCheckMessage.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Not healthy", response = HealthCheckMessage.class)})
+ public Response healthCheck(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Check Interfaces") @QueryParam("checkInterfaces") @DefaultValue(
+ value = "true") Boolean checkInterfaces);
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheckImpl.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheckImpl.java
new file mode 100644
index 0000000..4fae359
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheckImpl.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.optf.cmso.topology.service.rs.models.HealthCheckComponent;
+import org.onap.optf.cmso.topology.service.rs.models.HealthCheckMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class HealthCheckImpl implements HealthCheck {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+
+ @Autowired
+ Environment env;
+
+
+ @Context
+ UriInfo uri;
+
+ @Context
+ HttpServletRequest request;
+
+ @Override
+ public Response healthCheck(String apiVersion, Boolean checkInterfaces) {
+ debug.debug("Entered healthcheck");
+ Response response = null;
+ HealthCheckMessage hc = new HealthCheckMessage();
+ hc.setHealthy(true);
+
+ //addToHealthCheckMessage(hc, this.healthCheckDb());
+
+ if (hc.getHealthy()) {
+ response = Response.ok().entity(hc).build();
+ }
+ else {
+ response = Response.status(Response.Status.BAD_REQUEST).entity(hc).build();
+ }
+ return response;
+ }
+
+ @SuppressWarnings("unused")
+ private void addToHealthCheckMessage(HealthCheckMessage hc, HealthCheckComponent hcc) {
+ if (!hcc.getHealthy()) {
+ hc.setHealthy(false);
+ }
+
+ hc.setHostname(System.getenv("HOSTNAME"));
+ hc.addComponent(hcc);
+ }
+
+ /**
+ * Health check.
+ *
+ * @return the health check component
+ */
+ @SuppressWarnings("unused")
+ private HealthCheckComponent healthCheckDb() {
+ HealthCheckComponent hcc = new HealthCheckComponent();
+ hcc.setName("Database");
+ String url = env.getProperty("spring.datasource.url");
+ hcc.setUrl(url);
+ try {
+ // List<ApprovalType> approvalTypes = approvalTypeDAO.findByDomain("HealthCheck");
+ hcc.setHealthy(true);
+ hcc.setStatus("OK");
+ } catch (Exception e) {
+ hcc.setStatus(e.getMessage());
+
+ }
+ return hcc;
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterface.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterface.java
new file mode 100644
index 0000000..6bdd7fa
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterface.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.optf.cmso.common.CmsoRequestError;
+import org.onap.optf.cmso.topology.service.rs.models.TopologyRequest;
+import org.onap.optf.cmso.topology.service.rs.models.TopologyResponse;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Api("Topology Interface")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface TopologyInterface {
+ // ******************************************************************
+
+ @POST
+ @Path("/current/")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/current", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON,
+ produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "Request Topology",
+ notes = "API to retrieve toplogy for scheduling 'conflict free' mainentance."
+ + " Retrieves the element information related to the list of elements"
+ + " targeted for mainenance activity."
+ + " Scope of related elements to be returned are defined in the passed"
+ + " ToplogogyRequest."
+ + " Elements returned must include in the elementData, the identifier that"
+ + " the element is known as"
+ + " in the ticket management system."
+ + "\nThe Topology Service may implement asynchronous requests by"
+ + " returning IN_PROGRESS status."
+ + " If IN_PROGRESS, the optimizer will begin polling until"
+ + " COMPLETED is returned with the response. ",
+ response = TopologyResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Bad request", response = CmsoRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response retrieveCurrentTopology(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Topology criteria.") TopologyRequest topologyRequest);
+
+ @GET
+ @Path("/current/request/{id}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/current/request/{id}", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON,
+ produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "Poll Asynchronous Topology Request",
+ notes = "If a topology request results in asynchronous request (IN_PROGRESS)"
+ + " this GET is used to retrieve status until COMPLETED."
+ + " At which time, the optimizer will "
+ + " issue a DELETE to acknowledge receipt."
+ + "\nThe Topology Service implementation may delete the cache when"
+ + " returning completed."
+ + " The optimizer will treat subsequent not found on delete as normal.",
+ response = TopologyResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 404, message = "Not Found", response = CmsoRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response getTopologyRequest(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Request Id") @PathParam("id") String id);
+
+ @DELETE
+ @Path("/current/request/{id}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/current/request/{id}", method = RequestMethod.DELETE,
+ consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "Acknowledge Topology Response", notes = "API to acknowledge COMPLETED toplogy request.",
+ response = TopologyResponse.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 404, message = "Not Found", response = CmsoRequestError.class),
+ @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)})
+ public Response deleteTopologyRequest(
+ @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable(
+ value = "v1") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Request Id") @PathParam("id") String id);
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterfaceImpl.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterfaceImpl.java
new file mode 100644
index 0000000..b9ab733
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/TopologyInterfaceImpl.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.onap.optf.cmso.topology.service.rs.models.ElementCriteria;
+import org.onap.optf.cmso.topology.service.rs.models.ElementInfo;
+import org.onap.optf.cmso.topology.service.rs.models.ElementLocation;
+import org.onap.optf.cmso.topology.service.rs.models.TopologyRequest;
+import org.onap.optf.cmso.topology.service.rs.models.TopologyResponse;
+import org.onap.optf.cmso.topology.service.rs.models.TopologyResponse.TopologyRequestStatus;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+@Controller
+public class TopologyInterfaceImpl implements TopologyInterface {
+ @SuppressWarnings("unused")
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ Environment env;
+
+ @Context
+ UriInfo uri;
+
+ @Context
+ HttpServletRequest request;
+
+
+ @Override
+ public Response retrieveCurrentTopology(String apiVersion, TopologyRequest topologyRequest) {
+ // TODO Auto-generated method stub
+ String id = topologyRequest.getRequestId();
+ Observation.report(LogMessages.GET_CURRENT_TOPOLOGY, "Received", request.getRemoteAddr(), id, "");
+ Response response = null;
+ try {
+ // Only implementing synchronous responses for Dublin
+ TopologyResponse atr = new TopologyResponse();
+ atr.setRequestId(topologyRequest.getRequestId());
+ atr.setStatus(TopologyRequestStatus.COMPLETED);
+ List<ElementCriteria> elements = topologyRequest.getElements();
+ // At a minimum, return the requested elements
+ for (ElementCriteria criteria : elements) {
+ ElementInfo element = new ElementInfo();
+ element.setElementId(criteria.getElementId());
+ ElementLocation loc = new ElementLocation();
+ loc.setLat(new Float(-74.024));
+ loc.setLon(new Float(40.177));
+ element.setElementLocation(loc);
+ atr.getElements().add(element);
+ }
+
+ response = Response.ok(atr).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.GET_CURRENT_TOPOLOGY, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+
+ @Override
+ public Response getTopologyRequest(String apiVersion, String id) {
+ // TODO Auto-generated method stub
+ Observation.report(LogMessages.GET_CURRENT_TOPOLOGY, "Received", request.getRemoteAddr(), id, "");
+ Response response = null;
+ try {
+ TopologyResponse atr = new TopologyResponse();
+ atr.setRequestId(id);
+ atr.setStatus(TopologyRequestStatus.COMPLETED);
+ response = Response.ok(atr).build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.GET_CURRENT_TOPOLOGY, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+
+ @Override
+ public Response deleteTopologyRequest(String apiVersion, String id) {
+ // TODO Auto-generated method stub
+ Observation.report(LogMessages.GET_CURRENT_TOPOLOGY, "Received", request.getRemoteAddr(), id, "");
+ Response response = null;
+ try {
+ response = Response.noContent().build();
+ // } catch (CMSException e) {
+ // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ // Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ // response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.GET_CURRENT_TOPOLOGY, "Returned", request.getRemoteAddr(), id,
+ response.getStatusInfo().toString());
+ return response;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ConstraintElements.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ConstraintElements.java
new file mode 100644
index 0000000..b3ff906
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ConstraintElements.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.List;
+
+@ApiModel(value = "Topology Constraint ELements",
+ description = "Constraining Element Information returned from TopologyRequuest.")
+public class ConstraintElements implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ public enum AvailabilityMatrixScope {
+ NONE, GLOBAL, ELEMENT,
+ }
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Type of constraint.")
+ private String constraintType;
+
+ @ApiModelProperty(
+ value = "If more than one instance of constraintType,"
+ + " minimum number of available instances required."
+ + " Useful for identifying availableBackup elements, service paths.")
+ private Integer constraintTypeMinimum = 1;
+
+ @ApiModelProperty(value = "Availability matrix name. Availability matrix will not be passed to optimizer engine."
+ + " Generally useful for global concurrency type constraints.")
+ private String optimizerAvailabilityMatrixName;
+
+ @ApiModelProperty(value = "Availability matrix scope global or scoped per elementId.")
+ private AvailabilityMatrixScope availabilityMatrixScope = AvailabilityMatrixScope.NONE;
+
+ @ApiModelProperty(value = "Availability matrix is aggregated into element availability marrix.")
+ private boolean elementAvailabilityAggreagation = true;
+
+ @ApiModelProperty(value = "Elements ")
+ private List<String> elements;
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public String getConstraintType() {
+ return constraintType;
+ }
+
+ public void setConstraintType(String constraintType) {
+ this.constraintType = constraintType;
+ }
+
+ public Integer getConstraintTypeMinimum() {
+ return constraintTypeMinimum;
+ }
+
+ public void setConstraintTypeMinimum(Integer constraintTypeMinimum) {
+ this.constraintTypeMinimum = constraintTypeMinimum;
+ }
+
+ public String getOptimizerAvailabilityMatrixName() {
+ return optimizerAvailabilityMatrixName;
+ }
+
+ public void setOptimizerAvailabilityMatrixName(String optimizerAvailabilityMatrixName) {
+ this.optimizerAvailabilityMatrixName = optimizerAvailabilityMatrixName;
+ }
+
+ public List<String> getElements() {
+ return elements;
+ }
+
+ public void setElements(List<String> elements) {
+ this.elements = elements;
+ }
+
+ public AvailabilityMatrixScope getAvailabilityMatrixScope() {
+ return availabilityMatrixScope;
+ }
+
+ public void setAvailabilityMatrixScope(AvailabilityMatrixScope availabilityMatrixScope) {
+ this.availabilityMatrixScope = availabilityMatrixScope;
+ }
+
+ public boolean isElementAvailabilityAggreagation() {
+ return elementAvailabilityAggreagation;
+ }
+
+ public void setElementAvailabilityAggreagation(boolean elementAvailabilityAggreagation) {
+ this.elementAvailabilityAggreagation = elementAvailabilityAggreagation;
+ }
+
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementCriteria.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementCriteria.java
new file mode 100644
index 0000000..6f5e49b
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementCriteria.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Element Critera", description = "Element criteria for retrieving topology.")
+public class ElementCriteria implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value = "Element id unique to the request.")
+ private String elementId;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementInfo.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementInfo.java
new file mode 100644
index 0000000..0a76c18
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementInfo.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Topology Element", description = "Element Information returned from TopologyRequuest.")
+public class ElementInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ElementInfo.class);
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Location information for the element.")
+ private ElementLocation elementLocation;
+
+ @ApiModelProperty(value = "List of related elements required to be available to execute the chenge.")
+ private List<String> requiredElements;
+
+ @ApiModelProperty(value = "Lists of related elements that must be "
+ + " available to avoid network outage while executing the change."
+ + " Each set constraint elements")
+ private List<ConstraintElements> constraintElements = new ArrayList<>();
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public ElementLocation getElementLocation() {
+ return elementLocation;
+ }
+
+ public void setElementLocation(ElementLocation elementLocation) {
+ this.elementLocation = elementLocation;
+ }
+
+ public List<String> getRequiredElements() {
+ return requiredElements;
+ }
+
+ public void setRequiredElements(List<String> requiredElements) {
+ this.requiredElements = requiredElements;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+ public List<ConstraintElements> getConstraintElements() {
+ return constraintElements;
+ }
+
+ public void setConstraintElements(List<ConstraintElements> constraintElements) {
+ this.constraintElements = constraintElements;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementLocation.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementLocation.java
new file mode 100644
index 0000000..15f77f8
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ElementLocation.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+
+@ApiModel(value = "Element Location", description = "Location information necessary to determine timezone."
+ + " lat/lon and/or timezone must be provided")
+public class ElementLocation implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ElementLocation.class);
+
+ @ApiModelProperty(value = "Geographic latitude of element.")
+ private Float lat;
+
+ @ApiModelProperty(value = "Geographic longitude of element.")
+ private Float lon;
+
+ @ApiModelProperty(value = "Timezone.")
+ private String timezone;
+
+ public Float getLat() {
+ return lat;
+ }
+
+ public void setLat(Float lat) {
+ this.lat = lat;
+ }
+
+ public Float getLon() {
+ return lon;
+ }
+
+ public void setLon(Float lon) {
+ this.lon = lon;
+ }
+
+ public String getTimezone() {
+ return timezone;
+ }
+
+ public void setTimezone(String timezone) {
+ this.timezone = timezone;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckComponent.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckComponent.java
new file mode 100644
index 0000000..378dcb0
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckComponent.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+
+@ApiModel
+public class HealthCheckComponent implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckComponent.class);
+
+ private String name;
+ private String url;
+ private String status;
+ private Boolean healthy = false;
+
+ public Boolean getHealthy() {
+ return healthy;
+ }
+
+ public void setHealthy(Boolean healthy) {
+ this.healthy = healthy;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckMessage.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckMessage.java
new file mode 100644
index 0000000..de96ac5
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/HealthCheckMessage.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel
+public class HealthCheckMessage implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckMessage.class);
+
+ private Boolean healthy = false;
+ private String buildInfo = "";
+ private String currentTime = "";
+ private String hostname = "";
+
+ private List<HealthCheckComponent> components = new ArrayList<HealthCheckComponent>();
+
+ public Boolean getHealthy() {
+ return healthy;
+ }
+
+ public void setHealthy(Boolean healthy) {
+ this.healthy = healthy;
+ }
+
+ public String getBuildInfo() {
+ return buildInfo;
+ }
+
+ public void setBuildInfo(String buildInfo) {
+ this.buildInfo = buildInfo;
+ }
+
+ public String getCurrentTime() {
+ return currentTime;
+ }
+
+ public void setCurrentTime(String currentTime) {
+ this.currentTime = currentTime;
+ }
+
+ public String getHostname() {
+ return hostname;
+ }
+
+ public void setHostname(String hostname) {
+ this.hostname = hostname;
+ }
+
+ public List<HealthCheckComponent> getComponents() {
+ return components;
+ }
+
+ public void setComponents(List<HealthCheckComponent> components) {
+ this.components = components;
+ }
+
+ public void addComponent(HealthCheckComponent components) {
+ this.components.add(components);
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/NameValue.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/NameValue.java
new file mode 100644
index 0000000..a7911d9
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/NameValue.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+
+@ApiModel(value = "Name Value Data", description = "Instance of a name/value")
+public class NameValue implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(NameValue.class);
+
+ public NameValue() {
+
+ }
+
+ public NameValue(String name, Object value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ @ApiModelProperty(value = "Name.")
+ private String name;
+
+ @ApiModelProperty(value = "Value.")
+ private Object value;
+
+
+ public String getName() {
+ return name;
+ }
+
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ public Object getValue() {
+ return value;
+ }
+
+
+ public void setValue(Object value) {
+ this.value = value;
+ }
+
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/PolicyInfo.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/PolicyInfo.java
new file mode 100644
index 0000000..60dca31
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/PolicyInfo.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Supported Policy Information", description = "Policy Information returned from get policies API.")
+public class PolicyInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(PolicyInfo.class);
+
+ @ApiModelProperty(value = "Policy name")
+ private String policyName;
+
+ @ApiModelProperty(value = "Policy description")
+ private String policyDescription;
+
+ @ApiModelProperty(value = "Named values to modify/override policy attributes.")
+ public List<NameValue> policyModifiers = new ArrayList<>();
+
+ public String getPolicyName() {
+ return policyName;
+ }
+
+ public void setPolicyName(String policyName) {
+ this.policyName = policyName;
+ }
+
+ public String getPolicyDescription() {
+ return policyDescription;
+ }
+
+ public void setPolicyDescription(String policyDescription) {
+ this.policyDescription = policyDescription;
+ }
+
+ public List<NameValue> getPolicyModifiers() {
+ return policyModifiers;
+ }
+
+ public void setPolicyModifiers(List<NameValue> policyModifiers) {
+ this.policyModifiers = policyModifiers;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ReferencedElementInfo.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ReferencedElementInfo.java
new file mode 100644
index 0000000..9b3d25c
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/ReferencedElementInfo.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Topology Related Element", description = "Element Information returned from TopologyRequuest.")
+public class ReferencedElementInfo implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(ReferencedElementInfo.class);
+
+ @ApiModelProperty(value = "Element identifier")
+ private String elementId;
+
+ @ApiModelProperty(value = "Location information for the element.")
+ private ElementLocation elementLocation;
+
+ @ApiModelProperty(value = "Related elements only. Element ids of the element(s) ")
+ private List<String> referencingElements;
+
+ @ApiModelProperty(value = "Implementation specific element data.")
+ public List<NameValue> elementData = new ArrayList<>();
+
+ public String getElementId() {
+ return elementId;
+ }
+
+ public void setElementId(String elementId) {
+ this.elementId = elementId;
+ }
+
+ public ElementLocation getElementLocation() {
+ return elementLocation;
+ }
+
+ public void setElementLocation(ElementLocation elementLocation) {
+ this.elementLocation = elementLocation;
+ }
+
+
+ public List<String> getRelatedElements() {
+ return referencingElements;
+ }
+
+ public void setRelatedElements(List<String> relatedElements) {
+ this.referencingElements = relatedElements;
+ }
+
+ public List<NameValue> getElementData() {
+ return elementData;
+ }
+
+ public void setElementData(List<NameValue> elementData) {
+ this.elementData = elementData;
+ }
+
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyRequest.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyRequest.java
new file mode 100644
index 0000000..e58572d
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyRequest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Topology Request",
+ description = "Request to retrieve topology information for the provided elements.")
+public class TopologyRequest implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyRequest.class);
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "Implementation specific name value pairs.")
+ private List<NameValue> commonData;
+
+ @ApiModelProperty(value = "List of the elements for which topology information is requested.")
+ private List<ElementCriteria> elements = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of the policies to control topology retrieve.")
+ private List<PolicyInfo> policies = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+
+ public List<NameValue> getCommonData() {
+ return commonData;
+ }
+
+
+ public void setCommonData(List<NameValue> commonData) {
+ this.commonData = commonData;
+ }
+
+
+ public List<ElementCriteria> getElements() {
+ return elements;
+ }
+
+
+ public void setElements(List<ElementCriteria> elements) {
+ this.elements = elements;
+ }
+
+
+ public List<PolicyInfo> getPolicies() {
+ return policies;
+ }
+
+
+ public void setPolicies(List<PolicyInfo> policies) {
+ this.policies = policies;
+ }
+
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyResponse.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyResponse.java
new file mode 100644
index 0000000..fc4f7df
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/models/TopologyResponse.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed 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.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation 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.onap.optf.cmso.topology.service.rs.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApiModel(value = "Topology Response", description = "Response to topology query for the requested elements.")
+public class TopologyResponse implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyResponse.class);
+
+ public enum TopologyRequestStatus {
+ IN_PROGRESS, COMPLETED, FAILED
+ }
+
+ @ApiModelProperty(value = "Unique Id of the request")
+ private String requestId;
+
+ @ApiModelProperty(value = "List of elements for for which topology has been requested.")
+ private List<ElementInfo> elements = new ArrayList<>();
+
+ @ApiModelProperty(value = "List of referenced elements representing the topology that has been requested.")
+ private List<ReferencedElementInfo> referencedElements = new ArrayList<>();
+
+ @ApiModelProperty(value = "Status of asynchronous request. COMPLETED is returned on initial synchonous request. "
+ + "If IN_PROGRESS is returned, the optimizer will enter asynchronous polling mode.")
+ private TopologyRequestStatus status;
+
+ @ApiModelProperty(value = "FAILED request error message.")
+ private String errorMessage;
+
+ @ApiModelProperty(value = "If request is asynchronous (IN_PROGRESS), suggested interval to the next poll.")
+ private Integer pollingSeconds;
+
+ public TopologyRequestStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(TopologyRequestStatus status) {
+ this.status = status;
+ }
+
+ public Integer getPollingSeconds() {
+ return pollingSeconds;
+ }
+
+ public void setPollingSeconds(Integer pollingSeconds) {
+ this.pollingSeconds = pollingSeconds;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public List<ElementInfo> getElements() {
+ return elements;
+ }
+
+ public void setElements(List<ElementInfo> elements) {
+ this.elements = elements;
+ }
+
+ public List<ReferencedElementInfo> getReferencedElements() {
+ return referencedElements;
+ }
+
+ public void setReferencedElements(List<ReferencedElementInfo> referencedElements) {
+ this.referencedElements = referencedElements;
+ }
+
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ log.debug("Error in toString()", e);
+ }
+ return "";
+ }
+
+}
diff --git a/cmso-topology/src/main/resources/META-INF/spring.factories b/cmso-topology/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000..c0b4a01
--- /dev/null
+++ b/cmso-topology/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.env.EnvironmentPostProcessor=org.onap.optf.cmso.CmsoEnvironmentPostProcessor \ No newline at end of file
diff --git a/cmso-topology/src/main/resources/aaf/AAFUserRoles.properties b/cmso-topology/src/main/resources/aaf/AAFUserRoles.properties
new file mode 100644
index 0000000..e7fc221
--- /dev/null
+++ b/cmso-topology/src/main/resources/aaf/AAFUserRoles.properties
@@ -0,0 +1 @@
+/**=org.onap.oof.access|*|get ALL \ No newline at end of file
diff --git a/cmso-topology/src/main/resources/aaf/org.onap.oof.cred.props b/cmso-topology/src/main/resources/aaf/org.onap.oof.cred.props
new file mode 100644
index 0000000..21945b8
--- /dev/null
+++ b/cmso-topology/src/main/resources/aaf/org.onap.oof.cred.props
@@ -0,0 +1,11 @@
+############################################################
+# Properties Generated by AT&T Certificate Manager
+# by root
+# on 2019-02-15T21:01:19.868+0000
+# @copyright 2016, AT&T
+############################################################
+aaf_id=oof@oof.onap.org
+aaf_password=demo123456!
+cadi_keyfile=src/main/resources/aaf/org.onap.oof.keyfile
+cadi_truststore=src/main/resources/aaf/truststoreONAPall.jks
+#cadi_truststore_password=enc:erNqS33_5xn_bwcaroba7NvYfPLpPUYxqzw3rdwGTY7jbnygOTyQ-R6dpSC_3iPOomp-rqZkHgMGImiUk9DFPr
diff --git a/cmso-topology/src/main/resources/aaf/org.onap.oof.keyfile b/cmso-topology/src/main/resources/aaf/org.onap.oof.keyfile
new file mode 100644
index 0000000..f85a567
--- /dev/null
+++ b/cmso-topology/src/main/resources/aaf/org.onap.oof.keyfile
@@ -0,0 +1,27 @@
+liD-IR8Y1MHqPDTUqq3AaTtqnWn5jCpfIRBlyi6xY4A0fbQz8ZPlTZPHkshRt0dHdST3R7TIvTyQ
+JpTCeBNBu2df3vBbUzsN0rIpPG9TGjzmE7cRu4V4kfefSqsIj-S7OTAaWaWpwGWJYLLCB2sQALkS
+f68VWdupUEw3g9jqCU1QzjKOnLGvhlp6Qrc1xG4Z5Ar8WERw-C3DqTWUKANoEvjWkvH2rAywzj93
+pmspvd5fQfH1rp1ACNvnPrRb_oYNfwPrNpE7Sb4LvM1muoiKMDF64IDO0TkxhjHZ9wpJgVsnowby
+qmokqf39dMRRk3S1IEpOiBGyLS_885JDj_XJKYRQsjvkTzjpFJ7wE2-HDZEVWCITvtS9-Xorm5TI
+3iU4rjMDew5fkBnjoKuSOS7Lksva4ouZOCiUkDos1jAJ5XMDEQm4BcPHtcW6PpC602-qRcgnNjjP
+wOPdF7hCm27ZTai3lAtNGByR7oBr9r5Uma-soORFvg8drV8Rgh0lax-poFVhoEH7RhKPIzYpSco9
+jnpURzi_epTjAhjjup-erTv2GAIllKsSEHZLbfsFWlNUZTOx58PSB0jBN5m_8HxTyNm0zsm0Cb7U
+KsjPduQ5ZblsfRIJwqpOBXoof7WerKReMZSOdgjZUNueiuEImVH9_SYOdKZhkluSi4yfEtme7CCP
+kZ2JhdiT5km3SeonalhU2MUsx60krxyQ1mnjI4jS9QagUME4mujdvM_L7mtjcPZVSfXUn49whakE
+J-NQV6q2iZgN2IxsT_uCnlZYwnE5i-IbQkQAEu13m6ETsMmf0cwPnKaSwRhb8G48EkJhTL-GP9Z0
+-EsIKT7lQt7kfX-mmNoEirTg9gQAaN3uxLmdHvXpeJdlETnnaLYYJJ3h-SL0e_5Yz2SpdsEwZ3Bk
+PtR-QvlYKDhG1nhPOna65ctCzn81PZOUP3lsO6MSTOK6D6Taxfh1TYEBAvzCP0BfFBodw4lSglFP
+I5IfdiJmomTGARa36nC_O5YzH_jBWLQrgd2gxI5H5bB-5zqzu79SGX9o2_LRVY_LVV0BmI3xSYOI
+vziYYC1XyTY6blfdiOM5a5KjraErxSTEFZVFrsx4OQ_dLA0woVtixawrIy1rgfQr49U1oIRe8BgN
+j3eis_UQAbPbmdbEe1qtXnvi6T7trHskzt6K-vTgo5ITJkr-F2Sds_QgNdaFBGuES6X5RwRGlbHT
+Tl_M8Ja_1K-RMNKJRssoRTKstpwnrhk9IcoSwYcLykbDLgeC0mhSMHOOuWv1RGRaZdzObc5YA1eB
+idQmzy5xAHzNxPHHrB-fpjFJRYv_QZY9qZcGvP58d6bHO0upxbj-BBt9zfc7Qt0JLU6EAdYbW5TI
+2v4JImikrx6KvtoK8vcjJMTDAanTVB31J65tat0rq9wYKxUdjBJLzkT3psYs_DRtYQc0i02YTD7t
+dWya0-3p1Yrt0em3XGb8JAh2PA3BsQKmvKAOc054wf_B8n8saxSFw1WQL30vU5c4-Z_p53HfaUYd
+Qg7DZskzgwBRy48sLJNCrn81RtxXfQP1XtPEZs-AAlTUslHoUdoQ1cwrYEgkNT1cjk6sLI_oKSK-
+dDICBnlYLrZRBS3sH8K38WaIh1WRY6vbGVDs1tUectUpng_-Khavd0Crw7D_CE6T7Rnfcn0pnTV-
+HW1PIXejFsONQn-2c3a9HZ-v6Hg4JL6UWm-qgBPC5118ymO0LfmrviAFAC6Wt3WFiNzrvx9Jggus
+lE0qvLVfkQVZXAy-hSPHlYZmtxk5voVsf60qPoDN2-NdpWz62M9PrXd_A03YGxzt0G6J4VXExRES
+xqLeGNGB496AfX_vEub97sR8xcbbUXsyt12uVnygifGyND60coikaKrMktv2OLOLEl8AudLp0ZNA
+oOoYJZqfUnQqaLt0dNmNa5OtzYjf7f6bYX0V8XLTHlFqZ6QzqYGFMPNhDYjqtet6d--Q8t7_5S5C
+RfXP8Wh8CjbEh2_rsr9rvy1nhM_Cptxc0BFXcS5Dt_R4vjd2G4B_LEC4Hy1s_rZThzUVxRCl \ No newline at end of file
diff --git a/cmso-topology/src/main/resources/aaf/org.onap.oof.location.props b/cmso-topology/src/main/resources/aaf/org.onap.oof.location.props
new file mode 100644
index 0000000..d4a48df
--- /dev/null
+++ b/cmso-topology/src/main/resources/aaf/org.onap.oof.location.props
@@ -0,0 +1,8 @@
+############################################################
+# Properties Generated by AT&T Certificate Manager
+# by root
+# on 2019-02-15T21:01:19.861+0000
+# @copyright 2016, AT&T
+############################################################
+cadi_latitude=0.00
+cadi_longitude=0.00
diff --git a/cmso-topology/src/main/resources/aaf/org.onap.oof.props b/cmso-topology/src/main/resources/aaf/org.onap.oof.props
new file mode 100644
index 0000000..766c354
--- /dev/null
+++ b/cmso-topology/src/main/resources/aaf/org.onap.oof.props
@@ -0,0 +1,14 @@
+############################################################
+# Properties Generated by AT&T Certificate Manager
+# by root
+# on 2019-02-15T21:01:19.866+0000
+# @copyright 2016, AT&T
+############################################################
+aaf_id=oof@oof.onap.org
+aaf_locate_url=https://aaf-onap-test.osaaf.org:8095
+aaf_url=https://AAF_LOCATE_URL/AAF_NS.service:2.1
+cadi_etc_dir=etc/config
+cadi_latitude=0.00
+cadi_longitude=0.00
+cadi_prop_files=src/main/resources/aaf/org.onap.oof.location.props;src/main/resources/aaf/org.onap.oof.cred.props
+cm_url=https://AAF_LOCATE_URL/AAF_NS.cm:2.1
diff --git a/cmso-topology/src/main/resources/aaf/permissions.properties b/cmso-topology/src/main/resources/aaf/permissions.properties
new file mode 100644
index 0000000..85d3e3c
--- /dev/null
+++ b/cmso-topology/src/main/resources/aaf/permissions.properties
@@ -0,0 +1,2 @@
+permission.type=org.onap.oof
+permission.instance=* \ No newline at end of file
diff --git a/cmso-topology/src/main/resources/application.properties b/cmso-topology/src/main/resources/application.properties
new file mode 100644
index 0000000..9fa9e07
--- /dev/null
+++ b/cmso-topology/src/main/resources/application.properties
@@ -0,0 +1,61 @@
+#-------------------------------------------------------------------------------
+# Copyright 2017-2019 AT&T Intellectual Property.
+# Modifications Copyright 2018 IBM.
+#
+# Licensed 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.
+#
+#
+# Unless otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the ??License?);
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# 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.
+#-------------------------------------------------------------------------------
+
+info.build.artifact=@project.artifactId@
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.version=@project.version@
+
+spring.jersey.type=filter
+spring.mvc.urls=swagger,docs,prometheus
+server.servlet.context-path=/topology
+spring.main.allow-bean-definition-overriding=true
+
+#This property is used to set the Tomcat connector attributes.developers can define multiple attributes separated by comma
+#tomcat.connector.attributes=allowTrace-true
+
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+
+#The minimum number of threads always kept alive
+server.tomcat.min-spare-threads=25
+
+# External API port
+server.port=7998
+
+kubernetes.namespace=org.onap.optf.cmso
+
+
+com.att.eelf.logging.file=logback.xml
+com.att.eelf.logging.path=
+
+logging.config=
+spring.profiles.active=proprietary-auth \ No newline at end of file
diff --git a/cmso-topology/src/main/resources/banner.txt b/cmso-topology/src/main/resources/banner.txt
new file mode 100644
index 0000000..ecb0dd9
--- /dev/null
+++ b/cmso-topology/src/main/resources/banner.txt
@@ -0,0 +1,10 @@
+#-----------------------------------------------------------
+ ____ ____ ____________ ________ ________ ____
+ / __ \/ __ \/_ __/ ____/ / ____/ |/ / ___// __ \
+ / / / / /_/ / / / / /_ / / / /|_/ /\__ \/ / / /
+ / /_/ / ____/ / / / __/ / /___/ / / /___/ / /_/ /
+ \____/_/ /_/ /_/ \____/_/ /_//____/\____/
+
+${archetype.name}-Version:${archetype.version}
+
+#----------------------------------------------------------- \ No newline at end of file
diff --git a/cmso-topology/src/main/resources/logback.xml b/cmso-topology/src/main/resources/logback.xml
new file mode 100644
index 0000000..2fd5329
--- /dev/null
+++ b/cmso-topology/src/main/resources/logback.xml
@@ -0,0 +1,377 @@
+<!--
+ Copyright © 2017-2018 AT&T Intellectual Property.
+ Modifications Copyright © 2018 IBM.
+
+ Licensed 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.
+
+
+ Unless otherwise specified, all documentation contained herein is licensed
+ under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ you may not use this documentation except in compliance with the License.
+ You may obtain a copy of the License at
+
+ https://creativecommons.org/licenses/by/4.0/
+
+ Unless required by applicable law or agreed to in writing, documentation
+ 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.
+-->
+
+<configuration scan="true" scanPeriod="3 seconds" debug="false">
+
+ <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
+ <property resource="application.properties" />
+ <property name="namespace" value="${kubernetes.namespace}"></property>
+ <!-- directory path for all other type logs -->
+ <property name="logDir" value="logs" />
+ <!-- directory path for debugging type logs -->
+ <property name="debugDir" value="debug-logs" />
+ <property name="logDirectory" value="${logDir}" />
+ <property name="debugLogDirectory" value="${debugDir}" />
+ <!-- log file names -->
+ <property name="generalLogName" value="application" />
+ <property name="securityLogName" value="security" />
+ <property name="performanceLogName" value="performance" />
+ <property name="serverLogName" value="server" />
+ <property name="policyLogName" value="policy" />
+ <property name="errorLogName" value="error" />
+ <property name="metricsLogName" value="metrics" />
+ <property name="auditLogName" value="audit" />
+ <property name="debugLogName" value="debug" />
+
+ <property name="defaultPattern"
+ value="%d{yyyy-MM-dd HH:mm:ss.SSS} $ version: %X{version} threadId: {PID:- } %-5level namespace:${namespace} %logger{20} [ hostname: %X{hostname} serviceName: %X{serviceName} version: %X{version} transactionId: %X{transactionId} requestTimeStamp: %X{requestTimestamp} responseTimeStamp: %X{responseTimestamp} duration: %X{duration}] %m%n" />
+
+ <property name="performanceandAuditpattern"
+ value="%date{ISO8601,UTC}|%thread|%.-5level|namespace:${namespace}|%logger{20}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{serviceName}| %msg%n" />
+
+ <property name="auditLoggerPattern"
+ value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+ <property name="metricsLoggerPattern"
+ value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+ <property name="errorLoggerPattern"
+ value="%date{ISO8601,UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%.-5level|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />
+
+ <property name="debugLoggerPattern"
+ value="%date{ISO8601,UTC}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
+
+ <appender name="STDOUT"
+ class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- EELF Appenders -->
+ <!-- ============================================================================ -->
+
+ <!-- The EELFAppender is used to record events to the general application
+ log -->
+
+ <appender name="EELF"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELF"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <appender name="EELFSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender>
+
+ <!-- EELF Performance Appender. This appender is used to record performance
+ records. -->
+ <appender name="EELFPerformance"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${performanceLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPerformance"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPerformance" />
+ </appender>
+
+ <!-- EELF Server Appender. This appender is used to record Server related
+ logging events. The Server logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate
+ Server events from other components, or it can be eliminated to record these
+ events as part of the application root log. -->
+ <appender name="EELFServer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${serverLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFServer"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFServer" />
+ </appender>
+
+
+ <!-- EELF Policy Appender. This appender is used to record Policy engine
+ related logging events. The Policy logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+ <appender name="EELFPolicy"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${policyLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPolicy"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPolicy" />
+ </appender>
+
+
+ <!-- EELF Audit Appender. This appender is used to record audit engine related
+ logging events. The audit logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+
+ <appender name="EELFAudit"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${auditLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${auditLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFAudit"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFAudit" />
+ </appender>
+
+ <appender name="EELFMetrics"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${metricsLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${metricsLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics" />
+ </appender>
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${errorLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError" />
+ </appender>
+
+ <appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug"
+ class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="${EELF_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELF" />
+ </logger>
+ <logger name="com.att.eelf.security" level="${DECURITY_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFSecurity" />
+ </logger>
+ <logger name="com.att.eelf.perf" level="${PERF_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFPerformance" />
+ </logger>
+ <logger name="com.att.eelf.server" level="${SERVER_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFServer" />
+ </logger>
+ <logger name="com.att.eelf.policy" level="${POLICY_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFPolicy" />
+ </logger>
+ <logger name="com.att.eelf.audit" level="${AUDIT_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFAudit" />
+ </logger>
+
+ <logger name="com.att.eelf.metrics" level="${METRICS_LEVEL:-info}" additivity="false">
+ <appender-ref ref="asyncEELFMetrics" />
+ </logger>
+
+ <logger name="com.att.eelf.error" level="${ERROR_LEVEL:-error}"
+ additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="com.att.eelf.debug" level="${DEBUG_LEVEL:-debug}"
+ additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+ </logger>
+
+ <root level="${ROOT_LEVEL:-INFO}">
+ <!-- appender-ref ref="STDOUT" / -->
+ <appender-ref ref="asyncEELF" />
+ </root>
+
+</configuration>
diff --git a/cmso-topology/src/main/resources/logmessages.properties b/cmso-topology/src/main/resources/logmessages.properties
new file mode 100644
index 0000000..8e20de6
--- /dev/null
+++ b/cmso-topology/src/main/resources/logmessages.properties
@@ -0,0 +1,25 @@
+# Generated from org.onap.optf.cmso.topology.common.LogMessages
+FETCH_TICKET FETCH_TICKET|Fetch ticket {0} : {1}: {2} : {3}|No resolution needed|No action is required
+CREATE_TICKET CREATE_TICKET|Create Ticket {0} : {1}: {2} : {3}|No resolution needed|No action is required
+CANCEL_TICKET CANCEL_TICKET|Cancel ticket {0} : {1}: {2} : {3}|No resolution needed|No action is required
+UPDATE_TICKET UPDATE_TICKET|Update ticket {0} : {1}: {2} : {3}|No resolution needed|No action is required
+GET_CURRENT_TOPOLOGY GET_CURRENT_TOPOLOGY|Get active tickets {0} : {1}: {2} : {3}|No resolution needed|No action is required
+SEARCH_TICKETS SEARCH_TICKETS|Search tickets {0} : {1}: {2} : {3}|No resolution needed|No action is required
+TICKET_NOT_FOUND TICKET_NOT_FOUND|Ticket not found id={0}|No resolution needed|No action is required
+INVALID_ATTRIBUTE INVALID_ATTRIBUTE|Invalid attribute {0}={1}|No resolution needed|No action is required
+MISSING_REQUIRED_ATTRIBUTE MISSING_REQUIRED_ATTRIBUTE|Missing required attribute '{0}'|No resolution needed|No action is required
+INVALID_REQUEST INVALID_REQUEST|The input data structure is incorrect|No resolution needed|No action is required
+REQUEST_TIMED_OUT REQUEST_TIMED_OUT|Request timed out.|No resolution needed|No action is required
+UNEXPECTED_EXCEPTION UNEXPECTED_EXCEPTION|Unexpected exception encountered during processing. Please contact support : {0}|No resolution needed|No action is required
+UNDEFINED_FILTER_ATTRIBUTE UNDEFINED_FILTER_ATTRIBUTE|Undefined filter attribute {0}|No resolution needed|No action is required
+INVALID_DATE_FILTER INVALID_DATE_FILTER|Invalid date filter provided {0}=(1}|No resolution needed|No action is required
+INCOMING_MESSAGE INCOMING_MESSAGE|Incoming message method={0} path={1}|No resolution needed|No action is required
+INCOMING_MESSAGE_RESPONSE INCOMING_MESSAGE_RESPONSE|Message response method={0} path={1} status={2}|No resolution needed|No action is required
+OUTGOING_MESSAGE OUTGOING_MESSAGE|Outgoing message method={0} path={1}|No resolution needed|No action is required
+OUTGOING_MESSAGE_RETURNED OUTGOING_MESSAGE_RETURNED|Outgoing message returned method={0} path={1} status={2}|No resolution needed|No action is required
+UNEXPECTED_RESPONSE UNEXPECTED_RESPONSE|Unexpected response from {0} HTTP Status={1} : {2}|No resolution needed|No action is required
+INVALID_CHANGE_WINDOW INVALID_CHANGE_WINDOW|Change window end time {1} must be after start time {0}|No resolution needed|No action is required
+EXPECTED_EXCEPTION EXPECTED_EXCEPTION|Expected exception encountered during processing. {0}|No resolution needed|No action is required
+UNABLE_TO_UPDATE_TICKET UNABLE_TO_UPDATE_TICKET|Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}|No resolution needed|No action is required
+UNAUTHORIZED UNAUTHORIZED|Authorization failed.|No resolution needed|No action is required
+UNAUTHENTICATED UNAUTHENTICATED|Authentication failed.|No resolution needed|No action is required
diff --git a/cmso-topology/src/main/script/TagVersion.groovy b/cmso-topology/src/main/script/TagVersion.groovy
new file mode 100644
index 0000000..c682f7f
--- /dev/null
+++ b/cmso-topology/src/main/script/TagVersion.groovy
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CMSO
+ * ================================================================================
+ * Copyright (C) 2018 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * Licensed 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.cmso.maven.scripts
+
+println project.properties['cmso.project.version'];
+def versionArray;
+if ( project.properties['cmso.project.version'] != null ) {
+ versionArray = project.properties['cmso.project.version'].split('\\.');
+}
+
+if ( project.properties['cmso.project.version'].endsWith("-SNAPSHOT") ) {
+ project.properties['project.docker.latesttag.version']=versionArray[0] + '.' + versionArray[1] + "-SNAPSHOT-latest";
+ project.properties['project.docker.latesttagtimestamp.version']=versionArray[0] + '.' + versionArray[1] + "-SNAPSHOT-"+project.properties['cmso.build.timestamp'];
+} else {
+ project.properties['project.docker.latesttag.version']=versionArray[0] + '.' + versionArray[1] + "-STAGING-latest";
+ project.properties['project.docker.latesttagtimestamp.version']=versionArray[0] + '.' + versionArray[1] + "-STAGING-"+project.properties['cmso.build.timestamp'];
+}
+
+println 'New Tag for docker:' + project.properties['project.docker.latesttag.version']; \ No newline at end of file
diff --git a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/AuthProviderTest.java b/cmso-topology/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
index ad24e4f..93353b1 100644
--- a/cmso-ticketmgt/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
+++ b/cmso-topology/src/test/java/org/onap/optf/cmso/AuthProviderTest.java
@@ -31,18 +31,19 @@
package org.onap.optf.cmso;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
-import org.onap.optf.ticketmgt.AuthProvider;
+import org.onap.optf.cmso.topology.AuthProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
@RunWith(MockitoJUnitRunner.class)
public class AuthProviderTest {
diff --git a/cmso-topology/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java b/cmso-topology/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
new file mode 100644
index 0000000..84e66c1
--- /dev/null
+++ b/cmso-topology/src/test/java/org/onap/optf/cmso/service/rs/MockHttpServletRequest.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.service.rs;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class MockHttpServletRequest {
+ public StringBuffer url = new StringBuffer("http://localhost:8089/cmso/v1/ChangeManagement/schedules/");
+ public HttpServletRequest request = mock(HttpServletRequest.class);
+
+ MockHttpServletRequest() {
+
+ when(request.getRequestURL()).thenReturn(url);
+ when(request.getHeader("Authorization")).thenReturn("BasicbTEzODc3OnNjaGVkdWxlci1SMTgwMiE=");
+
+ }
+
+}
diff --git a/cmso-topology/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java b/cmso-topology/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
new file mode 100644
index 0000000..ba30e4c
--- /dev/null
+++ b/cmso-topology/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
@@ -0,0 +1,48 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed 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.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.utilities;
+
+import org.onap.optf.cmso.common.PropertiesManagement;
+
+/**
+ * The Class PropertiesAdmin.
+ */
+public class PropertiesAdmin {
+
+ /**
+ * The main method.
+ *
+ * @param args the arguments
+ */
+ public static void main(String[] args) {
+ if (args.length < 1) {
+ System.out.println("Missing argument");
+ return;
+ }
+ String value = "";
+ if (args[0].startsWith("dec:")) {
+ value = PropertiesManagement.getDecryptedValue(args[0].substring(4));
+ } else {
+ value = PropertiesManagement.getEncryptedValue(args[0]);
+ }
+ System.out.println(args[0] + " : " + value);
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 51bdd6d..e6ea475 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,8 +62,10 @@
</scm>
<modules>
- <module>cmso-service</module>
<module>cmso-database</module>
+ <module>cmso-service</module>
+ <module>cmso-topology</module>
+ <module>cmso-ticketmgt</module>
<module>cmso-robot</module>
</modules>