summaryrefslogtreecommitdiffstats
path: root/cmso-optimizer/src
diff options
context:
space:
mode:
Diffstat (limited to 'cmso-optimizer/src')
-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
125 files changed, 11933 insertions, 0 deletions
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);
+ }
+
+}