Change Management Schedule Optimization 35/67935/1
authorRamaPrasad Amaranarayana (ra5425) <ra5425@att.com>
Wed, 19 Sep 2018 22:42:40 +0000 (18:42 -0400)
committerRamaPrasad Amaranarayana (ra5425) <ra5425@att.com>
Wed, 19 Sep 2018 22:42:40 +0000 (18:42 -0400)
Adding CMSO Service Code for Change Management Schedule Optimization

Change-Id: Idac29c1f315c957851c1b0369fd7fb44804c9255
Issue-ID: OPTFRA-353
Signed-off-by: RamaPrasad Amaranarayana (ra5425) <ra5425@att.com>
13 files changed:
cmso-service/src/main/docker/Dockerfile [new file with mode: 0644]
cmso-service/src/main/docker/startService.sh [new file with mode: 0644]
cmso-service/src/main/java/org/onap/optf/cmso/Application.java [new file with mode: 0644]
cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java [new file with mode: 0644]
cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java [new file with mode: 0644]
cmso-service/src/main/java/org/onap/optf/cmso/CMSQuartzConfiguration.java [new file with mode: 0644]
cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java [new file with mode: 0644]
cmso-service/src/main/resources/application.properties [new file with mode: 0644]
cmso-service/src/main/resources/banner.txt [new file with mode: 0644]
cmso-service/src/main/resources/logback.xml [new file with mode: 0644]
cmso-service/src/main/resources/logmessages.properties [new file with mode: 0644]
cmso-service/src/main/resources/swagger-ui/dist/swagger.json [new file with mode: 0644]
cmso-service/src/main/resources/system.properties [new file with mode: 0644]

