/*\r
- * Copyright © 2017-2018 AT&T Intellectual Property.\r
- * Modifications Copyright © 2018 IBM.\r
- * \r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- * \r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- * \r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
+ * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except\r
+ * in compliance with the License. You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software distributed under the License\r
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express\r
+ * or implied. See the License for the specific language governing permissions and limitations under\r
+ * the License.\r
+ *\r
+ *\r
+ * Unless otherwise specified, all documentation contained herein is licensed under the Creative\r
+ * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except\r
+ * in compliance with the License. You may obtain a copy of the License at\r
+ *\r
+ * https://creativecommons.org/licenses/by/4.0/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, documentation distributed under the\r
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either\r
+ * express or implied. See the License for the specific language governing permissions and\r
* limitations under the License.\r
- * \r
- * \r
- * Unless otherwise specified, all documentation contained herein is licensed\r
- * under the Creative Commons License, Attribution 4.0 Intl. (the "License");\r
- * you may not use this documentation except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- * \r
- * https://creativecommons.org/licenses/by/4.0/\r
- * \r
- * Unless required by applicable law or agreed to in writing, documentation\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
-*/\r
+ */\r
\r
package org.onap.optf.cmso.ticketmgt;\r
\r
+import com.att.eelf.configuration.EELFLogger;\r
+import com.att.eelf.configuration.EELFManager;\r
+import com.fasterxml.jackson.databind.JsonNode;\r
+import com.fasterxml.jackson.databind.ObjectMapper;\r
+import com.fasterxml.jackson.databind.node.ArrayNode;\r
+import com.fasterxml.jackson.databind.node.ObjectNode;\r
import java.net.UnknownHostException;\r
import java.util.ArrayList;\r
import java.util.HashMap;\r
import java.util.List;\r
import java.util.Map;\r
import java.util.UUID;\r
-\r
import javax.ws.rs.ProcessingException;\r
import javax.ws.rs.client.Client;\r
import javax.ws.rs.client.ClientBuilder;\r
import javax.ws.rs.core.MediaType;\r
import javax.ws.rs.core.Response;\r
import javax.ws.rs.core.Response.Status;\r
-\r
import org.apache.commons.text.StringSubstitutor;\r
import org.joda.time.format.ISODateTimeFormat;\r
import org.onap.observations.Mdc;\r
import org.onap.optf.cmso.common.LogMessages;\r
import org.onap.optf.cmso.common.PropertiesManagement;\r
import org.onap.optf.cmso.common.exceptions.CMSException;\r
-import org.onap.optf.cmso.filters.CMSOClientFilters;\r
+import org.onap.optf.cmso.filters.CmsoClientFilters;\r
import org.onap.optf.cmso.model.ChangeManagementGroup;\r
import org.onap.optf.cmso.model.ChangeManagementSchedule;\r
import org.onap.optf.cmso.model.DomainData;\r
import org.springframework.core.env.Environment;\r
import org.springframework.stereotype.Component;\r
\r
-import com.att.eelf.configuration.EELFLogger;\r
-import com.att.eelf.configuration.EELFManager;\r
-import com.fasterxml.jackson.databind.JsonNode;\r
-import com.fasterxml.jackson.databind.ObjectMapper;\r
-import com.fasterxml.jackson.databind.node.ArrayNode;\r
-import com.fasterxml.jackson.databind.node.ObjectNode;\r
-\r
+/**\r
+ * The Class TmClient.\r
+ */\r
@Component\r
public class TmClient {\r
private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();\r
PropertiesManagement pm;\r
\r
@Autowired\r
- ChangeManagementScheduleDAO cmScheduleDAO;\r
+ ChangeManagementScheduleDAO cmScheduleDao;\r
\r
@Autowired\r
BuildCreateRequest buildCreateRequest;\r
@Autowired\r
TmEndpoints tmEndpoints;\r
\r
+ /**\r
+ * Creates the change ticket.\r
+ *\r
+ * @param schedule the schedule\r
+ * @param group the group\r
+ * @param vnfNames the vnf names\r
+ * @param domainData the domain data\r
+ * @return the string\r
+ * @throws CMSException the CMS exception\r
+ */\r
public String createChangeTicket(Schedule schedule, ChangeManagementGroup group, List<String> vnfNames,\r
- List<DomainData> domainData) throws CMSException {\r
+ List<DomainData> domainData) throws CMSException {\r
\r
String changeId = "";\r
String workflowName = CmHelpers.getDomainData(domainData, CmDomainDataEnum.WorkflowName);\r
return changeId;\r
}\r
\r
+ /**\r
+ * Close ticket.\r
+ *\r
+ * @param schedule the schedule\r
+ * @param group the group\r
+ * @param cmSchedules the cm schedules\r
+ * @param changeId the change id\r
+ * @param closureCode the closure code\r
+ * @param closingComments the closing comments\r
+ * @throws CMSException the CMS exception\r
+ */\r
public void closeTicket(Schedule schedule, ChangeManagementGroup group, List<ChangeManagementSchedule> cmSchedules,\r
- String changeId, ClosureCode closureCode, String closingComments) throws CMSException {\r
+ String changeId, ClosureCode closureCode, String closingComments) throws CMSException {\r
Map<String, Object> variables =\r
- getCloseVariables(schedule, group, cmSchedules, changeId, closureCode, closingComments);\r
+ getCloseVariables(schedule, group, cmSchedules, changeId, closureCode, closingComments);\r
JsonNode closeChangeRecord = buildCreateRequest.createCloseCancelChangeRecord(variables);\r
debug.debug("closeChangeRecord=" + closeChangeRecord.toString());\r
postCloseChangeTicket(closeChangeRecord, schedule.getScheduleId(), changeId);\r
}\r
\r
+ /**\r
+ * Cancel ticket.\r
+ *\r
+ * @param schedule the schedule\r
+ * @param cms the cms\r
+ * @param changeId the change id\r
+ * @throws CMSException the CMS exception\r
+ */\r
public void cancelTicket(Schedule schedule, ChangeManagementSchedule cms, String changeId) throws CMSException {\r
Map<String, Object> variables = getCancelVariables(schedule, changeId);\r
JsonNode cancelChangeRecord = buildCreateRequest.createCancelChangeRecord(variables);\r
postCloseChangeTicket(cancelChangeRecord, schedule.getScheduleId(), changeId);\r
}\r
\r
+ /**\r
+ * Update ticket.\r
+ *\r
+ * @param schedule the schedule\r
+ * @param cms the cms\r
+ * @param changeId the change id\r
+ * @throws CMSException the CMS exception\r
+ */\r
public void updateTicket(Schedule schedule, ChangeManagementSchedule cms, String changeId) throws CMSException {\r
Map<String, Object> variables = getUpdateVariables(schedule, changeId);\r
JsonNode updateChangeRecord = buildCreateRequest.createUpdateChangeRecord(variables);\r
postUpdateChangeTicket(updateChangeRecord, schedule.getScheduleId(), changeId);\r
}\r
\r
+ /**\r
+ * Gets the change ticket.\r
+ *\r
+ * @param changeId the change id\r
+ * @return the change ticket\r
+ */\r
public TmChangeInfo getChangeTicket(String changeId) {\r
Map<String, String> mdcSave = Mdc.save();\r
try {\r
break;\r
default: {\r
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "TM", String.valueOf(response.getStatus()),\r
- response.toString());\r
+ response.toString());\r
}\r
}\r
} catch (Exception e) {\r
}\r
\r
private Map<String, Object> getCloseVariables(Schedule schedule, ChangeManagementGroup group,\r
- List<ChangeManagementSchedule> cmSchedules, String changeId, ClosureCode closureCode,\r
- String closingComments) {\r
+ List<ChangeManagementSchedule> cmSchedules, String changeId, ClosureCode closureCode,\r
+ String closingComments) {\r
String requesterId = schedule.getUserId();\r
- Map<String, Object> variables = new HashMap<String, Object>();\r
- if (requesterId.length() > Variables.requesterId.getMaxLength())\r
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {\r
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());\r
+ }\r
long actualStartDate = 0;\r
long actualEndDate = 0;\r
for (ChangeManagementSchedule cms : cmSchedules) {\r
- if (cms.getDispatchTimeMillis() != null)\r
- if (actualStartDate == 0 || cms.getDispatchTimeMillis() < actualStartDate)\r
+ if (cms.getDispatchTimeMillis() != null) {\r
+ if (actualStartDate == 0 || cms.getDispatchTimeMillis() < actualStartDate) {\r
actualStartDate = cms.getDispatchTimeMillis();\r
- if (cms.getExecutionCompletedTimeMillis() != null)\r
- if (cms.getExecutionCompletedTimeMillis() > actualEndDate)\r
+ }\r
+ }\r
+ if (cms.getExecutionCompletedTimeMillis() != null) {\r
+ if (cms.getExecutionCompletedTimeMillis() > actualEndDate) {\r
actualEndDate = cms.getExecutionCompletedTimeMillis();\r
+ }\r
+ }\r
}\r
if (closureCode != ClosureCode.Successful) {\r
- if (actualEndDate == 0)\r
+ if (actualEndDate == 0) {\r
actualEndDate = System.currentTimeMillis();\r
- if (actualStartDate == 0)\r
+ }\r
+ if (actualStartDate == 0) {\r
actualStartDate = actualEndDate - 1000;\r
+ }\r
\r
}\r
+ Map<String, Object> variables = new HashMap<String, Object>();\r
+\r
variables.put(Variables.status.toString(), "Closed");\r
variables.put(Variables.requesterId.toString(), requesterId);\r
variables.put(Variables.actualStartDate.toString(), actualStartDate / 1000);\r
private Map<String, Object> getCancelVariables(Schedule schedule, String changeId) {\r
String requesterId = schedule.getUserId();\r
Map<String, Object> variables = new HashMap<String, Object>();\r
- if (requesterId.length() > Variables.requesterId.getMaxLength())\r
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {\r
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());\r
+ }\r
variables.put(Variables.requesterId.toString(), requesterId);\r
variables.put(Variables.changeId.toString(), changeId);\r
return variables;\r
private Map<String, Object> getUpdateVariables(Schedule schedule, String changeId) {\r
String requesterId = schedule.getUserId();\r
Map<String, Object> variables = new HashMap<String, Object>();\r
- if (requesterId.length() > Variables.requesterId.getMaxLength())\r
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {\r
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());\r
+ }\r
variables.put(Variables.requesterId.toString(), requesterId);\r
variables.put(Variables.changeId.toString(), changeId);\r
return variables;\r
}\r
\r
private void postCloseChangeTicket(JsonNode closeChangeRecord, String scheduleId, String changeId)\r
- throws CMSException {\r
+ throws CMSException {\r
Map<String, String> mdcSave = Mdc.save();\r
try {\r
Response response = null;\r
debug.debug("response=" + respString);\r
if (!isAlreadyClosed(respString)) {\r
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),\r
- response.toString() + " : " + respString);\r
+ response.toString() + " : " + respString);\r
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_CLOSE_CHANGE_TICKET,\r
- scheduleId, changeId, respString);\r
+ scheduleId, changeId, respString);\r
}\r
}\r
break;\r
default: {\r
String message = response.readEntity(String.class);\r
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),\r
- response.toString() + " : " + message);\r
+ response.toString() + " : " + message);\r
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_CLOSE_CHANGE_TICKET,\r
- scheduleId, changeId, message);\r
+ scheduleId, changeId, message);\r
}\r
}\r
} catch (ProcessingException e) {\r
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());\r
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_CLOSE_CHANGE_TICKET, scheduleId,\r
- changeId, e.toString());\r
+ changeId, e.toString());\r
} finally {\r
Mdc.restore(mdcSave);\r
}\r
}\r
\r
private Map<String, Object> getVariables(Schedule schedule, ChangeManagementGroup group, List<String> vnfNames,\r
- List<DomainData> domainData) {\r
- Long plannedStartDate = group.getStartTimeMillis();\r
- Long plannedEndDate = group.getFinishTimeMillis();\r
- Long validationStartTime = plannedStartDate + group.getNormalDurationInSecs();\r
- Long backoutStartTime = plannedEndDate - group.getAdditionalDurationInSecs();\r
+ List<DomainData> domainData) {\r
String requesterId = schedule.getUserId();\r
Map<String, Object> variables = new HashMap<String, Object>();\r
\r
String vnfList = vnfNames.toString();\r
- if (vnfList.length() > Variables.vnfList.getMaxLength())\r
+ if (vnfList.length() > Variables.vnfList.getMaxLength()) {\r
vnfList = vnfList.substring(0, Variables.vnfList.getMaxLength());\r
- if (requesterId.length() > Variables.requesterId.getMaxLength())\r
+ }\r
+ if (requesterId.length() > Variables.requesterId.getMaxLength()) {\r
requesterId = requesterId.substring(0, Variables.requesterId.getMaxLength());\r
+ }\r
\r
variables.put(Variables.vnfList.toString(), vnfList);\r
variables.put(Variables.vnfName.toString(), vnfNames.get(0));\r
variables.put(Variables.requesterId.toString(), requesterId);\r
+ Long plannedStartDate = group.getStartTimeMillis();\r
+ Long plannedEndDate = group.getFinishTimeMillis();\r
variables.put(Variables.plannedStartDate.toString(), plannedStartDate / 1000);\r
variables.put(Variables.plannedEndDate.toString(), plannedEndDate / 1000);\r
+ Long validationStartTime = plannedStartDate + group.getNormalDurationInSecs();\r
+ Long backoutStartTime = plannedEndDate - group.getAdditionalDurationInSecs();\r
variables.put(Variables.validationStartTime.toString(), validationStartTime / 1000);\r
variables.put(Variables.backoutStartTime.toString(), backoutStartTime / 1000);\r
// These will be display UTC -\r
variables.put(Variables.validationStartTimeDisplay.toString(),\r
- ISODateTimeFormat.dateTimeNoMillis().print(validationStartTime));\r
+ ISODateTimeFormat.dateTimeNoMillis().print(validationStartTime));\r
variables.put(Variables.backoutStartTimeDisplay.toString(),\r
- ISODateTimeFormat.dateTimeNoMillis().print(backoutStartTime));\r
+ ISODateTimeFormat.dateTimeNoMillis().print(backoutStartTime));\r
variables.put(Variables.plannedStartTimeDisplay.toString(),\r
- ISODateTimeFormat.dateTimeNoMillis().print(plannedStartDate));\r
+ ISODateTimeFormat.dateTimeNoMillis().print(plannedStartDate));\r
variables.put(Variables.plannedEndTimeDisplay.toString(),\r
- ISODateTimeFormat.dateTimeNoMillis().print(plannedEndDate));\r
+ ISODateTimeFormat.dateTimeNoMillis().print(plannedEndDate));\r
\r
// Ticket field values can be passed in via the DomainData\r
JsonNode defaultValues = buildCreateRequest.getYaml("DefaultChangeTicketProperties");\r
}\r
} else {\r
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),\r
- response.toString() + " : " + "Response is empty");\r
+ response.toString() + " : " + "Response is empty");\r
throw new CMSException(Status.EXPECTATION_FAILED, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,\r
- scheduleId, "Response is empty");\r
+ scheduleId, "Response is empty");\r
}\r
}\r
break;\r
default: {\r
String message = response.readEntity(String.class);\r
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),\r
- response.toString() + " : " + message);\r
+ response.toString() + " : " + message);\r
throw new CMSException(Status.EXPECTATION_FAILED, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,\r
- scheduleId, message);\r
+ scheduleId, message);\r
}\r
}\r
} catch (ProcessingException e) {\r
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());\r
throw new CMSException(Status.EXPECTATION_FAILED, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET, scheduleId,\r
- e.toString());\r
+ e.toString());\r
} finally {\r
Mdc.restore(mdcSave);\r
}\r
}\r
\r
private String postUpdateChangeTicket(JsonNode updateChangeRecord, String scheduleId, String changeId)\r
- throws CMSException {\r
+ throws CMSException {\r
Map<String, String> mdcSave = Mdc.save();\r
try {\r
String url = env.getProperty("vtm.url") + env.getProperty("vtm.updatePath");\r
default: {\r
String message = response.readEntity(String.class);\r
Observation.report(LogMessages.UNEXPECTED_RESPONSE, "vTM", String.valueOf(response.getStatus()),\r
- response.toString() + " : " + message);\r
+ response.toString() + " : " + message);\r
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_UPDATE_CHANGE_TICKET,\r
- scheduleId, changeId, message);\r
+ scheduleId, changeId, message);\r
}\r
}\r
} catch (ProcessingException e) {\r
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());\r
throw new CMSException(Status.PRECONDITION_FAILED, LogMessages.UNABLE_TO_UPDATE_CHANGE_TICKET, scheduleId,\r
- changeId, e.toString());\r
+ changeId, e.toString());\r
} finally {\r
Mdc.restore(mdcSave);\r
}\r
return changeId;\r
}\r
\r
- private Response vtmPostOld(String url, Object request, String scheduleId) throws CMSException {\r
- Response response = null;\r
- try {\r
- String user = env.getProperty("vtm.user");\r
- String pass = pm.getProperty("vtm.pass", "");\r
- // Cannot provide changeId. Interesting.\r
- // This should be replaced by fetch\r
- // For now, make a best effort to get the passed changeId\r
-\r
- Client client = ClientBuilder.newClient();\r
- client.register(new BasicAuthenticatorFilter(user, pass));\r
- client.register(new CMSOClientFilters());\r
- WebTarget target = client.target(url);\r
- Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);\r
- ObjectMapper mapper = new ObjectMapper();\r
- String jsonRequest = mapper.writeValueAsString(request);\r
- debug.debug("vTM URL = " + url + " user=" + user + " : " + jsonRequest);\r
- response = invocationBuilder.post(Entity.json(request));\r
- // String message = response.readEntity(String.class);\r
- // debug.debug("Return from " + url + " : " + response.toString() + "\n" +\r
- // message);\r
- debug.debug("Return from " + url + " : " + response.toString());\r
- } catch (Exception e) {\r
- Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.toString());\r
- throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET, scheduleId,\r
- e.getMessage());\r
- }\r
- return response;\r
- }\r
\r
private Response tmPost(Endpoint ep, Object request, String scheduleId) throws CMSException {\r
Response response = null;\r
\r
Client client = ClientBuilder.newClient();\r
client.register(new BasicAuthenticatorFilter(user, pass));\r
- client.register(new CMSOClientFilters());\r
+ client.register(new CmsoClientFilters());\r
WebTarget target = client.target(url);\r
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);\r
ObjectMapper mapper = new ObjectMapper();\r
} catch (ProcessingException e) {\r
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.toString());\r
url = tmEndpoints.getNextEndpoint(ep, endpoints);\r
- if (url == null || !tryNextURL(e)) {\r
+ if (url == null || !tryNextUrl(e)) {\r
throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,\r
- scheduleId, e.getMessage());\r
+ scheduleId, e.getMessage());\r
}\r
} catch (Exception e) {\r
Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.toString());\r
throw new CMSException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNABLE_TO_CREATE_CHANGE_TICKET,\r
- scheduleId, e.getMessage());\r
+ scheduleId, e.getMessage());\r
}\r
}\r
return response;\r
}\r
\r
- private boolean tryNextURL(ProcessingException e) {\r
- if (e.getCause() instanceof UnknownHostException)\r
+ private boolean tryNextUrl(ProcessingException exc) {\r
+ if (exc.getCause() instanceof UnknownHostException) {\r
return true;\r
+ }\r
return true;\r
}\r
\r
+ /**\r
+ * Health check.\r
+ *\r
+ * @return the health check component\r
+ */\r
public HealthCheckComponent healthCheck() {\r
// No op\r
HealthCheckComponent hcc = new HealthCheckComponent();\r