aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/Application.java45
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java48
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java46
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java49
-rw-r--r--cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java459
-rw-r--r--cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java4
-rw-r--r--cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java70
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java155
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/Observation.java129
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java49
-rw-r--r--cmso-topology/src/main/java/org/onap/observations/ObservationObject.java198
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java56
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java89
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java82
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java137
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java56
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java176
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java133
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java42
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java45
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java102
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java82
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java129
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java76
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java96
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java37
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java58
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java56
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java106
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java59
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java35
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java32
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java221
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java83
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java134
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java63
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java60
-rw-r--r--cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java62
-rw-r--r--pom.xml2
39 files changed, 3398 insertions, 163 deletions
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/Application.java b/cmso-service/src/main/java/org/onap/optf/cmso/Application.java
index f0580bd..42e86f2 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/Application.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/Application.java
@@ -1,33 +1,19 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso;
@@ -97,7 +83,6 @@ public class Application extends SpringBootServletInitializer {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
int port = Integer.parseInt(dispatchPort);
tomcat.addAdditionalTomcatConnectors(createStandardConnector(port));
- org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter ss = null;
return tomcat;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java b/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java
index aad3104..04a93d8 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/AutowiringSpringBeanJobFactory.java
@@ -1,33 +1,19 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso;
@@ -41,7 +27,7 @@ import com.att.eelf.configuration.EELFManager;
/**
* This class makes it possible to use @Autowired references in QuartzJobBeans.
- *
+ *
* Also enables @Autowire of the SchedulerFactoryBean the add Triggers
* for @Autowired QuartzJobBeans for ChangeManagement events. Making a big
* investment in SpringBoot Quartz. It had better work ;-)
@@ -50,7 +36,7 @@ import com.att.eelf.configuration.EELFManager;
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
private static EELFLogger log = EELFManager.getInstance().getLogger(AutowiringSpringBeanJobFactory.class);
- private transient AutowireCapableBeanFactory beanFactory;
+ private AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext context) {
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java b/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
index e5aca31..2de080e 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/CMSEnvironmentPostProcessor.java
@@ -1,33 +1,19 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso;
@@ -48,7 +34,7 @@ public class CMSEnvironmentPostProcessor implements EnvironmentPostProcessor {
String pwd = environment.getProperty("cmso.database.password");
if (pwd != null) {
pwd = PropertiesManagement.getDecryptedValue(pwd);
- Map<String, Object> map = new HashMap<String, Object>();
+ Map<String, Object> map = new HashMap<>();
map.put("spring.datasource.password", pwd);
MapPropertySource propertySource = new MapPropertySource("abc", map);
MutablePropertySources proeprtySources = environment.getPropertySources();
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java b/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
index 25b6583..8b3d3f0 100644
--- a/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
@@ -1,33 +1,19 @@
-/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
+/*******************************************************************************
+ * ============LICENSE_START=======================================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * ===================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+ * OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
- *
- *
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://creativecommons.org/licenses/by/4.0/
- *
- * Unless required by applicable law or agreed to in writing, documentation
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
-*/
+ * ============LICENSE_END=========================================================================================
+ *
+ ******************************************************************************/
package org.onap.optf.cmso.common;
@@ -67,7 +53,7 @@ public class BasicAuthenticatorFilter implements ClientRequestFilter {
throw new IllegalStateException("Cannot encode with UTF-8", ex);
}
}
-
+
public static String getUser(HttpServletRequest request) {
String user = "";
String header = request.getHeader("Authorization");
@@ -86,8 +72,7 @@ public class BasicAuthenticatorFilter implements ClientRequestFilter {
private static String getToken(String auth) {
try {
- String token = new String(DatatypeConverter.parseBase64Binary(auth));
- return token;
+ return new String(DatatypeConverter.parseBase64Binary(auth));
} catch (Exception e) {
return auth;
}
diff --git a/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java
new file mode 100644
index 0000000..57a0751
--- /dev/null
+++ b/cmso-service/src/main/java/org/onap/optf/cmso/service/rs/CmsoServiceImpl.java
@@ -0,0 +1,459 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+import org.joda.time.DateTime;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.DomainsEnum;
+import org.onap.optf.cmso.common.LogMessages;
+import org.onap.optf.cmso.common.exceptions.CMSException;
+import org.onap.optf.cmso.common.exceptions.CMSNotFoundException;
+import org.onap.optf.cmso.eventq.CMSQueueJob;
+import org.onap.optf.cmso.model.ChangeManagementDetail;
+import org.onap.optf.cmso.model.ChangeManagementGroup;
+import org.onap.optf.cmso.model.ChangeManagementSchedule;
+import org.onap.optf.cmso.model.Schedule;
+import org.onap.optf.cmso.model.ScheduleQuery;
+import org.onap.optf.cmso.model.dao.ChangeManagementChangeWindowDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementDetailDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementGroupDAO;
+import org.onap.optf.cmso.model.dao.ChangeManagementScheduleDAO;
+import org.onap.optf.cmso.model.dao.ElementDataDAO;
+import org.onap.optf.cmso.model.dao.ScheduleDAO;
+import org.onap.optf.cmso.model.dao.ScheduleQueryDAO;
+import org.onap.optf.cmso.service.rs.models.ApprovalMessage;
+import org.onap.optf.cmso.service.rs.models.ChangeWindowMessage;
+import org.onap.optf.cmso.service.rs.models.CmDetailsMessage;
+import org.onap.optf.cmso.service.rs.models.CmDomainDataEnum;
+import org.onap.optf.cmso.service.rs.models.CmsoInfo;
+import org.onap.optf.cmso.service.rs.models.CmsoMessage;
+import org.onap.optf.cmso.service.rs.models.VnfDetailsMessage;
+import org.onap.optf.cmso.service.rs.models.v2.ChangeWindow;
+import org.onap.optf.cmso.service.rs.models.v2.ElementInfo;
+import org.onap.optf.cmso.service.rs.models.v2.NameValue;
+import org.onap.optf.cmso.service.rs.models.v2.OptimizedScheduleMessage;
+import org.onap.optf.cmso.service.rs.models.v2.PolicyInfo;
+import org.onap.optf.cmso.service.rs.models.v2.SchedulingData;
+import org.onap.optf.cmso.ticketmgt.TmClient;
+import org.onap.optf.cmso.ticketmgt.bean.BuildCreateRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+@Controller
+public class CmsoServiceImpl extends CommonServiceImpl implements CmsoService {
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ @Autowired
+ CMSQueueJob qqJob;
+
+ @Autowired
+ Environment env;
+
+ @Autowired
+ ChangeManagementScheduleDAO cmScheduleDAO;
+
+ @Autowired
+ ChangeManagementGroupDAO cmGroupDAO;
+
+ @Autowired
+ ChangeManagementChangeWindowDAO cmChangeWindowDAO;
+
+ @Autowired
+ ChangeManagementDetailDAO cmDetailsDAO;
+
+ @Autowired
+ ScheduleQueryDAO scheduleQueryDAO;
+
+ @Autowired
+ ScheduleDAO scheduleDAO;
+
+ @Autowired
+ ElementDataDAO elementDataDAO;
+
+ @Autowired
+ TmClient tmClient;
+
+ @Autowired
+ BuildCreateRequest buildCreateRequest;
+
+ @Override
+ public Response searchScheduleRequests(String apiVersion, Boolean includeDetails, String scheduleId,
+ String scheduleName, String userId, String status, String createDateTime, String optimizerStatus,
+ String workflowName, UriInfo uri, HttpServletRequest request) {
+
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), uri.toString(),
+ "");
+ Response response = null;
+ List<Schedule> schedules = new ArrayList<Schedule>();
+ try {
+ debug.debug("Timezone={}", TimeZone.getDefault());
+ StringBuilder where = new StringBuilder();
+ int maxRows = 0;
+ // MultivaluedMap<String, String> qp = uri.getQueryParameters();
+ // buildWhere(qp, where);
+ List<ScheduleQuery> list = scheduleQueryDAO.searchSchedules(where.toString(), maxRows);
+ if (list == null || !list.iterator().hasNext()) {
+ throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
+ DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ Iterator<ScheduleQuery> iter = list.iterator();
+ while (iter.hasNext()) {
+ Schedule sch = scheduleDAO.findById(iter.next().getUuid()).orElse(null);
+ if (sch != null) {
+ schedules.add(sch);
+ if (includeDetails) {
+ List<ChangeManagementGroup> groups = cmGroupDAO.findBySchedulesID(sch.getUuid());
+ sch.setGroups(groups);
+ for (ChangeManagementGroup g : groups) {
+ List<ChangeManagementSchedule> cmSchedules =
+ cmScheduleDAO.findByChangeManagementGroupId(g.getUuid());
+ g.setChangeManagementSchedules(cmSchedules);
+ }
+ }
+ }
+ }
+ response = Response.ok(schedules.toArray(new Schedule[schedules.size()])).build();
+ } catch (CMSException e) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.serverError().build();
+ }
+
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(),
+ schedules.toString(), response.getStatusInfo().toString());
+ return response;
+ }
+
+ @Override
+ @Transactional
+ public Response createScheduleRequest(String apiVersion, String scheduleId, CmsoMessage scheduleMessage,
+ HttpServletRequest request) {
+ Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId,
+ scheduleMessage.toString());
+ Response response = null;
+ try {
+ OptimizedScheduleMessage osm = adaptScheduleMessage(scheduleMessage);
+ createSchedule(osm, scheduleId, request);
+ response = Response.accepted().build();
+ } catch (CMSException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.CREATE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ private OptimizedScheduleMessage adaptScheduleMessage(CmsoMessage sm)
+ throws CMSException, JsonParseException, JsonMappingException, IOException {
+ OptimizedScheduleMessage osm = new OptimizedScheduleMessage();
+ osm.setScheduleId(sm.getScheduleId());
+ osm.setDomain(sm.getDomain());
+ osm.setScheduleName(sm.getScheduleName());
+ osm.setUserId(sm.getUserId());
+ List<NameValue> dd = new ArrayList<>();
+ List<Map<String, String>> smdd = sm.getDomainData();
+ for (Map<String, String> map : smdd) {
+ for (String name : map.keySet()) {
+ NameValue nv = new NameValue(name, map.get(name));
+ dd.add(nv);
+ }
+ }
+ osm.setCommonData(dd);
+ CmsoInfo sinfo = sm.getSchedulingInfo();
+ if (sinfo == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "schedulingInfo");
+ }
+ SchedulingData sd = new SchedulingData();
+ osm.setSchedulingData(sd);
+ sd.setAdditionalDurationInSeconds(sinfo.getAdditionalDurationInSeconds());
+ sd.setConcurrencyLimit(sinfo.getConcurrencyLimit());
+ sd.setNormalDurationInSeconds(sinfo.getNormalDurationInSeconds());
+
+ List<PolicyInfo> policies = new ArrayList<>();
+ PolicyInfo policyInfo = new PolicyInfo();
+ policyInfo.setPolicyName(sinfo.getPolicyId());
+ sd.setPolicies(policies);
+
+ List<VnfDetailsMessage> details = sinfo.getVnfDetails();
+ if (details == null) {
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "vnfDetails");
+ }
+ List<ChangeWindow> windows = new ArrayList<>();
+ List<ElementInfo> elements = new ArrayList<>();
+ for (VnfDetailsMessage vdm : details) {
+ if (vdm.getChangeWindow() != null) {
+ for (ChangeWindowMessage cwm : vdm.getChangeWindow()) {
+ ChangeWindow cw = new ChangeWindow();
+ DateTime start = CmsoOptimizerCallbackImpl.convertIsoDate(cwm.getStartTime(), "startTime");
+ DateTime end = CmsoOptimizerCallbackImpl.convertIsoDate(cwm.getEndTime(), "endTime");
+ cw.setStartTime(start.toDate());
+ cw.setEndTime(end.toDate());
+ windows.add(cw);
+ }
+ }
+ for (String node : vdm.getNode()) {
+ ElementInfo element = new ElementInfo();
+ element.setElementId(node);
+ element.setRequest(getRequestFromCallbackData(node, dd));
+ element.setGroupId(vdm.getGroupId());
+ elements.add(element);
+ }
+ }
+ sd.setElements(elements);
+ sd.setChangeWindows(windows);
+ return osm;
+ }
+
+ private Object getRequestFromCallbackData(String node, List<NameValue> dd)
+ throws CMSException, JsonParseException, JsonMappingException, IOException {
+ for (NameValue nv : dd) {
+ if (nv.getName().equals(CmDomainDataEnum.CallbackData.toString())) {
+ String value = nv.getValue().toString();
+ ObjectMapper om = new ObjectMapper();
+ JsonNode json = om.readValue(value, JsonNode.class);
+ JsonNode details = json.get("requestDetails");
+ int ii = 0;
+ for (ii = 0; ii < details.size(); ii++) {
+ JsonNode request = details.get(ii);
+ String id = request.get("vnfName").asText();
+ if (id.equals(node)) {
+ return request;
+ }
+ }
+ }
+ }
+ throw new CMSException(Status.BAD_REQUEST, LogMessages.MISSING_REQUIRED_ATTRIBUTE, "CallbackData", "");
+ }
+
+ @Override
+ @Transactional
+ public Response deleteScheduleRequest(String apiVersion, String scheduleId, HttpServletRequest request) {
+ Response response = null;
+ Observation.report(LogMessages.DELETE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId, "");
+ try {
+ Schedule schedule = scheduleDAO.findByDomainScheduleID(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ if (schedule == null) {
+ throw new CMSNotFoundException(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ deleteChangeManagement(schedule);
+ deleteScheduleRequest(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ response = Response.noContent().build();
+ } catch (CMSException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.DELETE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ @Override
+ public Response getScheduleRequestInfo(String apiVersion, String scheduleId, HttpServletRequest request) {
+ Response response = null;
+ Observation.report(LogMessages.GET_SCHEDULE_REQUEST_INFO, "Received", request.getRemoteAddr(), scheduleId, "");
+ Schedule schedule = null;
+ try {
+ schedule = scheduleDAO.findByDomainScheduleID(DomainsEnum.ChangeManagement.toString(), scheduleId);
+ if (schedule == null) {
+ throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
+ DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ response = Response.ok().entity(schedule).build();
+ } catch (CMSException e) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.GET_SCHEDULE_REQUEST_INFO, "Returned", request.getRemoteAddr(), scheduleId,
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ @Override
+ @Transactional
+ public Response approveScheduleRequest(String apiVersion, String scheduleId, ApprovalMessage approval,
+ HttpServletRequest request) {
+ Response response = null;
+ Observation.report(LogMessages.APPROVE_SCHEDULE_REQUEST, "Received", request.getRemoteAddr(), scheduleId,
+ approval.toString());
+ try {
+ String domain = DomainsEnum.ChangeManagement.toString();
+ Schedule sch = scheduleDAO.findByDomainScheduleID(domain, scheduleId);
+ if (sch == null) {
+ throw new CMSNotFoundException(domain, scheduleId);
+ }
+ processApproveScheduleRequest(sch, approval, sch.getDomainData());
+ response = Response.noContent().build();
+ } catch (CMSException e) {
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.APPROVE_SCHEDULE_REQUEST, "Returned", request.getRemoteAddr(), scheduleId, "");
+ return response;
+ }
+
+ @Override
+ public Response searchScheduleRequestDetails(String apiVersion, String scheduleId, String scheduleName,
+ String userId, String status, String createDateTime, String optimizerStatus,
+ String requestApprovalUserId, String requestApprovalStatus, String requestApprovalType,
+ String workflowName, String vnfName, String vnfId, String vnfStatus,
+ // String vnfScheduleId,
+ String startTime, String finishTime, String lastInstanceTime, String tmChangeId,
+ // String approvalUserId,
+ // String approvalStatus,
+ // String approvalType,
+ Integer maxSchedules, String lastScheduleId, Integer concurrencyLimit, UriInfo uri,
+ HttpServletRequest request) {
+
+ Response response = null;
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST_DETAILS, "Received", request.getRemoteAddr(),
+ uri.getRequestUri().getQuery());
+ List<CmDetailsMessage> schedules = new ArrayList<CmDetailsMessage>();
+
+ try {
+ debug.debug("Timezone={}", TimeZone.getDefault());
+ MultivaluedMap<String, String> qp = uri.getQueryParameters();
+ StringBuilder where = new StringBuilder();
+ int maxRows = 0;
+ if (maxSchedules != null && maxSchedules > 0) {
+ maxRows = maxSchedules;
+ }
+ buildWhere(qp, where);
+ List<ChangeManagementDetail> list = cmDetailsDAO.searchScheduleDetails(where.toString(), maxRows);
+ if (list == null || !list.iterator().hasNext()) {
+ throw new CMSException(Status.NOT_FOUND, LogMessages.SCHEDULE_NOT_FOUND,
+ DomainsEnum.ChangeManagement.toString(), scheduleId);
+ }
+ Iterator<ChangeManagementDetail> iter = list.iterator();
+ Map<UUID, Schedule> scheduleMap = new HashMap<UUID, Schedule>();
+ while (iter.hasNext()) {
+ ChangeManagementDetail cms = iter.next();
+ CmDetailsMessage msg = buildResponse(cms, scheduleMap);
+ schedules.add(msg);
+ }
+ response = Response.ok(schedules.toArray(new CmDetailsMessage[schedules.size()])).build();
+ } catch (CMSException e) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.status(e.getStatus()).entity(e.getRequestError()).build();
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ response = Response.serverError().build();
+ }
+ Observation.report(LogMessages.SEARCH_SCHEDULE_REQUEST_DETAILS, "Returned", request.getRemoteAddr(),
+ response.getStatusInfo().toString());
+ return response;
+ }
+
+ private void buildWhere(MultivaluedMap<String, String> qp, StringBuilder where) throws CMSException {
+ String delim = " where ";
+ for (String urlName : qp.keySet()) {
+ List<String> values = qp.get(urlName);
+ String clause = CmQueryParameters.buildClause(urlName, values);
+ if (clause != null && !clause.equals("")) {
+ where.append(delim).append("\n").append(clause).append("\n");
+ delim = "AND";
+ }
+ }
+ }
+
+ private CmDetailsMessage buildResponse(ChangeManagementDetail cms, Map<UUID, Schedule> scheduleMap) {
+ CmDetailsMessage msg = new CmDetailsMessage();
+ msg.setVnfId(cms.getVnfId());
+ msg.setVnfName(cms.getVnfName());
+ msg.setStatus(cms.getStatus());
+ msg.setTmChangeId(cms.getTmChangeId());
+ msg.setFinishTimeMillis(cms.getFinishTimeMillis());
+ msg.setStartTimeMillis(cms.getStartTimeMillis());
+ msg.setLastInstanceStartTimeMillis(cms.getLastInstanceStartTimeMillis());
+ msg.setGroupId(cms.getGroupId());
+ msg.setPolicyId(cms.getPolicyId());
+ msg.setTmApprovalStatus(cms.getTmApprovalStatus());
+ msg.setTmStatus(cms.getTmStatus());
+ msg.setStatusMessage(cms.getStatusMessage());
+ msg.setDispatchTimeMillis(cms.getDispatchTimeMillis());
+ msg.setExecutionCompletedTimeMillis(cms.getExecutionCompletedTimeMillis());
+ msg.setMsoMessage(cms.getMsoMessage());
+ msg.setMsoRequestId(cms.getMsoRequestId());
+ msg.setMsoStatus(cms.getMsoStatus());
+ msg.setMsoTimeMillis(cms.getMsoTimeMillis());
+ if (!scheduleMap.containsKey(cms.getSchedulesUuid())) {
+ Schedule schedule = scheduleDAO.findById(cms.getSchedulesUuid()).orElse(null);
+ if (schedule != null) {
+ // DO not innclude in the results
+ schedule.setScheduleInfo(null);
+ // schedule.setSchedule(null);
+ scheduleMap.put(cms.getSchedulesUuid(), schedule);
+ }
+ }
+ if (scheduleMap.containsKey(cms.getSchedulesUuid())) {
+ msg.setScheduleRequest(scheduleMap.get(cms.getSchedulesUuid()));
+ }
+ return msg;
+ }
+}
diff --git a/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java b/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java
index 08d110e..acfbaae 100644
--- a/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java
+++ b/cmso-service/src/test/java/org/onap/optf/cmso/JpaInit.java
@@ -12,10 +12,10 @@
* OF ANY KIND, either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END=========================================================================================
- *
+ *
*/
- package org.onap.optf.cmso;
+package org.onap.optf.cmso;
import java.util.concurrent.atomic.AtomicBoolean;
import org.onap.optf.cmso.model.ApprovalType;
diff --git a/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java b/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
index defb7ef..cf0b8bf 100644
--- a/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
+++ b/cmso-service/src/test/java/org/onap/optf/cmso/utilities/PropertiesAdmin.java
@@ -1,31 +1,26 @@
/*
- * Copyright © 2017-2018 AT&T Intellectual Property.
- * Modifications Copyright © 2018 IBM.
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
*
*
- * Unless otherwise specified, all documentation contained herein is licensed
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
- * you may not use this documentation except in compliance with the License.
- * You may obtain a copy of the License at
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
*
- * https://creativecommons.org/licenses/by/4.0/
+ * https://creativecommons.org/licenses/by/4.0/
*
- * Unless required by applicable law or agreed to in writing, documentation
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
@@ -34,23 +29,22 @@ package org.onap.optf.cmso.utilities;
import org.onap.optf.cmso.common.PropertiesManagement;
public class PropertiesAdmin {
- /**
- * Test properties admin.
- *
- * @param args
- */
- public static void main(String[] args) {
- PropertiesManagement pm = new PropertiesManagement();
- if (args.length < 1) {
- System.out.println("Missing argument");
- return;
- }
- String value = "";
- if (args[0].startsWith("dec:")) {
- value = PropertiesManagement.getDecryptedValue(args[0].substring(4));
- } else {
- value = pm.getEncryptedValue(args[0]);
+ /**
+ * Test properties admin.
+ *
+ * @param args arguments
+ */
+ public static void main(String[] args) {
+ if (args.length < 1) {
+ System.out.println("Missing argument");
+ return;
+ }
+ String value = "";
+ if (args[0].startsWith("dec:")) {
+ value = PropertiesManagement.getDecryptedValue(args[0].substring(4));
+ } else {
+ value = PropertiesManagement.getEncryptedValue(args[0]);
+ }
+ System.out.println(args[0] + " : " + value);
}
- System.out.println(args[0] + " : " + value);
- }
}
diff --git a/cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java b/cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java
new file mode 100644
index 0000000..fe6cea2
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/MessageHeaders.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.observations;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * The Class MessageHeaders.
+ */
+public class MessageHeaders {
+
+ /**
+ * The Enum HeadersEnum.
+ */
+ public enum HeadersEnum {
+ UNDEFINED("UNDEFINED"),
+ TransactionID("X-TransactionId"),
+ FromAppID("X-FromAppId"),
+ MinorVersion("X-MinorVersion"),
+ PatchVersion("X-PatchVersion"),
+ LatestVersion("X-LatestVersion"),;
+
+ private final String text;
+
+ private HeadersEnum(String text) {
+ this.text = text;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ return text;
+ }
+ }
+
+ /** The Constant supportedMajorVersions. */
+ public static final Map<String, String> supportedMajorVersions = new HashMap<String, String>();
+
+ static {
+ supportedMajorVersions.put("v1", "0");
+ supportedMajorVersions.put("v2", "0");
+ }
+
+ /** The Constant supportedMajorMinorVersions. */
+ public static final Set<String> supportedMajorMinorVersions = new HashSet<String>();
+
+ static {
+ supportedMajorMinorVersions.add("v1.0");
+ supportedMajorMinorVersions.add("v2.0");
+ }
+
+ /** The Constant latestVersion. */
+ public static final String latestVersion = "2.0.0";
+
+ /** The Constant patchVersion. */
+ public static final String patchVersion = "0";
+
+ /**
+ * From string.
+ *
+ * @param text the text
+ * @return the headers enum
+ */
+ public static HeadersEnum fromString(String text) {
+ for (HeadersEnum e : HeadersEnum.values()) {
+ if (e.text.equals(text)) {
+ return e;
+ }
+ }
+ return HeadersEnum.UNDEFINED;
+ }
+
+ /**
+ * Gets the patch version.
+ *
+ * @return the patch version
+ */
+ public static String getPatchVersion() {
+ return patchVersion;
+ }
+
+ /**
+ * Gets the latest version.
+ *
+ * @return the latest version
+ */
+ public static String getLatestVersion() {
+ return latestVersion;
+ }
+
+ /**
+ * Validate major version.
+ *
+ * @param major the major
+ * @return true, if successful
+ */
+ public static boolean validateMajorVersion(String major) {
+ String majorKey = major.toLowerCase();
+ if (!supportedMajorVersions.containsKey(majorKey)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Validate major minor version.
+ *
+ * @param major the major
+ * @param minor the minor
+ * @return true, if successful
+ */
+ public static boolean validateMajorMinorVersion(String major, String minor) {
+ String majorKey = major.toLowerCase();
+ if (!supportedMajorVersions.containsKey(majorKey)) {
+ return false;
+ }
+
+ if (minor != null) {
+ String majorMinorKey = majorKey + "." + minor;
+ return supportedMajorMinorVersions.contains(majorMinorKey);
+ }
+ return true;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/observations/Observation.java b/cmso-topology/src/main/java/org/onap/observations/Observation.java
new file mode 100644
index 0000000..e1ec30c
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/Observation.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.observations;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import org.apache.log4j.Level;
+import org.onap.optf.cmso.topology.Application;
+
+
+/**
+ * The Class Observation.
+ */
+public class Observation {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+ private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger();
+ private static EELFLogger audit = EELFManager.getInstance().getAuditLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param execpt the e
+ * @param arguments the arguments
+ */
+ // *************************************************************************************************
+ public static void report(ObservationInterface obs, Exception execpt, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, execpt, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, execpt, arguments);
+ }
+ Level lev = obs.getLevel();
+ switch (lev.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, execpt, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, execpt, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.trace(obs, execpt, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, execpt, arguments);
+ break;
+ default:
+ log.info(obs, execpt, arguments);
+ }
+ Mdc.clearCaller();
+ }
+
+ /**
+ * Report.
+ *
+ * @param obs the o
+ * @param arguments the arguments
+ */
+ public static void report(ObservationInterface obs, String... arguments) {
+ Mdc.setCaller(4);
+ Mdc.setObservation(obs);
+ if (obs.getAudit()) {
+ audit.info(obs, arguments);
+ }
+ if (obs.getMetric()) {
+ metrics.info(obs, arguments);
+ }
+ Level levl = obs.getLevel();
+ switch (levl.toInt()) {
+ case Level.WARN_INT:
+ errors.warn(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.INFO_INT:
+ log.info(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.ERROR_INT:
+ errors.error(obs, arguments);
+ debug.debug(obs, arguments);
+ break;
+ case Level.TRACE_INT:
+ debug.debug(obs, arguments);
+ break;
+ case Level.DEBUG_INT:
+ debug.debug(obs, arguments);
+ break;
+ default:
+ log.info(obs, arguments);
+ }
+ Mdc.clearCaller();
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java b/cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java
new file mode 100644
index 0000000..0dce93d
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/ObservationInterface.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+public interface ObservationInterface extends EELFResolvableErrorEnum {
+ public Enum<?> getValue();
+
+ public Level getLevel();
+
+ public String getMessage();
+
+ public Status getStatus();
+
+ public String getDomain();
+
+ public String name();
+
+ public Boolean getAudit();
+
+ public Boolean getMetric();
+}
diff --git a/cmso-topology/src/main/java/org/onap/observations/ObservationObject.java b/cmso-topology/src/main/java/org/onap/observations/ObservationObject.java
new file mode 100644
index 0000000..f1c1277
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/observations/ObservationObject.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.observations;
+
+import com.att.eelf.i18n.EELFResolvableErrorEnum;
+import com.att.eelf.i18n.EELFResourceManager;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+
+
+/**
+ * The Class ObservationObject.
+ */
+public class ObservationObject implements ObservationInterface {
+
+ // *************************************************************************************************
+ // Interface class that matches the ObservationInteface pattern
+ // This will be used in case we decide to provide external overrides and we need to instantiate
+ // For now, we'll just use the Enum itself.
+ //
+ //
+ private Enum<?> value = null;
+
+ private Level level = null;
+ private String message = null;
+ private Status status = null;
+ private String domain = null;
+ private Boolean metric = false;
+ private Boolean audit = false;
+
+ /**
+ * Instantiates a new observation object.
+ *
+ * @param obs the o
+ */
+ public ObservationObject(ObservationInterface obs) {
+ this.value = obs.getValue();
+ this.level = obs.getLevel();
+ this.message = obs.getMessage();
+ this.status = obs.getStatus();
+ this.domain = obs.getDomain();
+ this.metric = obs.getMetric();
+ this.audit = obs.getAudit();
+
+ }
+
+ /**
+ * Gets the value.
+ *
+ * @return the value
+ */
+ @Override
+ public Enum<?> getValue() {
+ return value;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @return the message
+ */
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Gets the status.
+ *
+ * @return the status
+ */
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ /**
+ * Gets the domain.
+ *
+ * @return the domain
+ */
+ @Override
+ public String getDomain() {
+ return domain;
+ }
+
+ /**
+ * Gets the level.
+ *
+ * @return the level
+ */
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ /**
+ * Name.
+ *
+ * @return the string
+ */
+ @Override
+ public String name() {
+ return value.name();
+ }
+
+ /**
+ * Gets the audit.
+ *
+ * @return the audit
+ */
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ /**
+ * Gets the metric.
+ *
+ * @return the metric
+ */
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * Gets the message.
+ *
+ * @param arguments the arguments
+ * @return the message
+ */
+ public String getMessagef(String... arguments) {
+ return EELFResourceManager.format((EELFResolvableErrorEnum) value, arguments);
+ }
+
+ /**
+ * Sets the value.
+ *
+ * @param value the new value
+ */
+ public void setValue(Enum<?> value) {
+ this.value = value;
+ }
+
+ /**
+ * Sets the level.
+ *
+ * @param level the new level
+ */
+ public void setLevel(Level level) {
+ this.level = level;
+ }
+
+ /**
+ * Sets the message.
+ *
+ * @param message the new message
+ */
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ /**
+ * Sets the status.
+ *
+ * @param status the new status
+ */
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java b/cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java
new file mode 100644
index 0000000..7e15760
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+
+public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor {
+ // TODO tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ // proeprties files.
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ String pwd = environment.getProperty("cmso.database.password");
+ if (pwd != null) {
+ pwd = PropertiesManagement.getDecryptedValue(pwd);
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("spring.datasource.password", pwd);
+ MapPropertySource propertySource = new MapPropertySource("abc", map);
+ MutablePropertySources proeprtySources = environment.getPropertySources();
+ proeprtySources.addLast(propertySource);
+ }
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
new file mode 100644
index 0000000..e2602d0
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aaf.cadi.CadiWrap;
+import org.onap.aaf.cadi.Permission;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+/**
+ * AAF authorization filter.
+ */
+
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafAuthorizationFilter extends OrderedRequestContextFilter {
+
+ @Autowired
+ AafUserRoleProperties userRoleProperties;
+
+ /**
+ * Instantiates a new aaf authorization filter.
+ */
+ public AafAuthorizationFilter() {
+ this.setOrder(FilterPriority.AAF_AUTHORIZATION.getPriority());
+
+
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ try {
+ if (request instanceof CadiWrap) {
+ CadiWrap cw = (CadiWrap) request;
+ List<Permission> perms = cw.getPermissions(cw.getUserPrincipal());
+ if (userRoleProperties.processPermissions(request, perms)) {
+ filterChain.doFilter(request, response);
+ } else {
+ Observation.report(LogMessages.UNAUTHORIZED);
+ ResponseFormatter.errorResponse(request, response, new CmsoException(
+ LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
+ } else {
+ throw new Exception();
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ ResponseFormatter.errorResponse(request, response,
+ new CmsoException(LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, ""));
+ }
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
new file mode 100644
index 0000000..e396264
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import java.util.Properties;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.filter.CadiFilter;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.topology.Application;
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter;
+import org.springframework.context.annotation.Profile;
+import org.springframework.stereotype.Component;
+
+/**
+ * AAF authentication filter.
+ */
+
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafFilter extends OrderedRequestContextFilter {
+
+ private final CadiFilter cadiFilter;
+
+ /**
+ * Instantiates a new aaf filter.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws ServletException the servlet exception
+ */
+ public AafFilter() throws IOException, ServletException {
+ Properties cadiProperties = new Properties();
+ cadiProperties.load(Application.class.getClassLoader().getResourceAsStream("cadi.properties"));
+ cadiFilter = new CadiFilter(new PropAccess(cadiProperties));
+ this.setOrder(FilterPriority.AAF_AUTHENTICATION.getPriority());
+ }
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+ throws IOException, ServletException {
+ cadiFilter.doFilter(request, response, filterChain);
+ if (response.getStatus() == 401) {
+ Observation.report(LogMessages.UNAUTHENTICATED);
+ ResponseFormatter.errorResponse(request, response,
+ new CmsoException(LogMessages.UNAUTHENTICATED.getStatus(),
+ LogMessages.UNAUTHENTICATED, ""));
+ }
+ }
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
new file mode 100644
index 0000000..db58156
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+
+
+/**
+ * The Class AafPerm.
+ */
+public class AafPerm {
+ private String type;
+ private String instance;
+ private String action;
+ private Set<String> actions = new HashSet<>();
+
+ /**
+ * Gets the action.
+ *
+ * @return the action
+ */
+ public String getAction() {
+ return action;
+ }
+
+ /**
+ * Sets the action.
+ *
+ * @param action the new action
+ */
+ public void setAction(String action) {
+ this.action = action;
+ String[] list = action.split(",");
+ for (String a : list) {
+ actions.add(a);
+ }
+ }
+
+ /**
+ * Gets the type.
+ *
+ * @return the type
+ */
+ public String getType() {
+ return type;
+ }
+
+ /**
+ * Sets the type.
+ *
+ * @param type the new type
+ */
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ /**
+ * Gets the single instance of AafPerm.
+ *
+ * @return single instance of AafPerm
+ */
+ public String getInstance() {
+ return instance;
+ }
+
+ /**
+ * Sets the instance.
+ *
+ * @param instance the new instance
+ */
+ public void setInstance(String instance) {
+ this.instance = instance;
+ }
+
+ /**
+ * Gets the actions.
+ *
+ * @return the actions
+ */
+ public Set<String> getActions() {
+ return actions;
+ }
+
+ /**
+ * Sets the actions.
+ *
+ * @param actions the new actions
+ */
+ public void setActions(Set<String> actions) {
+ this.actions = actions;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param userPerm the user perm
+ * @return true, if successful
+ */
+ public boolean matches(AAFPermission userPerm) {
+ if (type.equals(userPerm.getType())) {
+ if (userPerm.getInstance().equals("*") || instance.equals("*") || userPerm.getInstance().equals(instance)) {
+ for (String userAction : userPerm.getAction().split(",")) {
+ if (userAction.equals("*") || actions.contains("*") || actions.contains(userAction)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
new file mode 100644
index 0000000..787d786
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.aaf;
+
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+@ComponentScan("org.onap.optf")
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafSecurityConfig extends WebSecurityConfigurerAdapter {
+
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+
+ http.csrf().disable();
+
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
new file mode 100644
index 0000000..65decec
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The Class AafUserRole.
+ */
+public class AafUserRole {
+ private String url = "";
+ private String[] pathParts = {};
+ private String perm = "";
+ private String method = "";
+ private List<AafPerm> aafPerms = new ArrayList<>();
+
+ /**
+ * Instantiates a new aaf user role.
+ *
+ * @param url the url
+ * @param perm the perm
+ */
+ public AafUserRole(String url, String perm) {
+ this.setUrl(url);
+ this.setPerm(perm);
+ pathParts = url.split("\\/");
+
+ String[] perms = perm.split(",");
+ for (String p : perms) {
+ String[] parts = p.split(" ");
+ if (parts.length == 2) {
+ method = parts[1];
+ } else {
+ method = "ALL";
+ }
+
+ String[] list = parts[0].split("\\|");
+ if (list.length == 3) {
+ AafPerm aafPerm = new AafPerm();
+ aafPerm.setAction(list[2]);
+ aafPerm.setInstance(list[1]);
+ aafPerm.setType(list[0]);
+ aafPerms.add(aafPerm);
+ }
+ }
+ }
+
+ /**
+ * Gets the url.
+ *
+ * @return the url
+ */
+ public String getUrl() {
+ return url;
+ }
+
+ /**
+ * Sets the url.
+ *
+ * @param url the new url
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * Gets the perm.
+ *
+ * @return the perm
+ */
+ public String getPerm() {
+ return perm;
+ }
+
+ /**
+ * Sets the perm.
+ *
+ * @param perm the new perm
+ */
+ public void setPerm(String perm) {
+ this.perm = perm;
+ }
+
+ /**
+ * Gets the aaf perms.
+ *
+ * @return the aaf perms
+ */
+ public List<AafPerm> getAafPerms() {
+ return aafPerms;
+ }
+
+ /**
+ * Sets the aaf perms.
+ *
+ * @param aafPerms the new aaf perms
+ */
+ public void setAafPerms(List<AafPerm> aafPerms) {
+ this.aafPerms = aafPerms;
+ }
+
+ /**
+ * Matches.
+ *
+ * @param path the path
+ * @param matchMethod the match method
+ * @return true, if successful
+ */
+ public boolean matches(String path, String matchMethod) {
+ if (!this.method.equalsIgnoreCase("ALL") && !this.method.equals("*") && !this.method.equals(matchMethod)) {
+ return false;
+ }
+ List<String> inNodes = new ArrayList<>();
+ List<String> matchNodes = new ArrayList<>();
+ String[] pathList = path.split("\\/");
+ for (String n : pathList) {
+ inNodes.add(n);
+ }
+ for (String n : pathParts) {
+ matchNodes.add(n);
+ }
+
+ while (!inNodes.isEmpty() && !matchNodes.isEmpty()) {
+ String inNode = inNodes.remove(0);
+ String matchNode = matchNodes.get(0);
+ if (matchNode.equals(inNode) || matchNode.equals("*")) {
+ matchNodes.remove(0);
+ } else {
+ if (!matchNode.equals("**")) {
+ return false;
+ }
+ }
+ }
+
+ //
+ if (inNodes.isEmpty() && matchNodes.isEmpty()) {
+ return true;
+ }
+
+ // We have incoming nodes remaining, see if we can wildcard them
+ if (matchNodes.size() == 1) {
+ if (matchNodes.get(0).equals("**")) {
+ return true;
+ }
+ if (inNodes.size() == 1 && matchNodes.get(0).equals("*")) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
new file mode 100644
index 0000000..2d252f8
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.topology.SpringProfiles;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * This class uses a properties file to map URL patterns/method to AAF Permissions (AafPerm).
+ *
+ * @author jf9860
+ *
+ */
+@Component
+@Profile(SpringProfiles.AAF_AUTHENTICATION)
+public class AafUserRoleProperties {
+ @Autowired
+ Environment env;
+
+ private List<AafUserRole> list = new ArrayList<>();
+
+ /**
+ * Initialize permissions.
+ */
+ @PostConstruct
+ public void initializePermissions() {
+ String userRolePropertiesName =
+ env.getProperty("aaf.user.roles", "src/main/resources/aaf/AAFUserRoles.properties");
+ Properties props = new Properties();
+ try {
+ props.load(new FileInputStream(new File(userRolePropertiesName)));
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ for (Object url : props.keySet()) {
+ Object value = props.get(url);
+ list.add(new AafUserRole((String) url, (String) value));
+ }
+ }
+
+ /**
+ * Gets the for url method.
+ *
+ * @param url the url
+ * @param method the method
+ * @return the for url method
+ */
+ public List<AafUserRole> getForUrlMethod(String url, String method) {
+ List<AafUserRole> userRoleList = new ArrayList<>();
+ for (AafUserRole aur : list) {
+ if (aur.matches(url, method)) {
+ userRoleList.add(aur);
+ }
+ }
+ return userRoleList;
+ }
+
+ /**
+ * Process permissions.
+ *
+ * @param request the request
+ * @param userPerms the user perms
+ * @return true, if successful
+ */
+ public boolean processPermissions(HttpServletRequest request, List<Permission> userPerms) {
+ try {
+ // Get list of perms that match incoming URL. May be more than 1...
+ // Users perms must match all that match URL
+ List<AafUserRole> perms = getForUrlMethod(request.getRequestURI(), request.getMethod());
+ int tested = 0;
+ int passed = 0;
+ for (AafUserRole perm : perms) {
+ for (AafPerm test : perm.getAafPerms()) {
+ tested++;
+ for (Permission userPerm : userPerms) {
+
+ if (test.matches((AAFPermission) userPerm)) {
+ passed++;
+ break;
+ }
+ }
+ }
+ }
+ // All permissions must be OK
+ if (tested > 0 && tested == passed) {
+ return true;
+ } else {
+ return false;
+ }
+ } catch (Exception e) {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ return false;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
new file mode 100644
index 0000000..bfafbd8
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import org.springframework.core.Ordered;
+
+public enum FilterPriority {
+ AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE), AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1);
+ private final int priority;
+
+ FilterPriority(final int ppri) {
+ priority = ppri;
+ }
+
+ public int getPriority() {
+ return priority;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
new file mode 100644
index 0000000..518814e
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.aaf;
+
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+
+class ResponseFormatter {
+
+
+ static void errorResponse(HttpServletRequest request, HttpServletResponse response, CmsoException error)
+ throws IOException {
+ response.setStatus(error.getStatus().getStatusCode());
+ response.getWriter().write(error.getRequestError().toString());
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
new file mode 100644
index 0000000..750e109
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.common;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.xml.bind.DatatypeConverter;
+
+public class BasicAuthenticatorFilter implements ClientRequestFilter {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(BasicAuthenticatorFilter.class);
+ private final String user;
+ private final String password;
+
+ /**
+ * Instantiates a new basic authenticator filter.
+ *
+ * @param user the user
+ * @param password the password
+ */
+ public BasicAuthenticatorFilter(String user, String password) {
+ this.user = user;
+ this.password = password;
+ log.info("user: " + user + " pass:" + password);
+ }
+
+ @Override
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+ final String basicAuthentication = getBasicAuthentication();
+ headers.add("Authorization", basicAuthentication);
+ }
+
+ private String getBasicAuthentication() {
+ String token = this.user + ":" + this.password;
+ try {
+ return "Basic " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException ex) {
+ throw new IllegalStateException("Cannot encode with UTF-8", ex);
+ }
+ }
+
+ /**
+ * Gets the user.
+ *
+ * @param request the request
+ * @return the user
+ */
+ public static String getUser(HttpServletRequest request) {
+ String user = "";
+ String header = request.getHeader("Authorization");
+ if (header != null) {
+ String[] auth = header.split("Basic ");
+ if (auth.length == 2) {
+ String token = getToken(auth[1]);
+ if (token.contains(":")) {
+ String[] tokens = token.split(":");
+ user = tokens[0];
+ }
+ }
+ }
+ return user;
+ }
+
+ private static String getToken(String auth) {
+ try {
+ String token = new String(DatatypeConverter.parseBase64Binary(auth));
+ return token;
+ } catch (Exception e) {
+ return auth;
+ }
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java
new file mode 100644
index 0000000..5cd258e
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.common;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CmsoRequestError implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private static EELFLogger log = EELFManager.getInstance().getLogger(CmsoRequestError.class);
+ @JsonProperty
+ RequestError requestError;
+
+ public CmsoRequestError(String messageId, String text, List<String> variables) {
+ requestError = new RequestError(messageId, text, variables);
+ }
+
+ public CmsoRequestError(String messageId, String text) {
+ requestError = new RequestError(messageId, text, new ArrayList<String>());
+ }
+
+ public class RequestError {
+ @JsonProperty
+ private String messageId;
+ @JsonProperty
+ private String text;
+ @JsonProperty
+ private List<String> variables;
+
+ private RequestError(String messageId, String text, List<String> variables) {
+ this.messageId = "Scheduler." + messageId;
+ this.text = text;
+ this.variables = variables;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ sb.append(messageId).append(":").append(text).append(":").append(variables);
+ return sb.toString();
+
+ }
+ }
+
+ @Override
+ public String toString() {
+ return requestError.toString();
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
new file mode 100644
index 0000000..1993b82
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.common;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PropertiesManagement {
+
+ private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+ private static EELFLogger errors = EELFManager.getInstance().getErrorLogger();
+
+ private static final String algorithm = "AES";
+ private static final String cipherMode = "CBC";
+ private static final String paddingScheme = "PKCS5Padding";
+ private static final String transformation = algorithm + "/" + cipherMode + "/" + paddingScheme;
+
+ private static final String initVector = "ONAPCMSOVECTORIV"; // 16 bytes IV
+
+ @Autowired
+ Environment env;
+
+ /**
+ * Gets the property.
+ *
+ * @param key the key
+ * @param defaultValue the default value
+ * @return the property
+ */
+ public String getProperty(String key, String defaultValue) {
+ String value = env.getProperty(key, defaultValue);
+ value = getDecryptedValue(value);
+ return value;
+ }
+
+ /**
+ * Gets the decrypted value.
+ *
+ * @param value the value
+ * @return the decrypted value
+ */
+ public static String getDecryptedValue(String value) {
+ if (value.startsWith("enc:")) {
+ String secret = getSecret();
+ value = decrypt(secret, initVector, value.substring(4));
+ }
+ return value;
+ }
+
+ /**
+ * Gets the encrypted value.
+ *
+ * @param value the value
+ * @return the encrypted value
+ */
+ public static String getEncryptedValue(String value) {
+ String secret = getSecret();
+ value = encrypt(secret, initVector, value);
+ return value;
+ }
+
+ private static final String encrypt(String key, String initVector, String value) {
+ try {
+ IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
+ SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
+ Cipher cipher = Cipher.getInstance(transformation);
+ cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
+ byte[] encrypted = cipher.doFinal(value.getBytes());
+ return Base64.encodeBase64String(encrypted);
+ } catch (Exception ex) {
+ errors.error("Unexpected exception {0}", ex.getMessage());
+ debug.debug("Unexpected exception", ex);
+ }
+
+ return null;
+ }
+
+ private static final String decrypt(String key, String initVector, String encrypted) {
+ try {
+ IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
+ SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
+ Cipher cipher = Cipher.getInstance(transformation);
+ cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
+ byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
+ return new String(original);
+ } catch (Exception ex) {
+ errors.error("Unexpected exception {0}", ex.getMessage());
+ debug.debug("Unexpected exception", ex);
+ }
+ return null;
+ }
+
+ private static String getSecret() {
+ return "ONAPCMSOSECRETIV";
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java b/cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java
new file mode 100644
index 0000000..41476ee
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.common.exceptions;
+
+import com.att.eelf.i18n.EELFResourceManager;
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.Response.Status;
+import org.onap.observations.ObservationInterface;
+import org.onap.optf.cmso.common.CmsoRequestError;
+
+public class CmsoException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ protected CmsoRequestError requestError = null;
+ private List<String> variables = new ArrayList<String>();
+ protected ObservationInterface messageCode;
+ protected Status status;
+
+ /**
+ * Instantiates a new cmso exception.
+ *
+ * @param status the status
+ * @param messageCode the message code
+ * @param args the args
+ */
+ public CmsoException(Status status, ObservationInterface messageCode, String... args) {
+ super(EELFResourceManager.format(messageCode, args));
+ this.status = status;
+ this.messageCode = messageCode;
+ for (String arg : args) {
+ variables.add(arg);
+ }
+ requestError = new CmsoRequestError(messageCode.name(), getMessage(), variables);
+ }
+
+ public Status getStatus() {
+ return status;
+ }
+
+ public ObservationInterface getMessageCode() {
+ return messageCode;
+ }
+
+ public String[] getVariables() {
+ return variables.toArray(new String[variables.size()]);
+ }
+
+ public CmsoRequestError getRequestError() {
+ return requestError;
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java
new file mode 100644
index 0000000..7223166
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/Application.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology;
+
+import com.att.eelf.configuration.Configuration;
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.net.InetAddress;
+import java.util.TimeZone;
+import javax.annotation.PostConstruct;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.slf4j.MDC;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"org.onap.optf.cmso"})
+@EnableAsync
+
+@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
+public class Application extends SpringBootServletInitializer {
+
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(Application.class);
+ }
+
+ @PostConstruct
+ void started() {
+ // Make sure all datetimes are stored in UTC format.
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ }
+
+ public static void main(String[] args) {
+ initMdcData();
+ SpringApplication.run(Application.class, args);
+ }
+
+ protected static void initMdcData() {
+ MDC.clear();
+ try {
+ MDC.put(Configuration.MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName());
+ MDC.put("hostname", InetAddress.getLocalHost().getCanonicalHostName());
+ MDC.put("serviceName", System.getProperty("info.build.artifact"));
+ MDC.put("version", System.getProperty("info.build.version"));
+ MDC.put(Configuration.MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress());
+ } catch (Exception e) {
+ log.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+ }
+ }
+
+ @Bean
+ public ServletWebServerFactory servletContainer() {
+ TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
+ return tomcat;
+ }
+
+
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java
new file mode 100644
index 0000000..3017222
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/ApplicationPropertiesFiles.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.annotation.PropertySources;
+
+
+@Configuration
+@PropertySources({@PropertySource("file:etc/config/topology.properties"),})
+public class ApplicationPropertiesFiles {
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java
new file mode 100644
index 0000000..511033d
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/AuthProvider.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2019 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology;
+
+import java.util.ArrayList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.env.Environment;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+
+@Component
+@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
+
+public class AuthProvider implements AuthenticationProvider {
+
+ @Autowired
+ Environment env;
+
+ @Override
+ public Authentication authenticate(Authentication authentication) {
+ String name = authentication.getName();
+ String password = authentication.getCredentials().toString();
+ // TODO check credentials until we enable AAF
+ return new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>());
+ }
+
+ @Override
+ public boolean supports(Class<?> authentication) {
+ return authentication.equals(UsernamePasswordAuthenticationToken.class);
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java
new file mode 100644
index 0000000..e8d80bb
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/CmsoEnvironmentPostProcessor.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.env.EnvironmentPostProcessor;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.MutablePropertySources;
+
+public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor {
+ // TODO tested in ONAP springboot and this is called before all of the properties files have been
+ // loaded...
+ // perhaps there is a post post processor? Until this works. DB password will be in the clear in the
+ // proeprties files.
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ String pwd = environment.getProperty("cmso.database.password");
+ if (pwd != null) {
+ pwd = PropertiesManagement.getDecryptedValue(pwd);
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("spring.datasource.password", pwd);
+ MapPropertySource propertySource = new MapPropertySource("abc", map);
+ MutablePropertySources proeprtySources = environment.getPropertySources();
+ proeprtySources.addLast(propertySource);
+ }
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java
new file mode 100644
index 0000000..4a46505
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/JerseyConfiguration.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import java.util.logging.Logger;
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.logging.LoggingFeature;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.servlet.ServletProperties;
+import org.onap.optf.cmso.topology.filters.CmsoContainerFilters;
+import org.onap.optf.cmso.topology.service.rs.AdminToolImpl;
+import org.onap.optf.cmso.topology.service.rs.HealthCheckImpl;
+import org.onap.optf.cmso.topology.service.rs.TopologyInterfaceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+@Component
+@ApplicationPath("/")
+public class JerseyConfiguration extends ResourceConfig {
+ private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());
+
+ /**
+ * Object mapper.
+ *
+ * @return the object mapper
+ */
+ @Bean
+ @Primary
+ public ObjectMapper objectMapper() {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
+ objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
+ return objectMapper;
+ }
+
+ /**
+ * Instantiates a new jersey configuration.
+ */
+ @Autowired
+ public JerseyConfiguration( /* LogRequestFilter lrf */ ) {
+ register(HealthCheckImpl.class);
+ register(AdminToolImpl.class);
+ register(TopologyInterfaceImpl.class);
+ property(ServletProperties.FILTER_FORWARD_ON_404, true);
+ // TODO: ONAP Conversion identify appropriate ONAP logging filters if any
+ // register(lrf, 6001);
+ // register(LogResponseFilter.class, 6004);
+
+ // TODO: Examine which logging features to enable
+ register(new LoggingFeature(log));
+ register(CmsoContainerFilters.class);
+ }
+
+ /**
+ * Jersey client.
+ *
+ * @return the client
+ */
+ @Bean
+ public Client jerseyClient() {
+ ClientConfig client = new ClientConfig();
+
+ // TODO: ONAP Conversion identify appropriate ONAP logging filters if any
+ // client.register(TransactionIdRequestFilter.class);
+ // client.register(TransactionIdResponseFilter.class);
+ // client.register(DateTimeParamConverterProvider.class);
+
+ return ClientBuilder.newClient(client);
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java
new file mode 100644
index 0000000..dfd44a6
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SecurityConfig.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+
+@Configuration
+@EnableWebSecurity
+@ComponentScan("org.onap.optf")
+@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+ @Autowired
+ private AuthProvider authProvider;
+
+ @Override
+ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+
+ auth.authenticationProvider(authProvider);
+ }
+
+ @Override
+ protected void configure(HttpSecurity http) throws Exception {
+
+ http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();
+
+ }
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java
new file mode 100644
index 0000000..4e6455c
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/SpringProfiles.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.topology;
+
+public class SpringProfiles {
+
+ public static final String AAF_AUTHENTICATION = "aaf-auth";
+ public static final String PROPRIETARY__AUTHENTICATION = "proprietary-auth";
+
+ private SpringProfiles() {}
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java
new file mode 100644
index 0000000..8915653
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/Availability.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+package org.onap.optf.cmso.topology.common;
+
+public enum Availability {
+ full, partial, unavailable
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java
new file mode 100644
index 0000000..fd15b25
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/common/LogMessages.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ *
+ * Copyright © 2019 AT&T Intellectual Property.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ ******************************************************************************/
+
+
+package org.onap.optf.cmso.topology.common;
+
+import com.att.eelf.configuration.EELFManager;
+import com.att.eelf.i18n.EELFResourceManager;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import javax.ws.rs.core.Response.Status;
+import org.apache.log4j.Level;
+import org.onap.observations.ObservationInterface;
+
+public enum LogMessages implements ObservationInterface {
+
+ FETCH_TICKET("Fetch ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ CREATE_TICKET("Create Ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ CANCEL_TICKET("Cancel ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ UPDATE_TICKET("Update ticket {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ GET_ACTIVE_TICKETS("Get active tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+ SEARCH_TICKETS("Search tickets {0} : {1}: {2} : {3}", Status.OK, Level.INFO),
+
+ TICKET_NOT_FOUND("Ticket not found id={0}", Status.NOT_FOUND, Level.INFO),
+ INVALID_ATTRIBUTE("Invalid attribute {0}={1}", Status.BAD_REQUEST, Level.INFO),
+ MISSING_REQUIRED_ATTRIBUTE("Missing required attribute '{0}'", Status.BAD_REQUEST, Level.INFO),
+ INVALID_REQUEST("The input data structure is incorrect", Status.BAD_REQUEST, Level.INFO),
+ REQUEST_TIMED_OUT("Request timed out.", Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+ UNEXPECTED_EXCEPTION("Unexpected exception encountered during processing. Please contact support : {0}",
+ Status.INTERNAL_SERVER_ERROR, Level.ERROR),
+
+ UNDEFINED_FILTER_ATTRIBUTE("Undefined filter attribute {0}", Status.BAD_REQUEST, Level.INFO),
+ INVALID_DATE_FILTER("Invalid date filter provided {0}=(1}", Status.BAD_REQUEST, Level.INFO),
+
+ INCOMING_MESSAGE("Incoming message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ INCOMING_MESSAGE_RESPONSE("Message response method={0} path={1} status={2}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE("Outgoing message method={0} path={1}", Status.OK, Level.INFO, true, false),
+ OUTGOING_MESSAGE_RETURNED("Outgoing message returned method={0} path={1} status={2}", Status.OK, Level.INFO, true,
+ false),
+
+ UNEXPECTED_RESPONSE("Unexpected response from {0} HTTP Status={1} : {2}", Status.OK, Level.INFO),
+ INVALID_CHANGE_WINDOW("Change window end time {1} must be after start time {0}", Status.OK, Level.INFO),
+ EXPECTED_EXCEPTION("Expected exception encountered during processing. {0}", Status.OK, Level.INFO),
+ UNABLE_TO_UPDATE_TICKET("Unable to update change ticket in TM: Schedule ID: {0} : changeid: {1} : Reason: {2}",
+ Status.OK, Level.INFO),
+ UNAUTHORIZED("Authorization failed.", Status.FORBIDDEN, Level.INFO),
+ UNAUTHENTICATED("Authentication failed.", Status.UNAUTHORIZED, Level.INFO),
+
+ ;
+ private final String defaultId;
+ private final String defaultMessage;
+ private final String defaultResolution;
+ private final String defaultAction;
+
+ private final Status status;
+ private final Level level;
+ private final Boolean audit;
+ private final Boolean metric;
+
+
+ private LogMessages(String message, Status code, Level lev) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ this.audit = false;
+ this.metric = false;
+ }
+
+ private LogMessages(String message, Status code, Level lev, Boolean audit, Boolean metric) {
+ defaultMessage = message;
+ level = lev;
+ status = code;
+ this.audit = audit;
+ this.metric = metric;
+ this.defaultId = this.name();
+ this.defaultResolution = "No resolution needed";
+ this.defaultAction = "No action is required";
+ }
+
+ private LogMessages(String message, Status code, Level lev, String id, String resolution, String action) {
+ level = lev;
+ status = code;
+ defaultMessage = message;
+ this.defaultId = id;
+ this.defaultResolution = resolution;
+ this.defaultAction = action;
+ this.audit = false;
+ this.metric = false;
+ }
+
+ static {
+ EELFResourceManager.loadMessageBundle("logmessages");
+ }
+
+ /**
+ * Gen properties.
+ *
+ * @return the string
+ */
+ public String genProperties() {
+ // Use this to regenerate properties file. The desire to change messages without updating code is
+ // well understood, but the developer should be able to code the defaults without having to update 2
+ // different files and
+ // get it wrong.
+ StringBuilder sb = new StringBuilder();
+ sb.append("# Generated from ").append(this.getClass().getName()).append("\n");
+ for (LogMessages lm : values()) {
+ sb.append(lm.name());
+ sb.append(" ").append(lm.defaultId);
+ sb.append("|").append(lm.defaultMessage);
+ sb.append("|").append(lm.defaultResolution);
+ sb.append("|").append(lm.defaultAction);
+ sb.append("\n");
+ }
+ return sb.toString();
+ }
+
+
+ // interface methods
+ @Override
+ public Level getLevel() {
+ return level;
+ }
+
+ @Override
+ public String getMessage() {
+ return defaultMessage;
+ }
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ @Override
+ public Enum<?> getValue() {
+ return this;
+ }
+
+ @Override
+ public String getDomain() {
+ return this.getClass().getSimpleName();
+ }
+
+ @Override
+ public Boolean getAudit() {
+ return audit;
+ }
+
+ @Override
+ public Boolean getMetric() {
+ return metric;
+ }
+
+ /**
+ * The main method.
+ *
+ * @param argv the arguments
+ */
+ public static void main(String[] argv) {
+ System.out.println(LogMessages.UNEXPECTED_EXCEPTION.genProperties());
+ try {
+ Files.write(Paths.get("src/main/resources/logmessages.properties"),
+ LogMessages.UNEXPECTED_EXCEPTION.genProperties().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties file.", e);
+
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("<html><body><h1>Cell Site Selection Scheduler mS Observations</h1>\n<table border=\"1\">\n<tr>");
+ sb.append("<td>Code</td> ");
+ sb.append("<td>Log Level</td> ");
+ sb.append("<td>Message</td> ");
+ sb.append("</tr>\n");
+ for (LogMessages m : LogMessages.values()) {
+ if (m.level == Level.ERROR || m.level == Level.WARN || m.level == Level.FATAL) {
+ sb.append("<tr>");
+ sb.append("<td>").append(m.name()).append("</td> ");
+ sb.append("<td>").append(m.level).append("</td> ");
+ sb.append("<td>").append(m.defaultMessage).append("</td> ");
+ sb.append("</tr>\n");
+ }
+ }
+ try {
+ Files.write(Paths.get("logmessages.html"), sb.toString().getBytes());
+ } catch (IOException e) {
+ EELFManager.getInstance().getDebugLogger().debug("Failed to update properties html file.", e);
+
+ }
+
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java
new file mode 100644
index 0000000..51d548e
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoClientFilters.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology.filters;
+
+import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.io.IOException;
+import javax.ws.rs.client.ClientRequestContext;
+import javax.ws.rs.client.ClientRequestFilter;
+import javax.ws.rs.client.ClientResponseContext;
+import javax.ws.rs.client.ClientResponseFilter;
+import javax.ws.rs.core.MultivaluedMap;
+import org.onap.observations.Mdc;
+import org.onap.observations.MessageHeaders;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.topology.Application;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Component;
+
+// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+@Component
+public class CmsoClientFilters implements ClientRequestFilter, ClientResponseFilter {
+
+ private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class);
+ private static String appId = "cmso";
+
+ @Override
+ public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
+ // On the way back
+ Mdc.metricEnd(responseContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE_RETURNED, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString(), responseContext.getStatusInfo().toString());
+ }
+
+ @Override
+ public void filter(ClientRequestContext requestContext) throws IOException {
+ // On the way out
+ Mdc.metricStart(requestContext);
+ Mdc.setCaller(17);
+ Observation.report(LogMessages.OUTGOING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUri().getPath().toString());
+ MultivaluedMap<String, Object> headers = requestContext.getHeaders();
+
+ String transactionId = (String) headers.getFirst(MessageHeaders.HeadersEnum.TransactionID.toString());
+ String mdcId = MDC.get(MDC_KEY_REQUEST_ID);
+ if (transactionId == null || transactionId.equals("")) {
+ if (mdcId != null) {
+ headers.add(HeadersEnum.TransactionID.toString(), mdcId);
+ }
+ }
+ headers.add(HeadersEnum.FromAppID.toString(), appId);
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java
new file mode 100644
index 0000000..2418aec
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/filters/CmsoContainerFilters.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology.filters;
+
+import java.io.IOException;
+import java.util.UUID;
+import javax.annotation.Priority;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.ext.Provider;
+import org.onap.observations.Mdc;
+import org.onap.observations.MessageHeaders;
+import org.onap.observations.MessageHeaders.HeadersEnum;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.topology.common.LogMessages;
+import org.springframework.stereotype.Component;
+
+@Priority(1)
+@Provider
+@Component
+public class CmsoContainerFilters implements ContainerRequestFilter, ContainerResponseFilter {
+
+
+ @Context
+ private HttpServletRequest servletRequest;
+
+ @Override
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+ try {
+ Mdc.auditEnd(requestContext, responseContext);
+ Observation.report(LogMessages.INCOMING_MESSAGE_RESPONSE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString(),
+ responseContext.getStatusInfo().toString());
+ MultivaluedMap<String, String> reqHeaders = requestContext.getHeaders();
+ MultivaluedMap<String, Object> respHeaders = responseContext.getHeaders();
+ String minorVersion = reqHeaders.getFirst(HeadersEnum.MinorVersion.toString());
+ respHeaders.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ respHeaders.add(HeadersEnum.LatestVersion.toString(), MessageHeaders.latestVersion);
+ respHeaders.add(HeadersEnum.PatchVersion.toString(), MessageHeaders.patchVersion);
+
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+ }
+
+ @Override
+ public void filter(ContainerRequestContext requestContext) throws IOException {
+ try {
+ // On the way in
+ Mdc.auditStart(requestContext, servletRequest);
+ Observation.report(LogMessages.INCOMING_MESSAGE, requestContext.getMethod(),
+ requestContext.getUriInfo().getPath().toString());
+
+ String majorVersion = requestContext.getUriInfo().getPath();
+ if (majorVersion != null) {
+
+ if (majorVersion.startsWith("dispatch/")) {
+ return;
+ }
+ majorVersion = majorVersion.replaceAll("/.*$", "");
+ }
+ if (!MessageHeaders.validateMajorVersion(majorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported Major version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+ }
+ MultivaluedMap<String, String> headers = requestContext.getHeaders();
+ String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString());
+ if (transactionId == null) {
+ transactionId = UUID.randomUUID().toString();
+ headers.add(HeadersEnum.TransactionID.toString(), transactionId);
+ }
+ String minorVersion = headers.getFirst(HeadersEnum.MinorVersion.toString());
+ if (minorVersion == null) {
+ minorVersion = MessageHeaders.supportedMajorVersions.get(majorVersion);
+ headers.add(HeadersEnum.MinorVersion.toString(), minorVersion);
+ }
+ if (!MessageHeaders.validateMajorMinorVersion(majorVersion, minorVersion)) {
+ ResponseBuilder builder = null;
+ String response = "Unsupported API version";
+ builder = Response.status(Response.Status.NOT_FOUND).entity(response);
+ throw new WebApplicationException(builder.build());
+
+ }
+ } catch (Exception e) {
+ if (e instanceof WebApplicationException) {
+ Observation.report(LogMessages.EXPECTED_EXCEPTION, e.getMessage());
+ throw e;
+ } else {
+ Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e.getMessage());
+ }
+ }
+
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java
new file mode 100644
index 0000000..032c6f8
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminTool.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+
+@Api("Administration")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface AdminTool {
+
+ // ******************************************************************
+ @GET
+ @Path("/admin/{id}")
+ @Produces({MediaType.TEXT_PLAIN})
+ @RequestMapping(value = "/{apiVersion}/admin/{id}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN)
+ @ApiOperation(value = "", notes = "Returns encrypted value of id.", response = String.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Request failed")})
+ public Response exec(@ApiParam(
+ value = "v1|v2") @PathVariable @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Identifier") @PathVariable @PathParam("id") String id);
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java
new file mode 100644
index 0000000..8b1893e
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/AdminToolImpl.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology.service.rs;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.springframework.stereotype.Controller;
+
+@Controller
+public class AdminToolImpl implements AdminTool {
+ private static EELFLogger log = EELFManager.getInstance().getLogger(AdminToolImpl.class);
+
+
+ @Context
+ UriInfo uri;
+
+ @Context
+ HttpServletRequest request;
+
+ @Override
+ public Response exec(String apiVersion, String id) {
+ log.info("AdminTool.exec entered " + uri.getPath());
+ if (id.length() < 4) {
+ return Response.ok("").build();
+ }
+ String encrypted = PropertiesManagement.getEncryptedValue(id);
+ Response response = Response.ok(encrypted).build();
+ return response;
+ }
+
+}
diff --git a/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java
new file mode 100644
index 0000000..d8d7943
--- /dev/null
+++ b/cmso-topology/src/main/java/org/onap/optf/cmso/topology/service/rs/HealthCheck.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.optf.cmso.topology.service.rs;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.onap.optf.cmso.topology.service.rs.models.HealthCheckMessage;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Api("Administration")
+@Path("/{apiVersion}")
+@Produces({MediaType.APPLICATION_JSON})
+public interface HealthCheck {
+
+ // ******************************************************************
+ @GET
+ @Path("/health")
+ @Produces({MediaType.APPLICATION_JSON})
+ @RequestMapping(value = "/{apiVersion}/health", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "", notes = "Returns health status of server.", response = HealthCheckMessage.class)
+ @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
+ @ApiResponse(code = 400, message = "Not healthy", response = HealthCheckMessage.class)})
+ public Response healthCheck(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion,
+ @ApiParam(value = "Check Interfaces") @QueryParam("checkInterfaces") @DefaultValue(
+ value = "true") Boolean checkInterfaces);
+}
diff --git a/pom.xml b/pom.xml
index 261c6a8..12f4980 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,6 +63,8 @@
<modules>
<module>cmso-database</module>
+ <module>cmso-service</module>
+ <module>cmso-ticketmgt</module>
<module>cmso-robot</module>
</modules>