diff --git a/cmso-service/src/main/docker/Dockerfile b/cmso-service/src/main/docker/Dockerfile
new file mode 100644 (file)
index 0000000..febb406
--- /dev/null
@@ -0,0 +1,5 @@
+FROM anapsix/alpine-java:8_jdk\r
+ADD cmso-0.1.0-SNAPSHOT.jar app.jar\r
+ADD startService.sh /startService.sh\r
+RUN chmod 700 /startService.sh\r
+ENTRYPOINT ./startService.sh \r
diff --git a/cmso-service/src/main/docker/startService.sh b/cmso-service/src/main/docker/startService.sh
new file mode 100644 (file)
index 0000000..e7d3121
--- /dev/null
@@ -0,0 +1,4 @@
+#!/bin/sh\r
+app_args=-Dspring.config.location=${APP_CONFIG_HOME}\r
+echo "app_args ="${app_args}\r
+java -Djava.security.egd=file:/dev/./urandom  ${app_args} -Xms1024m -Xmx1024m  -jar  /app.jar\r
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/Application.java b/cmso-service/src/main/java/org/onap/optf/cmso/Application.java
new file mode 100644 (file)
index 0000000..7327124
--- /dev/null
@@ -0,0 +1,109 @@
+/*\r
+ * Copyright © 2017-2018 AT&T Intellectual Property.\r
+ * Modifications Copyright © 2018 IBM.\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * \r
+ * Unless otherwise specified, all documentation contained herein is licensed\r
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");\r
+ * you may not use this documentation except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         https://creativecommons.org/licenses/by/4.0/\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, documentation\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+*/\r
+\r
+package org.onap.optf.cmso;\r
+\r
+import java.net.InetAddress;\r
+import java.util.TimeZone;\r
+import javax.annotation.PostConstruct;\r
+import org.apache.catalina.connector.Connector;\r
+import org.onap.optf.cmso.common.LogMessages;\r
+import org.slf4j.MDC;\r
+import org.springframework.beans.factory.annotation.Value;\r
+import org.springframework.boot.SpringApplication;\r
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;\r
+import org.springframework.boot.autoconfigure.SpringBootApplication;\r
+import org.springframework.boot.builder.SpringApplicationBuilder;\r
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;\r
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;\r
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;\r
+import org.springframework.context.annotation.Bean;\r
+import org.springframework.context.annotation.ComponentScan;\r
+import org.springframework.scheduling.annotation.EnableAsync;\r
+import com.att.eelf.configuration.Configuration;\r
+import com.att.eelf.configuration.EELFLogger;\r
+import com.att.eelf.configuration.EELFManager;\r
+\r
+@SpringBootApplication\r
+@ComponentScan(basePackages = {"org.onap.optf.cmso"})\r
+@EnableAsync\r
+@EnableAutoConfiguration(exclude = { /*DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class*/ })\r
+public class Application extends SpringBootServletInitializer {\r
+\r
+    private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);\r
+\r
+    @Override\r
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\r
+        return application.sources(Application.class);\r
+    }\r
+\r
+    @Value("${server.dispatchPort:8089}")\r
+    private String dispatchPort;\r
+\r
+    @PostConstruct\r
+    void started() {\r
+        // Make sure all datetimes are stored in UTC format.\r
+        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));\r
+    }\r
+\r
+    public static void main(String[] args) {\r
+        initMDCData();\r
+        SpringApplication.run(Application.class, args);\r
+    }\r
+\r
+    protected static void initMDCData() {\r
+        MDC.clear();\r
+        try {\r
+            MDC.put(Configuration.MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());\r
+            MDC.put("hostname", InetAddress.getLocalHost().getCanonicalHostName());\r
+            MDC.put("serviceName", System.getProperty("info.build.artifact"));\r
+            MDC.put("version", System.getProperty("info.build.version"));\r
+            MDC.put(Configuration.MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());\r
+        } catch (Exception e) {\r
+            log.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());\r
+        }\r
+    }\r
+\r
+    @Bean\r
+    public ServletWebServerFactory servletContainer() {\r
+        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();\r
+        int port = Integer.parseInt(dispatchPort);\r
+        tomcat.addAdditionalTomcatConnectors(createStandardConnector(port));\r
+        return tomcat;\r
+    }\r
+\r
+    private Connector createStandardConnector(int port) {\r
+        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");\r
+        connector.setScheme("http");\r
+        connector.setPort(port);\r
+        return connector;\r
+    }\r
+}\r
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java b/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java
new file mode 100644 (file)
index 0000000..aad3104
--- /dev/null
@@ -0,0 +1,67 @@
+/*\r
+ * Copyright © 2017-2018 AT&T Intellectual Property.\r
+ * Modifications Copyright © 2018 IBM.\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * \r
+ * Unless otherwise specified, all documentation contained herein is licensed\r
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");\r
+ * you may not use this documentation except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         https://creativecommons.org/licenses/by/4.0/\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, documentation\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+*/\r
+\r
+package org.onap.optf.cmso;\r
+\r
+import org.quartz.spi.TriggerFiredBundle;\r
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;\r
+import org.springframework.context.ApplicationContext;\r
+import org.springframework.context.ApplicationContextAware;\r
+import org.springframework.scheduling.quartz.SpringBeanJobFactory;\r
+import com.att.eelf.configuration.EELFLogger;\r
+import com.att.eelf.configuration.EELFManager;\r
+\r
+/**\r
+ * This class makes it possible to use @Autowired references in QuartzJobBeans.\r
+ * \r
+ * Also enables @Autowire of the SchedulerFactoryBean the add Triggers\r
+ * for @Autowired QuartzJobBeans for ChangeManagement events. Making a big\r
+ * investment in SpringBoot Quartz. It had better work ;-)\r
+ *\r
+ */\r
+public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {\r
+    private static EELFLogger log = EELFManager.getInstance().getLogger(AutowiringSpringBeanJobFactory.class);\r
+\r
+    private transient AutowireCapableBeanFactory beanFactory;\r
+\r
+    @Override\r
+    public void setApplicationContext(final ApplicationContext context) {\r
+        beanFactory = context.getAutowireCapableBeanFactory();\r
+    }\r
+\r
+    @Override\r
+    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {\r
+        final Object job = super.createJobInstance(bundle);\r
+        log.info("create job instance");\r
+        beanFactory.autowireBean(job);\r
+        return job;\r
+    }\r
+}\r
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java b/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
new file mode 100644 (file)
index 0000000..d1ccb7e
--- /dev/null
@@ -0,0 +1,58 @@
+/*\r
+ * Copyright © 2017-2018 AT&T Intellectual Property.\r
+ * Modifications Copyright © 2018 IBM.\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * \r
+ * Unless otherwise specified, all documentation contained herein is licensed\r
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");\r
+ * you may not use this documentation except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         https://creativecommons.org/licenses/by/4.0/\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, documentation\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+*/\r
+\r
+package org.onap.optf.cmso;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import org.onap.optf.cmso.common.PropertiesManagement;\r
+import org.springframework.boot.SpringApplication;\r
+import org.springframework.boot.env.EnvironmentPostProcessor;\r
+import org.springframework.core.env.ConfigurableEnvironment;\r
+import org.springframework.core.env.MapPropertySource;\r
+import org.springframework.core.env.MutablePropertySources;\r
+\r
+public class CMSEnvironmentPostProcessor implements EnvironmentPostProcessor {\r
+\r
+    @Override\r
+    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {\r
+        String pwd = environment.getProperty("cmso.database.password");\r
+        if (pwd != null) {\r
+            pwd = PropertiesManagement.getDecryptedValue(pwd);\r
+            Map<String, Object> map = new HashMap<String, Object>();\r
+            map.put("spring.datasource.password", pwd);\r
+            MapPropertySource propertySource = new MapPropertySource("abc", map);\r
+            MutablePropertySources proeprtySources = environment.getPropertySources();\r
+            proeprtySources.addLast(propertySource);\r
+        }\r
+    }\r
+\r
+}\r
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/CMSQuartzConfiguration.java b/cmso-service/src/main/java/org/onap/optf/cmso/CMSQuartzConfiguration.java
new file mode 100644 (file)
index 0000000..5ae3f05
--- /dev/null
@@ -0,0 +1,129 @@
+/*\r
+ * Copyright © 2017-2018 AT&T Intellectual Property.\r
+ * Modifications Copyright © 2018 IBM.\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * \r
+ * Unless otherwise specified, all documentation contained herein is licensed\r
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");\r
+ * you may not use this documentation except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         https://creativecommons.org/licenses/by/4.0/\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, documentation\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+*/\r
+\r
+package org.onap.optf.cmso;\r
+\r
+import org.onap.optf.cmso.eventq.CmQuartzJob;\r
+import org.onap.optf.cmso.optimizer.OptimizerQuartzJob;\r
+import org.onap.optf.cmso.sostatus.ScheduleStatusJob;\r
+import org.quartz.spi.JobFactory;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.context.ApplicationContext;\r
+import org.springframework.context.annotation.Bean;\r
+import org.springframework.context.annotation.ComponentScan;\r
+import org.springframework.context.annotation.Configuration;\r
+import org.springframework.core.env.Environment;\r
+import org.springframework.scheduling.quartz.JobDetailFactoryBean;\r
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;\r
+import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;\r
+import org.springframework.transaction.annotation.EnableTransactionManagement;\r
+\r
+@Configuration\r
+@ComponentScan({"org.onap.optf.cmso"})\r
+@EnableTransactionManagement\r
+public class CMSQuartzConfiguration {\r
+\r
+    @Autowired\r
+    Environment env;\r
+\r
+    @Bean\r
+    public SimpleTriggerFactoryBean eventqTriggerFactoryBean() {\r
+\r
+        Integer interval = env.getProperty("cmso.cm.polling.job.interval.ms", Integer.class, 60000);\r
+        SimpleTriggerFactoryBean stFactory = new SimpleTriggerFactoryBean();\r
+        stFactory.setJobDetail(eventqDetailFactoryBean().getObject());\r
+        stFactory.setStartDelay(3000);\r
+        stFactory.setRepeatInterval(interval);\r
+        // Indefinitely\r
+        return stFactory;\r
+    }\r
+\r
+    @Bean\r
+    public JobDetailFactoryBean eventqDetailFactoryBean() {\r
+        JobDetailFactoryBean factory = new JobDetailFactoryBean();\r
+        factory.setJobClass(CmQuartzJob.class);\r
+        return factory;\r
+    }\r
+\r
+    @Bean\r
+    public SimpleTriggerFactoryBean statusTriggerFactoryBean() {\r
+\r
+        Integer interval = env.getProperty("cmso.status.job.interval.ms", Integer.class, 60000);\r
+        SimpleTriggerFactoryBean stFactory = new SimpleTriggerFactoryBean();\r
+        stFactory.setJobDetail(statusDetailFactoryBean().getObject());\r
+        stFactory.setStartDelay(3000);\r
+        stFactory.setRepeatInterval(interval);\r
+        // Indefinitely\r
+        return stFactory;\r
+    }\r
+\r
+    @Bean\r
+    public JobDetailFactoryBean statusDetailFactoryBean() {\r
+        JobDetailFactoryBean factory = new JobDetailFactoryBean();\r
+        factory.setJobClass(ScheduleStatusJob.class);\r
+        return factory;\r
+    }\r
+\r
+    @Bean\r
+    public SimpleTriggerFactoryBean optimizerTriggerFactoryBean() {\r
+\r
+        Integer interval = env.getProperty("cmso.optimizer.job.interval.ms", Integer.class, 60000);\r
+        SimpleTriggerFactoryBean stFactory = new SimpleTriggerFactoryBean();\r
+        stFactory.setJobDetail(optimizerDetailFactoryBean().getObject());\r
+        stFactory.setStartDelay(3000);\r
+        stFactory.setRepeatInterval(interval);\r
+        // Indefinitely\r
+        return stFactory;\r
+    }\r
+\r
+    @Bean\r
+    public JobDetailFactoryBean optimizerDetailFactoryBean() {\r
+        JobDetailFactoryBean factory = new JobDetailFactoryBean();\r
+        factory.setJobClass(OptimizerQuartzJob.class);\r
+        return factory;\r
+    }\r
+\r
+    @Bean\r
+    public JobFactory jobFactory(ApplicationContext applicationContext) {\r
+        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();\r
+        jobFactory.setApplicationContext(applicationContext);\r
+        return jobFactory;\r
+    }\r
+\r
+    @Bean\r
+    public SchedulerFactoryBean cmsoFactoryBean(JobFactory jobFactory) {\r
+        SchedulerFactoryBean cmso = new SchedulerFactoryBean();\r
+        cmso.setJobFactory(jobFactory);\r
+        cmso.setTriggers(eventqTriggerFactoryBean().getObject(), optimizerTriggerFactoryBean().getObject(),\r
+                statusTriggerFactoryBean().getObject());\r
+        return cmso;\r
+    }\r
+}\r
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java b/cmso-service/src/main/java/org/onap/optf/cmso/JerseyConfiguration.java
new file mode 100644 (file)
index 0000000..8d9cb60
--- /dev/null
@@ -0,0 +1,106 @@
+/*\r
+ * Copyright © 2017-2018 AT&T Intellectual Property.\r
+ * Modifications Copyright © 2018 IBM.\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * \r
+ * \r
+ * Unless otherwise specified, all documentation contained herein is licensed\r
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");\r
+ * you may not use this documentation except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ *         https://creativecommons.org/licenses/by/4.0/\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, documentation\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+*/\r
+\r
+package org.onap.optf.cmso;\r
+\r
+import java.util.logging.Logger;\r
+import javax.ws.rs.ApplicationPath;\r
+import javax.ws.rs.client.Client;\r
+import javax.ws.rs.client.ClientBuilder;\r
+import org.glassfish.jersey.client.ClientConfig;\r
+import org.glassfish.jersey.logging.LoggingFeature;\r
+import org.glassfish.jersey.server.ResourceConfig;\r
+import org.glassfish.jersey.servlet.ServletProperties;\r
+import org.onap.optf.cmso.dispatcher.rs.DispatcherServiceImpl;\r
+import org.onap.optf.cmso.filters.CMSOContainerFilters;\r
+import org.onap.optf.cmso.service.rs.AdminToolImpl;\r
+import org.onap.optf.cmso.service.rs.CMSCallbackImpl;\r
+import org.onap.optf.cmso.service.rs.CMSOServiceImpl;\r
+import org.onap.optf.cmso.service.rs.HealthCheckImpl;\r
+import org.onap.optf.cmso.test.loopback.SchedulerTestLoopbackServiceImpl;\r
+import org.onap.optf.cmso.test.loopback.TicketMgtLoopbackServiceImpl;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.context.annotation.Bean;\r
+import org.springframework.context.annotation.Primary;\r
+import org.springframework.stereotype.Component;\r
+import com.fasterxml.jackson.annotation.JsonInclude;\r
+import com.fasterxml.jackson.databind.DeserializationFeature;\r
+import com.fasterxml.jackson.databind.MapperFeature;\r
+import com.fasterxml.jackson.databind.ObjectMapper;\r
+import com.fasterxml.jackson.databind.SerializationFeature;\r
+\r
+@Component\r
+@ApplicationPath("/")\r
+public class JerseyConfiguration extends ResourceConfig {\r
+    private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());\r
+\r
+    @Bean\r
+    @Primary\r
+    public ObjectMapper objectMapper() {\r
+        ObjectMapper objectMapper = new ObjectMapper();\r
+        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);\r
+        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);\r
+        objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);\r
+        objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);\r
+        return objectMapper;\r
+    }\r
+\r
+    @Autowired\r
+    public JerseyConfiguration( /* LogRequestFilter lrf */ ) {\r
+        register(CMSOServiceImpl.class);\r
+        register(CMSCallbackImpl.class);\r
+        register(SchedulerTestLoopbackServiceImpl.class);\r
+        register(TicketMgtLoopbackServiceImpl.class);\r
+        register(HealthCheckImpl.class);\r
+        register(AdminToolImpl.class);\r
+        register(DispatcherServiceImpl.class);\r
+        property(ServletProperties.FILTER_FORWARD_ON_404, true);\r
+        // TODO: ONAP Conversion identify appropriate ONAP logging filters if any\r
+        // register(lrf, 6001);\r
+        // register(LogResponseFilter.class, 6004);\r
+\r
+        // TODO: Examine which logging features to enable\r
+        register(new LoggingFeature(log));\r
+        register(CMSOContainerFilters.class);\r
+    }\r
+\r
+    @Bean\r
+    public Client jerseyClient() {\r
+        ClientConfig client = new ClientConfig();\r
+\r
+        // TODO: ONAP Conversion identify appropriate ONAP logging filters if any\r
+        // client.register(TransactionIdRequestFilter.class);\r
+        // client.register(TransactionIdResponseFilter.class);\r
+        // client.register(DateTimeParamConverterProvider.class);\r
+\r
+        return ClientBuilder.newClient(client);\r
+    }\r
+}\r
diff --git a/cmso-service/src/main/resources/application.properties b/cmso-service/src/main/resources/application.properties
new file mode 100644 (file)
index 0000000..b6239c9
--- /dev/null
@@ -0,0 +1,55 @@
+#-------------------------------------------------------------------------------\r
+# Copyright © 2017-2018 AT&T Intellectual Property.\r
+# Modifications Copyright © 2018 IBM.\r
+# \r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+# \r
+#         http://www.apache.org/licenses/LICENSE-2.0\r
+# \r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+# \r
+# \r
+# Unless otherwise specified, all documentation contained herein is licensed\r
+# under the Creative Commons License, Attribution 4.0 Intl. (the â??Licenseâ?\9d);\r
+# you may not use this documentation except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+# \r
+#         https://creativecommons.org/licenses/by/4.0/\r
+# \r
+# Unless required by applicable law or agreed to in writing, documentation\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#-------------------------------------------------------------------------------\r
+\r
+info.build.artifact=@project.artifactId@\r
+info.build.name=@project.name@\r
+info.build.description=@project.description@\r
+info.build.version=@project.version@\r
+\r
+spring.jersey.type=filter\r
+spring.mvc.urls=swagger,docs,prometheus\r
+server.contextPath=/cmso\r
+\r
+#This property is used to set the Tomcat connector attributes.developers can define multiple attributes separated by comma\r
+#tomcat.connector.attributes=allowTrace-true\r
+\r
+#The max number of active threads in this pool\r
+server.tomcat.max-threads=200\r
+\r
+#The minimum number of threads always kept alive\r
+server.tomcat.min-spare-threads=25\r
+\r
+# External API port  \r
+server.port=8080\r
+# Internal dispatch port \r
+server.dispatchPort=8089\r
+\r
+kubernetes.namespace=org.onap.optf.cmso\r
diff --git a/cmso-service/src/main/resources/banner.txt b/cmso-service/src/main/resources/banner.txt
new file mode 100644 (file)
index 0000000..aa04dbb
--- /dev/null
@@ -0,0 +1,10 @@
+#-----------------------------------------------------------\r
+          ____  ____  ____________   ________  ________ ____ \r
+         / __ \/ __ \/_  __/ ____/  / ____/  |/  / ___// __ \\r
+        / / / / /_/ / / / / /_     / /   / /|_/ /\__ \/ / / /\r
+       / /_/ / ____/ / / / __/    / /___/ /  / /___/ / /_/ / \r
+       \____/_/     /_/ /_/       \____/_/  /_//____/\____/ \r
+\r
+${archetype.name}-Version:${archetype.version}\r
+\r
+#-----------------------------------------------------------
\ No newline at end of file
diff --git a/cmso-service/src/main/resources/logback.xml b/cmso-service/src/main/resources/logback.xml
new file mode 100644 (file)
index 0000000..d283b19
--- /dev/null
@@ -0,0 +1,377 @@
+<!--\r
+  Copyright © 2017-2018 AT&T Intellectual Property.\r
+  Modifications Copyright © 2018 IBM.\r
+  \r
+  Licensed under the Apache License, Version 2.0 (the "License");\r
+  you may not use this file except in compliance with the License.\r
+  You may obtain a copy of the License at\r
+  \r
+          http://www.apache.org/licenses/LICENSE-2.0\r
+  \r
+  Unless required by applicable law or agreed to in writing, software\r
+  distributed under the License is distributed on an "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  See the License for the specific language governing permissions and\r
+  limitations under the License.\r
+  \r
+  \r
+  Unless otherwise specified, all documentation contained herein is licensed\r
+  under the Creative Commons License, Attribution 4.0 Intl. (the "License");\r
+  you may not use this documentation except in compliance with the License.\r
+  You may obtain a copy of the License at\r
+  \r
+          https://creativecommons.org/licenses/by/4.0/\r
+  \r
+  Unless required by applicable law or agreed to in writing, documentation\r
+  distributed under the License is distributed on an "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  See the License for the specific language governing permissions and\r
+  limitations under the License.\r
+-->\r
+\r
+<configuration scan="true" scanPeriod="3 seconds" debug="false">\r
+\r
+       <statusListener class="ch.qos.logback.core.status.NopStatusListener" />\r
+       <property resource="application.properties" />\r
+       <property name="namespace" value="${kubernetes.namespace}"></property>\r
+       <!-- directory path for all other type logs -->\r
+       <property name="logDir" value="logs" />\r
+       <!-- directory path for debugging type logs -->\r
+       <property name="debugDir" value="debug-logs" />\r
+       <property name="logDirectory" value="${logDir}" />\r
+       <property name="debugLogDirectory" value="${debugDir}" />\r
+       <!-- log file names -->\r
+       <property name="generalLogName" value="application" />\r
+       <property name="securityLogName" value="security" />\r
+       <property name="performanceLogName" value="performance" />\r
+       <property name="serverLogName" value="server" />\r
+       <property name="policyLogName" value="policy" />\r
+       <property name="errorLogName" value="error" />\r
+       <property name="metricsLogName" value="metrics" />\r
+       <property name="auditLogName" value="audit" />\r
+       <property name="debugLogName" value="debug" />\r
+\r
+       <property name="defaultPattern"\r
+               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" />\r
+\r
+       <property name="performanceandAuditpattern"\r
+               value="%date{ISO8601,UTC}|%thread|%.-5level|namespace:${namespace}|%logger{20}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{serviceName}| %msg%n" />\r
+\r
+       <property name="auditLoggerPattern"\r
+               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" />\r
+\r
+       <property name="metricsLoggerPattern"\r
+               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" />\r
+\r
+       <property name="errorLoggerPattern"\r
+               value="%date{ISO8601,UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%.-5level|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />\r
+\r
+       <property name="debugLoggerPattern"\r
+               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" />\r
+\r
+       <appender name="STDOUT"\r
+               class="ch.qos.logback.core.ConsoleAppender">\r
+               <encoder>\r
+                       <pattern>${defaultPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+\r
+       <!-- ============================================================================ -->\r
+       <!-- EELF Appenders -->\r
+       <!-- ============================================================================ -->\r
+\r
+       <!-- The EELFAppender is used to record events to the general application \r
+               log -->\r
+\r
+       <appender name="EELF"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${generalLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${defaultPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+\r
+       <appender name="asyncEELF"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELF" />\r
+       </appender>\r
+\r
+       <!-- EELF Security Appender. This appender is used to record security events \r
+               to the security log file. Security events are separate from other loggers \r
+               in EELF so that security log records can be captured and managed in a secure \r
+               way separate from the other logs. This appender is set to never discard any \r
+               events. -->\r
+       <appender name="EELFSecurity"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${securityLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${defaultPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+\r
+       <appender name="asyncEELFSecurity"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <discardingThreshold>0</discardingThreshold>\r
+               <appender-ref ref="EELFSecurity" />\r
+       </appender>\r
+\r
+       <!-- EELF Performance Appender. This appender is used to record performance \r
+               records. -->\r
+       <appender name="EELFPerformance"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${performanceLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${defaultPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+       <appender name="asyncEELFPerformance"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELFPerformance" />\r
+       </appender>\r
+\r
+       <!-- EELF Server Appender. This appender is used to record Server related \r
+               logging events. The Server logger and appender are specializations of the \r
+               EELF application root logger and appender. This can be used to segregate \r
+               Server events from other components, or it can be eliminated to record these \r
+               events as part of the application root log. -->\r
+       <appender name="EELFServer"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${serverLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${defaultPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+       <appender name="asyncEELFServer"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELFServer" />\r
+       </appender>\r
+\r
+\r
+       <!-- EELF Policy Appender. This appender is used to record Policy engine \r
+               related logging events. The Policy logger and appender are specializations \r
+               of the EELF application root logger and appender. This can be used to segregate \r
+               Policy engine events from other components, or it can be eliminated to record \r
+               these events as part of the application root log. -->\r
+       <appender name="EELFPolicy"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${policyLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${defaultPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+       <appender name="asyncEELFPolicy"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELFPolicy" />\r
+       </appender>\r
+\r
+\r
+       <!-- EELF Audit Appender. This appender is used to record audit engine related \r
+               logging events. The audit logger and appender are specializations of the \r
+               EELF application root logger and appender. This can be used to segregate \r
+               Policy engine events from other components, or it can be eliminated to record \r
+               these events as part of the application root log. -->\r
+\r
+       <appender name="EELFAudit"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${auditLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${auditLoggerPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+       <appender name="asyncEELFAudit"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELFAudit" />\r
+       </appender>\r
+\r
+       <appender name="EELFMetrics"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${metricsLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${metricsLoggerPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+\r
+\r
+       <appender name="asyncEELFMetrics"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELFMetrics" />\r
+       </appender>\r
+\r
+       <appender name="EELFError"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${logDirectory}/${errorLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${errorLoggerPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+\r
+       <appender name="asyncEELFError"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELFError" />\r
+       </appender>\r
+\r
+       <appender name="EELFDebug"\r
+               class="ch.qos.logback.core.rolling.RollingFileAppender">\r
+               <file>${debugLogDirectory}/${debugLogName}.log</file>\r
+               <rollingPolicy\r
+                       class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
+                       <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip\r
+                       </fileNamePattern>\r
+                       <minIndex>1</minIndex>\r
+                       <maxIndex>9</maxIndex>\r
+               </rollingPolicy>\r
+               <triggeringPolicy\r
+                       class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
+                       <maxFileSize>5MB</maxFileSize>\r
+               </triggeringPolicy>\r
+               <encoder>\r
+                       <pattern>${debugLoggerPattern}</pattern>\r
+               </encoder>\r
+       </appender>\r
+\r
+       <appender name="asyncEELFDebug"\r
+               class="ch.qos.logback.classic.AsyncAppender">\r
+               <queueSize>256</queueSize>\r
+               <appender-ref ref="EELFDebug" />\r
+               <includeCallerData>true</includeCallerData>\r
+       </appender>\r
+\r
+\r
+       <!-- ============================================================================ -->\r
+       <!-- EELF loggers -->\r
+       <!-- ============================================================================ -->\r
+       <logger name="com.att.eelf" level="${EELF_LEVEL:-info}" additivity="false">\r
+               <appender-ref ref="asyncEELF" />\r
+       </logger>\r
+       <logger name="com.att.eelf.security" level="${DECURITY_LEVEL:-info}" additivity="false">\r
+               <appender-ref ref="asyncEELFSecurity" />\r
+       </logger>\r
+       <logger name="com.att.eelf.perf" level="${PERF_LEVEL:-info}" additivity="false">\r
+               <appender-ref ref="asyncEELFPerformance" />\r
+       </logger>\r
+       <logger name="com.att.eelf.server" level="${SERVER_LEVEL:-info}" additivity="false">\r
+               <appender-ref ref="asyncEELFServer" />\r
+       </logger>\r
+       <logger name="com.att.eelf.policy" level="${POLICY_LEVEL:-info}" additivity="false">\r
+               <appender-ref ref="asyncEELFPolicy" />\r
+       </logger>\r
+       <logger name="com.att.eelf.audit" level="${AUDIT_LEVEL:-info}" additivity="false">\r
+               <appender-ref ref="asyncEELFAudit" />\r
+       </logger>\r
+\r
+       <logger name="com.att.eelf.metrics" level="${METRICS_LEVEL:-info}" additivity="false">\r
+               <appender-ref ref="asyncEELFMetrics" />\r
+       </logger>\r
+\r
+       <logger name="com.att.eelf.error" level="${ERROR_LEVEL:-error}"\r
+               additivity="false">\r
+               <appender-ref ref="asyncEELFError" />\r
+       </logger>\r
+\r
+       <logger name="com.att.eelf.debug" level="${DEBUG_LEVEL:-debug}"\r
+               additivity="false">\r
+               <appender-ref ref="asyncEELFDebug" />\r
+       </logger>\r
+\r
+       <root level="${ROOT_LEVEL:-INFO}">\r
+               <!-- appender-ref ref="STDOUT" / -->\r
+               <appender-ref ref="asyncEELF" />\r
+       </root>\r
+\r
+</configuration>\r
diff --git a/cmso-service/src/main/resources/logmessages.properties b/cmso-service/src/main/resources/logmessages.properties
new file mode 100644 (file)
index 0000000..09d9312
--- /dev/null
@@ -0,0 +1,83 @@
+#-------------------------------------------------------------------------------\r
+# Copyright © 2017-2018 AT&T Intellectual Property.\r
+# Modifications Copyright © 2018 IBM.\r
+# \r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+# \r
+#         http://www.apache.org/licenses/LICENSE-2.0\r
+# \r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+# \r
+# \r
+# Unless otherwise specified, all documentation contained herein is licensed\r
+# under the Creative Commons License, Attribution 4.0 Intl. (the â??Licenseâ?\9d);\r
+# you may not use this documentation except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+# \r
+#         https://creativecommons.org/licenses/by/4.0/\r
+# \r
+# Unless required by applicable law or agreed to in writing, documentation\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#-------------------------------------------------------------------------------\r
+\r
+# Generated from org.onap.optf.cmso.common.LogMessages\r
+SEARCH_SCHEDULE_REQUEST_DETAILS SEARCH_SCHEDULE_REQUEST_DETAILS|Search Schedule Request Details {0} from {1}: {2}|No resolution needed|No action is required\r
+SEARCH_SCHEDULE_REQUEST SEARCH_SCHEDULE_REQUEST|Search Schedule Request {0} from {1}: {2} : {3}|No resolution needed|No action is required\r
+CREATE_SCHEDULE_REQUEST CREATE_SCHEDULE_REQUEST|Create Schedule Request {0} from {1}: {2} : {3}|No resolution needed|No action is required\r
+DELETE_SCHEDULE_REQUEST DELETE_SCHEDULE_REQUEST|Delete Schedule Request {0} from {1}: {2} : {3}|No resolution needed|No action is required\r
+GET_SCHEDULE_REQUEST_INFO GET_SCHEDULE_REQUEST_INFO|Get Schedule Request Info {0} from {1}: {2} : {3}|No resolution needed|No action is required\r
+PROCESS_OPTIMIZER_CALLBACK PROCESS_OPTIMIZER_CALLBACK|Change management optimizer callback {0} from {1}: {2} |No resolution needed|No action is required\r
+APPROVE_SCHEDULE_REQUEST APPROVE_SCHEDULE_REQUEST|Approve Schedule Request {0} from {1}: {2} : {3}|No resolution needed|No action is required\r
+SCHEDULE_ALREADY_EXISTS SCHEDULE_ALREADY_EXISTS|Schedule already exists domain={0} schedule id={1}|No resolution needed|No action is required\r
+SCHEDULE_NOT_FOUND SCHEDULE_NOT_FOUND|Schedule not found domain={0} schedule id={1}|No resolution needed|No action is required\r
+INVALID_ATTRIBUTE INVALID_ATTRIBUTE|Invalid attribute {0}={1}|No resolution needed|No action is required\r
+MISSING_REQUIRED_ATTRIBUTE MISSING_REQUIRED_ATTRIBUTE|Missing required attribute '{0}'|No resolution needed|No action is required\r
+INVALID_REQUEST INVALID_REQUEST|The input data structure is incorrect|No resolution needed|No action is required\r
+REQUEST_TIMED_OUT REQUEST_TIMED_OUT|Request timed out.|No resolution needed|No action is required\r
+UNEXPECTED_EXCEPTION UNEXPECTED_EXCEPTION|Unexpected exception encountered during processing. Please contact support : {0}|No resolution needed|No action is required\r
+AUTHORIZATION_FAILED AUTHORIZATION_FAILED|Authorization Failed|No resolution needed|No action is required\r
+UNDEFINED_DOMAIN_DATA_ATTRIBUTE UNDEFINED_DOMAIN_DATA_ATTRIBUTE|Domain data attribute not defined domain={0} name={1} value={2}|No resolution needed|No action is required\r
+UNDEFINED_FILTER_ATTRIBUTE UNDEFINED_FILTER_ATTRIBUTE|Undefined filter attribute {0}|No resolution needed|No action is required\r
+INVALID_DATE_FILTER INVALID_DATE_FILTER|Invalid date filter provided {0}=(1}|No resolution needed|No action is required\r
+OPTIMIZER_QUARTZ_JOB OPTIMIZER_QUARTZ_JOB|Quartz scheduling of OptimizerQuartzJob: {0}|No resolution needed|No action is required\r
+OPTIMIZER_EXCEPTION OPTIMIZER_EXCEPTION|Exception making client call to optimizer {0}|No resolution needed|No action is required\r
+OPTIMIZER_CALLBACK_STATE_ERROR OPTIMIZER_CALLBACK_STATE_ERROR|Optimizer callback on schedule in invalid state. Should be {0} but was {1}.|No resolution needed|No action is required\r
+CHANGE_MANAGEMENT_GROUP_NOT_FOUND CHANGE_MANAGEMENT_GROUP_NOT_FOUND|ChangeManagementGroup not found on optimizer callback scheduleId={0} groupId={1}|No resolution needed|No action is required\r
+UNABLE_TO_ALLOCATE_VNF_TIMESLOTS UNABLE_TO_ALLOCATE_VNF_TIMESLOTS|Unable to allocate VNF timeslots with Optimizer results startTime={0}, latestStartTime={1}, totalDuration={2}, concurrency={3} nvfs={4}|No resolution needed|No action is required\r
+UNABLE_TO_LOCATE_SCHEDULE_DETAIL UNABLE_TO_LOCATE_SCHEDULE_DETAIL|Unable to locate ChangeManagementSchedule for VNF. scheduleId={0}, groupId={1}, vnfName={2}|No resolution needed|No action is required\r
+CM_JOB CM_JOB|Quartz scheduling of CmJob: {0}|No resolution needed|No action is required\r
+CM_QUARTZ_JOB CM_QUARTZ_JOB|Quartz scheduling of CmQuartzJob: {0}|No resolution needed|No action is required\r
+NOT_PENDING_APPROVAL NOT_PENDING_APPROVAL|Approval request received for schedule that is not in Pending Approval state: domain={0} scheduleId={1} state={3}|No resolution needed|No action is required\r
+SCHEDULE_PAST_DUE SCHEDULE_PAST_DUE|Attempt to dispatch an event that is Past due scheduleId={0}, vnf={1}, now={2}, startTime={3}|No resolution needed|No action is required\r
+MSO_POLLING_MISSING_SCHEDULE MSO_POLLING_MISSING_SCHEDULE|Attempt to poll MSO for request id {1} for missing ChangeManagementSchedule id={0}|No resolution needed|No action is required\r
+MSO_STATUS_JOB MSO_STATUS_JOB|Polling MSO {0} for requestId={1} for id={2}|No resolution needed|No action is required\r
+UNEXPECTED_RESPONSE UNEXPECTED_RESPONSE|Unexpected response from {0} HTTP Status={1} : {2}|No resolution needed|No action is required\r
+SCHEDULE_STATUS_JOB SCHEDULE_STATUS_JOB|Quartz scheduling of ScheduleStatusJob: {0}|No resolution needed|No action is required\r
+CM_TICKET_NOT_APPROVED CM_TICKET_NOT_APPROVED|Attempt to dispatch a change management event that has no TM Ticket approved. scheduleId={0} VNF Name={1} TM ChangeId={2} Status={3} Approval Status={4}|No resolution needed|No action is required\r
+MULTIPLE_GROUPS_NOT_SUPPORTED MULTIPLE_GROUPS_NOT_SUPPORTED|Multiple groups not supported on immediate requests|No resolution needed|No action is required\r
+TM_CREATE_CHANGE_RECORD TM_CREATE_CHANGE_RECORD|TM Create Change Record:{0} : Schedule ID: {1}|No resolution needed|No action is required\r
+TM_LIST TM_LIST|TM list:{0} : URL : {1}|No resolution needed|No action is required\r
+TM_API TM_API|TM API Call: URL : {0}|No resolution needed|No action is required\r
+UNABLE_TO_CREATE_CHANGE_TICKET UNABLE_TO_CREATE_CHANGE_TICKET|Unable to create change ticket in TM: Schedule ID: {0} : Reason : {1}|No resolution needed|No action is required\r
+TM_UPDATE_CHECKLIST TM_UPDATE_CHECKLIST|TM Fetch Checklist:{0} : Schedule ID: {1} : Change Id : {2} : URL : {3}|No resolution needed|No action is required\r
+OPTIMIZER_REQUEST OPTIMIZER_REQUEST|Optimi Request:{0} : Schedule ID: {1} : URL : {2}|No resolution needed|No action is required\r
+TM_CLOSE_CHANGE_RECORD TM_CLOSE_CHANGE_RECORD|TM Close Change Record:{0} : Schedule ID: {1} : Change Id : {2}|No resolution needed|No action is required\r
+UNABLE_TO_CLOSE_CHANGE_TICKET UNABLE_TO_CLOSE_CHANGE_TICKET|Unable to close change ticket in TM:  Schedule ID: {0} : changeid: {1} :  Reason: {2}|No resolution needed|No action is required\r
+CANNOT_CANCEL_IN_PROGRESS CANNOT_CANCEL_IN_PROGRESS|Cannot delete/cancel a schedule with events in progress.|No resolution needed|No action is required\r
+UNABLE_TO_PARSE_SCHEDULING_INFO UNABLE_TO_PARSE_SCHEDULING_INFO|Cannot parse scheduling info.|No resolution needed|No action is required\r
+UNABLE_TO_LOCATE_CHANGE_RECORD UNABLE_TO_LOCATE_CHANGE_RECORD|Unable to locate TM change record {2} to check status before displacth of {1} for schedulId={0}|No resolution needed|No action is required\r
+INVALID_CHANGE_WINDOW INVALID_CHANGE_WINDOW|Change window end time {1} must be after start time {0}|No resolution needed|No action is required\r
+NODE_LIST_CONTAINS_EMTPY_NODE NODE_LIST_CONTAINS_EMTPY_NODE|vnfDetails node list contains at least one empty node.|No resolution needed|No action is required\r
+SO_API SO_API|SO Poll Request {0}|No resolution needed|No action is required\r
+EXPECTED_EXCEPTION EXPECTED_EXCEPTION|Expected exception encountered during processing. Make Sonar happy: {0}|No resolution needed|No action is required\r
+TM_UPDATE_CHANGE_RECORD TM_UPDATE_CHANGE_RECORD|TM Update Change Record:{0} : Schedule ID: {1} : Change Id : {2} : URL : {3}|No resolution needed|No action is required\r
+UNABLE_TO_UPDATE_CHANGE_TICKET UNABLE_TO_UPDATE_CHANGE_TICKET|Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} :  Reason: {2}|No resolution needed|No action is required\r
diff --git a/cmso-service/src/main/resources/swagger-ui/dist/swagger.json b/cmso-service/src/main/resources/swagger-ui/dist/swagger.json
new file mode 100644 (file)
index 0000000..95bd771
--- /dev/null
@@ -0,0 +1,1161 @@
+{\r
+  "swagger" : "2.0",\r
+  "info" : {\r
+    "version" : "0.1.0-SNAPSHOT",\r
+    "title" : "cmso"\r
+  },\r
+  "basePath" : "/cmso",\r
+  "paths" : {\r
+    "/{apiVersion}/admin/{id}" : {\r
+      "get" : {\r
+        "summary" : "",\r
+        "description" : "Returns encrypted value of id.",\r
+        "operationId" : "exec",\r
+        "produces" : [ "text/plain" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1|v2",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "id",\r
+          "in" : "path",\r
+          "description" : "Identifier",\r
+          "required" : true,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "csv"\r
+        } ],\r
+        "responses" : {\r
+          "200" : {\r
+            "description" : "OK",\r
+            "schema" : {\r
+              "type" : "string"\r
+            }\r
+          },\r
+          "400" : {\r
+            "description" : "Request failed"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "/{apiVersion}/health" : {\r
+      "get" : {\r
+        "summary" : "",\r
+        "description" : "Returns health status of server.",\r
+        "operationId" : "healthCheck",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "checkInterfaces",\r
+          "in" : "query",\r
+          "description" : "Check Interfaces",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "boolean",\r
+            "default" : true\r
+          },\r
+          "collectionFormat" : "multi"\r
+        } ],\r
+        "responses" : {\r
+          "200" : {\r
+            "description" : "OK",\r
+            "schema" : {\r
+              "$ref" : "#/definitions/HealthCheckMessage"\r
+            }\r
+          },\r
+          "400" : {\r
+            "description" : "Not healthy",\r
+            "schema" : {\r
+              "$ref" : "#/definitions/HealthCheckMessage"\r
+            }\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "/{apiVersion}/optimizerCallback" : {\r
+      "post" : {\r
+        "summary" : "",\r
+        "description" : "Processes optimizer results callback to a Pending Optimization schedule.",\r
+        "operationId" : "sniroCallback",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "in" : "body",\r
+          "name" : "body",\r
+          "description" : "Return schedules > lastScheduleId",\r
+          "required" : false,\r
+          "schema" : {\r
+            "$ref" : "#/definitions/Response from schedule optimizer"\r
+          }\r
+        } ],\r
+        "responses" : {\r
+          "200" : {\r
+            "description" : "OK"\r
+          },\r
+          "500" : {\r
+            "description" : "Unexpected Runtime error"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "/{apiVersion}/schedules" : {\r
+      "get" : {\r
+        "summary" : "",\r
+        "description" : "Returns a list of Scheduler Requests based upon the filter criteria.",\r
+        "operationId" : "searchScheduleRequests",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "includeDetails",\r
+          "in" : "query",\r
+          "description" : "Include details",\r
+          "required" : false,\r
+          "type" : "boolean",\r
+          "default" : false\r
+        }, {\r
+          "name" : "scheduleId",\r
+          "in" : "query",\r
+          "description" : "Schedule identifier",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "scheduleName",\r
+          "in" : "query",\r
+          "description" : "Schedule name",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "userId",\r
+          "in" : "query",\r
+          "description" : "SCheduler creator User id of ",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "status",\r
+          "in" : "query",\r
+          "description" : "Schedule status",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "createDateTime",\r
+          "in" : "query",\r
+          "description" : "Creation date and time (<low date>[,<hi date>])",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "optimizerStatus",\r
+          "in" : "query",\r
+          "description" : "Optimizer status",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "WorkflowName",\r
+          "in" : "query",\r
+          "description" : "Workflow",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        } ],\r
+        "responses" : {\r
+          "200" : {\r
+            "description" : "OK",\r
+            "schema" : {\r
+              "type" : "array",\r
+              "items" : {\r
+                "$ref" : "#/definitions/Schedule"\r
+              }\r
+            }\r
+          },\r
+          "404" : {\r
+            "description" : "No records found",\r
+            "schema" : {\r
+              "$ref" : "#/definitions/CMSRequestError"\r
+            }\r
+          },\r
+          "500" : {\r
+            "description" : "Unexpected Runtime error"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "/{apiVersion}/schedules/scheduleDetails" : {\r
+      "get" : {\r
+        "summary" : "",\r
+        "description" : "Returns a list of Schedule request details based upon the filter criteria.",\r
+        "operationId" : "searchScheduleRequestDetails",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "request.scheduleId",\r
+          "in" : "query",\r
+          "description" : "Schedule identifier",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.scheduleName",\r
+          "in" : "query",\r
+          "description" : "Schedule name",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.userId",\r
+          "in" : "query",\r
+          "description" : "Scheduler creator User id of ",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.status",\r
+          "in" : "query",\r
+          "description" : "Schedule status",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.createDateTime",\r
+          "in" : "query",\r
+          "description" : "Creation date and time (<low date>[,<hi date>])",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.optimizerStatus",\r
+          "in" : "query",\r
+          "description" : "Optimizer status",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.approvalUserId",\r
+          "in" : "query",\r
+          "description" : "Request Approval user id",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.approvalStatus",\r
+          "in" : "query",\r
+          "description" : "Request Approval status",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "request.approvalType",\r
+          "in" : "query",\r
+          "description" : "Request Approval type",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "WorkflowName",\r
+          "in" : "query",\r
+          "description" : "Workflow",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "vnfName",\r
+          "in" : "query",\r
+          "description" : "VNF Name",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "vnfId",\r
+          "in" : "query",\r
+          "description" : "VNF Id",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "vnfStatus",\r
+          "in" : "query",\r
+          "description" : "VNF Status",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "startTime",\r
+          "in" : "query",\r
+          "description" : "Start time <low>,<high>",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "finishTime",\r
+          "in" : "query",\r
+          "description" : "Finish time <low>,<high>",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "lastInstanceTime",\r
+          "in" : "query",\r
+          "description" : "Last instance start time <low>,<high>",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "tmChangeId",\r
+          "in" : "query",\r
+          "description" : "TM Change Ticket Change Id",\r
+          "required" : false,\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          },\r
+          "collectionFormat" : "multi"\r
+        }, {\r
+          "name" : "maxSchedules",\r
+          "in" : "query",\r
+          "description" : "Maximum number of schedules to return",\r
+          "required" : false,\r
+          "type" : "integer",\r
+          "format" : "int32"\r
+        }, {\r
+          "name" : "lastScheduleId",\r
+          "in" : "query",\r
+          "description" : "Return schedules > lastScheduleId",\r
+          "required" : false,\r
+          "type" : "string"\r
+        }, {\r
+          "name" : "request.concurrencyLimit",\r
+          "in" : "query",\r
+          "description" : "Return concurrencyLimit",\r
+          "required" : false,\r
+          "type" : "integer",\r
+          "format" : "int32"\r
+        } ],\r
+        "responses" : {\r
+          "200" : {\r
+            "description" : "OK",\r
+            "schema" : {\r
+              "type" : "array",\r
+              "items" : {\r
+                "$ref" : "#/definitions/CmDetailsMessage"\r
+              }\r
+            }\r
+          },\r
+          "404" : {\r
+            "description" : "No records found",\r
+            "schema" : {\r
+              "$ref" : "#/definitions/CMSRequestError"\r
+            }\r
+          },\r
+          "500" : {\r
+            "description" : "Unexpected Runtime error"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "/{apiVersion}/schedules/{scheduleId}" : {\r
+      "get" : {\r
+        "summary" : "",\r
+        "description" : "Retrieve the schedule request for scheduleId",\r
+        "operationId" : "getScheduleRequestInfo",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "scheduleId",\r
+          "in" : "path",\r
+          "description" : "Schedule id to uniquely identify the schedule info being retrieved.",\r
+          "required" : true,\r
+          "type" : "string"\r
+        } ],\r
+        "responses" : {\r
+          "200" : {\r
+            "description" : "OK",\r
+            "schema" : {\r
+              "$ref" : "#/definitions/Schedule"\r
+            }\r
+          },\r
+          "404" : {\r
+            "description" : "No record found"\r
+          },\r
+          "500" : {\r
+            "description" : "Unexpected Runtime error"\r
+          }\r
+        }\r
+      },\r
+      "post" : {\r
+        "summary" : "",\r
+        "description" : "Creates a schedule request for scheduleId",\r
+        "operationId" : "createScheduleRequest",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "scheduleId",\r
+          "in" : "path",\r
+          "description" : "Schedule id to uniquely identify the schedule request being created.",\r
+          "required" : true,\r
+          "type" : "string"\r
+        }, {\r
+          "in" : "body",\r
+          "name" : "body",\r
+          "description" : "Data for creating a schedule request for the given schedule id",\r
+          "required" : false,\r
+          "schema" : {\r
+            "$ref" : "#/definitions/CMSMessage"\r
+          }\r
+        } ],\r
+        "responses" : {\r
+          "202" : {\r
+            "description" : "Schedule request accepted for optimization."\r
+          },\r
+          "409" : {\r
+            "description" : "Schedule request already exists for this schedule id.",\r
+            "schema" : {\r
+              "$ref" : "#/definitions/CMSRequestError"\r
+            }\r
+          },\r
+          "500" : {\r
+            "description" : "Unexpected Runtime error"\r
+          }\r
+        }\r
+      },\r
+      "delete" : {\r
+        "summary" : "",\r
+        "description" : "Cancels the schedule request for scheduleId",\r
+        "operationId" : "deleteScheduleRequest",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "scheduleId",\r
+          "in" : "path",\r
+          "description" : "Schedule id to uniquely identify the schedule request being deleted.",\r
+          "required" : true,\r
+          "type" : "string"\r
+        } ],\r
+        "responses" : {\r
+          "204" : {\r
+            "description" : "Delete successful"\r
+          },\r
+          "404" : {\r
+            "description" : "No record found",\r
+            "schema" : {\r
+              "$ref" : "#/definitions/CMSRequestError"\r
+            }\r
+          },\r
+          "500" : {\r
+            "description" : "Unexpected Runtime error"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "/{apiVersion}/schedules/{scheduleId}/approvals" : {\r
+      "post" : {\r
+        "summary" : "",\r
+        "description" : "Adds an accept/reject approval status to the schedule request identified by scheduleId",\r
+        "operationId" : "approveScheduleRequest",\r
+        "produces" : [ "application/json" ],\r
+        "parameters" : [ {\r
+          "name" : "apiVersion",\r
+          "in" : "path",\r
+          "description" : "v1",\r
+          "required" : true,\r
+          "type" : "string",\r
+          "default" : "v1"\r
+        }, {\r
+          "name" : "scheduleId",\r
+          "in" : "path",\r
+          "description" : "Schedule id to uniquely identify the schedule request being accepted or rejected.",\r
+          "required" : true,\r
+          "type" : "string"\r
+        }, {\r
+          "in" : "body",\r
+          "name" : "body",\r
+          "description" : "Accept or reject approval message",\r
+          "required" : false,\r
+          "schema" : {\r
+            "$ref" : "#/definitions/Schedule Approval Request"\r
+          }\r
+        } ],\r
+        "responses" : {\r
+          "200" : {\r
+            "description" : "OK"\r
+          },\r
+          "404" : {\r
+            "description" : "No record found"\r
+          },\r
+          "500" : {\r
+            "description" : "Unexpected Runtime error"\r
+          }\r
+        }\r
+      }\r
+    }\r
+  },\r
+  "definitions" : {\r
+    "CMSMessage" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "domain" : {\r
+          "type" : "string",\r
+          "description" : "Schedule domain : ChangeManagement"\r
+        },\r
+        "scheduleId" : {\r
+          "type" : "string",\r
+          "description" : "Schedule id that must be unique within the domain. Use of UUID is highly recommended."\r
+        },\r
+        "scheduleName" : {\r
+          "type" : "string",\r
+          "description" : "User provided name of the schedule (deaults to scheduleId"\r
+        },\r
+        "userId" : {\r
+          "type" : "string",\r
+          "description" : "ATTUID of the user requesting the schedule."\r
+        },\r
+        "domainData" : {\r
+          "type" : "array",\r
+          "description" : "Domain data as name value/pairs. (i.e. CallbackUrl, CallbackData, WorkflowName)",\r
+          "items" : {\r
+            "type" : "object",\r
+            "additionalProperties" : {\r
+              "type" : "string"\r
+            }\r
+          }\r
+        },\r
+        "schedulingInfo" : {\r
+          "$ref" : "#/definitions/Change Management Scheduling Info"\r
+        }\r
+      }\r
+    },\r
+    "CMSRequestError" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "requestError" : {\r
+          "$ref" : "#/definitions/RequestError"\r
+        }\r
+      }\r
+    },\r
+    "CMSchedule" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "groupId" : {\r
+          "type" : "string"\r
+        },\r
+        "startTime" : {\r
+          "type" : "string"\r
+        },\r
+        "finishTime" : {\r
+          "type" : "string"\r
+        },\r
+        "latestInstanceStartTime" : {\r
+          "type" : "string"\r
+        },\r
+        "node" : {\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "Change Management Group" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "finishTime" : {\r
+          "type" : "string",\r
+          "description" : "Date/time by which all of the workflows should be completed."\r
+        },\r
+        "groupId" : {\r
+          "type" : "string",\r
+          "description" : "Name of the group of VNFs to be scheduled"\r
+        },\r
+        "lastInstanceStartTime" : {\r
+          "type" : "string",\r
+          "description" : "The latest date/time by which a workflow is to be started."\r
+        },\r
+        "startTime" : {\r
+          "type" : "string",\r
+          "description" : "The date/time when workflows are to be started."\r
+        },\r
+        "additionalDurationInSecs" : {\r
+          "type" : "integer",\r
+          "format" : "int32",\r
+          "description" : "Time added to the workflow interval to allow for rollback in case of failure."\r
+        },\r
+        "concurrencyLimit" : {\r
+          "type" : "integer",\r
+          "format" : "int32",\r
+          "description" : "The maximum number of workflows that should be started simultaneiously."\r
+        },\r
+        "normalDurationInSecs" : {\r
+          "type" : "integer",\r
+          "format" : "int32",\r
+          "description" : "Expected duration of a successful workflow execution."\r
+        },\r
+        "policyId" : {\r
+          "type" : "string",\r
+          "description" : "The name of the schedule optimization policy used by the change management schedule optimizer."\r
+        },\r
+        "changeManagementSchedules" : {\r
+          "type" : "array",\r
+          "description" : "The list of VNF workflows scheduled.",\r
+          "items" : {\r
+            "$ref" : "#/definitions/Change Management Schedule"\r
+          }\r
+        }\r
+      },\r
+      "description" : "Scheduling critirea for a group of VNFs"\r
+    },\r
+    "Change Management Schedule" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "tmChangeId" : {\r
+          "type" : "string",\r
+          "description" : "TM Change Id"\r
+        },\r
+        "tmStatus" : {\r
+          "type" : "string",\r
+          "description" : "TM ticket status",\r
+          "enum" : [ "<null>", "Closed" ]\r
+        },\r
+        "tmApprovalStatus" : {\r
+          "type" : "string",\r
+          "description" : "TM ticket approval status",\r
+          "enum" : [ "<null>", "Approved" ]\r
+        },\r
+        "finishTime" : {\r
+          "type" : "string",\r
+          "description" : "Anticipated time of completion based upon start time and duration"\r
+        },\r
+        "startTime" : {\r
+          "type" : "string",\r
+          "description" : "Start time of this VNF workflow assigned by Scheduler based upon the group start time returned by the optimizer and concurrency."\r
+        },\r
+        "status" : {\r
+          "type" : "string",\r
+          "description" : "Status of the VNF.",\r
+          "enum" : [ "See CMSStatusEnum" ]\r
+        },\r
+        "vnfName" : {\r
+          "type" : "string",\r
+          "description" : "Name of the VNF."\r
+        },\r
+        "dispatchTime" : {\r
+          "type" : "string",\r
+          "description" : "Actual time the VNF workflow was dispatched."\r
+        },\r
+        "executionCompletedTime" : {\r
+          "type" : "string",\r
+          "description" : "Actual time the VNF workflow execution was completed as reported by MSO."\r
+        },\r
+        "msoRequestId" : {\r
+          "type" : "string",\r
+          "description" : "MSO Request ID of the workflow returned at dispatch time."\r
+        },\r
+        "msoStatus" : {\r
+          "type" : "string",\r
+          "description" : "Final MSO status.",\r
+          "enum" : [ "COMPLETED", "FAILED" ]\r
+        },\r
+        "msoMessage" : {\r
+          "type" : "string",\r
+          "description" : "MSO final status message."\r
+        },\r
+        "statusMessage" : {\r
+          "type" : "string",\r
+          "description" : "Scheduler status message."\r
+        },\r
+        "msoTime" : {\r
+          "type" : "string",\r
+          "description" : "Time of last poll for MSO status."\r
+        }\r
+      },\r
+      "description" : "VNF details for Change Management Schedule"\r
+    },\r
+    "Change Management Scheduling Info" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "normalDurationInSeconds" : {\r
+          "type" : "integer",\r
+          "format" : "int32",\r
+          "description" : "Expected duration (in seconds) of a successful execution of a single VNF change."\r
+        },\r
+        "additionalDurationInSeconds" : {\r
+          "type" : "integer",\r
+          "format" : "int32",\r
+          "description" : "Additional duration (in seconds) to be added to support backout of an unsuccessful VNF change."\r
+        },\r
+        "concurrencyLimit" : {\r
+          "type" : "integer",\r
+          "format" : "int32",\r
+          "description" : "Maximum number of VNF changes to schedule concurrently"\r
+        },\r
+        "policyId" : {\r
+          "type" : "string",\r
+          "description" : "Name of schedule optimization policy used by the change management cmso optimizer to determine available time slot"\r
+        },\r
+        "vnfDetails" : {\r
+          "type" : "array",\r
+          "description" : "Lists of the VNFs to be changed and the desired change windows",\r
+          "items" : {\r
+            "$ref" : "#/definitions/VNF Details"\r
+          }\r
+        }\r
+      },\r
+      "description" : "Details of schedule being requested"\r
+    },\r
+    "Change Window" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "startTime" : {\r
+          "type" : "string",\r
+          "description" : "Earliest time that a set of changes may begin."\r
+        },\r
+        "endTime" : {\r
+          "type" : "string",\r
+          "description" : "Latest time by which all changes must be completed"\r
+        }\r
+      },\r
+      "description" : "Time window within which the scheduler optimizer can schedule the changes for the  group of NVFs"\r
+    },\r
+    "CmDetailsMessage" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "vnfName" : {\r
+          "type" : "string",\r
+          "description" : "Name of the VNF."\r
+        },\r
+        "status" : {\r
+          "type" : "string",\r
+          "description" : "Status of the VNF.",\r
+          "enum" : [ "See CMSStatusEnum" ]\r
+        },\r
+        "tmChangeId" : {\r
+          "type" : "string",\r
+          "description" : "TM Change Id"\r
+        },\r
+        "tmStatus" : {\r
+          "type" : "string",\r
+          "description" : "TM ticket status",\r
+          "enum" : [ "<null>", "Closed" ]\r
+        },\r
+        "tmApprovalStatus" : {\r
+          "type" : "string",\r
+          "description" : "TM ticket approval status",\r
+          "enum" : [ "<null>", "Approved" ]\r
+        },\r
+        "startTime" : {\r
+          "type" : "string",\r
+          "description" : "Start time of this VNF workflow assigned by Scheduler based upon the group start time returned by the optimizer and concurrency."\r
+        },\r
+        "finishTime" : {\r
+          "type" : "string",\r
+          "description" : "Anticipated time of completion based upon start time and duration"\r
+        },\r
+        "groupId" : {\r
+          "type" : "string",\r
+          "description" : "Name of the group of VNFs to be scheduled"\r
+        },\r
+        "lastInstanceStartTime" : {\r
+          "type" : "string",\r
+          "description" : "The latest date/time by which a workflow is to be started."\r
+        },\r
+        "policyId" : {\r
+          "type" : "string",\r
+          "description" : "Time of last poll for MSO status."\r
+        },\r
+        "dispatchTime" : {\r
+          "type" : "string",\r
+          "description" : "Actual time the VNF workflow was dispatched."\r
+        },\r
+        "executionCompletedTime" : {\r
+          "type" : "string",\r
+          "description" : "Actual time the VNF workflow execution was completed as reported by MSO."\r
+        },\r
+        "msoRequestId" : {\r
+          "type" : "string",\r
+          "description" : "MSO Request ID of the workflow returned at dispatch time."\r
+        },\r
+        "msoStatus" : {\r
+          "type" : "string",\r
+          "description" : "Final MSO status.",\r
+          "enum" : [ "COMPLETED", "FAILED" ]\r
+        },\r
+        "msoMessage" : {\r
+          "type" : "string",\r
+          "description" : "MSO final status message."\r
+        },\r
+        "statusMessage" : {\r
+          "type" : "string",\r
+          "description" : "Scheduler status message."\r
+        },\r
+        "msoTime" : {\r
+          "type" : "string",\r
+          "description" : "Time of last poll for MSO status."\r
+        },\r
+        "scheduleRequest" : {\r
+          "$ref" : "#/definitions/Schedule"\r
+        },\r
+        "approvals" : {\r
+          "type" : "array",\r
+          "items" : {\r
+            "$ref" : "#/definitions/Schedule Approval Request"\r
+          }\r
+        },\r
+        "schedulesId" : {\r
+          "type" : "integer",\r
+          "format" : "int32"\r
+        }\r
+      }\r
+    },\r
+    "Domain data" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "name" : {\r
+          "type" : "string"\r
+        },\r
+        "value" : {\r
+          "type" : "string"\r
+        }\r
+      },\r
+      "description" : "Domain specific data represented as name/value pairs"\r
+    },\r
+    "HealthCheckComponent" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "name" : {\r
+          "type" : "string"\r
+        },\r
+        "url" : {\r
+          "type" : "string"\r
+        },\r
+        "status" : {\r
+          "type" : "string"\r
+        },\r
+        "healthy" : {\r
+          "type" : "boolean"\r
+        }\r
+      }\r
+    },\r
+    "HealthCheckMessage" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "healthy" : {\r
+          "type" : "boolean"\r
+        },\r
+        "buildInfo" : {\r
+          "type" : "string"\r
+        },\r
+        "currentTime" : {\r
+          "type" : "string"\r
+        },\r
+        "hostname" : {\r
+          "type" : "string"\r
+        },\r
+        "components" : {\r
+          "type" : "array",\r
+          "items" : {\r
+            "$ref" : "#/definitions/HealthCheckComponent"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "RequestError" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "messageId" : {\r
+          "type" : "string"\r
+        },\r
+        "text" : {\r
+          "type" : "string"\r
+        },\r
+        "variables" : {\r
+          "type" : "array",\r
+          "items" : {\r
+            "type" : "string"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "Response from schedule optimizer" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "transactionId" : {\r
+          "type" : "string",\r
+          "description" : "Unique id of optimization request."\r
+        },\r
+        "scheduleId" : {\r
+          "type" : "string",\r
+          "description" : "Schedule id for which the optimization request was executed."\r
+        },\r
+        "requestState" : {\r
+          "type" : "string",\r
+          "description" : "State of the request as reported by the optimizer."\r
+        },\r
+        "status" : {\r
+          "type" : "string",\r
+          "description" : "Status of the request."\r
+        },\r
+        "description" : {\r
+          "type" : "string",\r
+          "description" : "Description of the request status."\r
+        },\r
+        "schedule" : {\r
+          "type" : "array",\r
+          "description" : "List of schedules returned, one per group. Only 1 group supported at this time.",\r
+          "items" : {\r
+            "$ref" : "#/definitions/CMSchedule"\r
+          }\r
+        }\r
+      },\r
+      "description" : "Asynchronous response to schedule oprimizer request."\r
+    },\r
+    "Schedule" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "createDateTime" : {\r
+          "type" : "string",\r
+          "description" : "Date/time schedule was created."\r
+        },\r
+        "optimizerDateTime" : {\r
+          "type" : "string"\r
+        },\r
+        "optimizerMessage" : {\r
+          "type" : "string"\r
+        },\r
+        "optimizerStatus" : {\r
+          "type" : "string"\r
+        },\r
+        "optimizerReturnDateTime" : {\r
+          "type" : "string"\r
+        },\r
+        "optimizerTransactionId" : {\r
+          "type" : "string"\r
+        },\r
+        "schedule" : {\r
+          "type" : "string"\r
+        },\r
+        "scheduleName" : {\r
+          "type" : "string"\r
+        },\r
+        "scheduleInfo" : {\r
+          "type" : "string"\r
+        },\r
+        "status" : {\r
+          "type" : "string"\r
+        },\r
+        "userId" : {\r
+          "type" : "string"\r
+        },\r
+        "domain" : {\r
+          "type" : "string"\r
+        },\r
+        "deleteDateTime" : {\r
+          "type" : "string"\r
+        },\r
+        "domainData" : {\r
+          "type" : "array",\r
+          "items" : {\r
+            "$ref" : "#/definitions/Domain data"\r
+          }\r
+        },\r
+        "scheduleApprovals" : {\r
+          "type" : "array",\r
+          "items" : {\r
+            "$ref" : "#/definitions/Schedule Approval"\r
+          }\r
+        },\r
+        "groups" : {\r
+          "type" : "array",\r
+          "items" : {\r
+            "$ref" : "#/definitions/Change Management Group"\r
+          }\r
+        }\r
+      }\r
+    },\r
+    "Schedule Approval" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "approvalDateTime" : {\r
+          "type" : "string",\r
+          "description" : "Date/time schedule time slot was accepted/rejected."\r
+        },\r
+        "status" : {\r
+          "type" : "string",\r
+          "description" : "Approval status.",\r
+          "enum" : [ "Accepted", "Rejected" ]\r
+        },\r
+        "userId" : {\r
+          "type" : "string",\r
+          "description" : "ATTUID of the user accepting/rejecting the time slot."\r
+        }\r
+      },\r
+      "description" : "Details of a schedule approval/rejection."\r
+    },\r
+    "Schedule Approval Request" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "approvalUserId" : {\r
+          "type" : "string",\r
+          "description" : "ATTUID of the user accepting/rejecting the time slot."\r
+        },\r
+        "approvalStatus" : {\r
+          "type" : "string",\r
+          "description" : "Approval status.",\r
+          "enum" : [ "Accepted", "Rejected" ]\r
+        },\r
+        "approvalType" : {\r
+          "type" : "string",\r
+          "description" : "Type of approval.",\r
+          "enum" : [ "Tier 2" ]\r
+        },\r
+        "approvalDateTime" : {\r
+          "type" : "string",\r
+          "format" : "date-time"\r
+        }\r
+      },\r
+      "description" : "Request to accept or reject an optimized time slot."\r
+    },\r
+    "VNF Details" : {\r
+      "type" : "object",\r
+      "properties" : {\r
+        "groupId" : {\r
+          "type" : "string",\r
+          "description" : "Name of the list of VNFs to be changed as a group"\r
+        },\r
+        "node" : {\r
+          "type" : "array",\r
+          "description" : "Lists of the VNF names to be changed",\r
+          "items" : {\r
+            "type" : "string"\r
+          }\r
+        },\r
+        "changeWindow" : {\r
+          "type" : "array",\r
+          "description" : "Lists of desired change windows that the optimizer can select from. (Only 1 change window supported at this time)",\r
+          "items" : {\r
+            "$ref" : "#/definitions/Change Window"\r
+          }\r
+        }\r
+      },\r
+      "description" : "Details and scheduling criteria for the VNFs to be changed."\r
+    }\r
+  }\r
+}
\ No newline at end of file
diff --git a/cmso-service/src/main/resources/system.properties b/cmso-service/src/main/resources/system.properties
new file mode 100644 (file)
index 0000000..89954f2
--- /dev/null
@@ -0,0 +1,48 @@
+#-------------------------------------------------------------------------------\r
+# Copyright © 2017-2018 AT&T Intellectual Property.\r
+# Modifications Copyright © 2018 IBM.\r
+# \r
+# Licensed under the Apache License, Version 2.0 (the "License");\r
+# you may not use this file except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+# \r
+#         http://www.apache.org/licenses/LICENSE-2.0\r
+# \r
+# Unless required by applicable law or agreed to in writing, software\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+# \r
+# \r
+# Unless otherwise specified, all documentation contained herein is licensed\r
+# under the Creative Commons License, Attribution 4.0 Intl. (the â??Licenseâ?\9d);\r
+# you may not use this documentation except in compliance with the License.\r
+# You may obtain a copy of the License at\r
+# \r
+#         https://creativecommons.org/licenses/by/4.0/\r
+# \r
+# Unless required by applicable law or agreed to in writing, documentation\r
+# distributed under the License is distributed on an "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+# See the License for the specific language governing permissions and\r
+# limitations under the License.\r
+#-------------------------------------------------------------------------------\r
+\r
+# If the environment property system_properties_path contains a path to a file, \r
+# System properties created using the file. If the environment variable not present\r
+# system.properties in the class path is used for system property creation \r
+\r
+com.att.eelf.logging.file=logback.xml\r
+\r
+# change as per logback.xml path\r
+com.att.eelf.logging.path=\r
+logging.config=\r
+\r
+spring.config.location=etc/config/\r
+spring.config.name=application,cmso,optimizer,ticketmgt\r
+\r
+# Default parameters during application startup.\r
+info.build.artifact=@project.artifactId@\r
+info.build.name=@project.name@\r
+info.build.version=@project.version@\r