Commit 2 for Define OPtimizer API mS 08/83808/1
authorJerry Flood <jflood@att.com>
Sun, 31 Mar 2019 12:31:42 +0000 (08:31 -0400)
committerJerry Flood <jflood@att.com>
Sun, 31 Mar 2019 12:39:22 +0000 (08:39 -0400)
Multiple commits required due to commit size limitation.

Change-Id: I73cc4e72447aa6d80c666db45cf5c02b31f6cda8
Issue-ID: OPTFRA-437
Signed-off-by: Jerry Flood <jflood@att.com>
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtClient.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtRequestManager.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsRequest.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsResponse.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/Availability.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/TicketData.java [new file with mode: 0644]
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java
cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java

diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtClient.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtClient.java
new file mode 100644 (file)
index 0000000..21f0d76
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.ticketmgt;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
+import org.onap.optf.cmso.common.PropertiesManagement;
+import org.onap.optf.cmso.common.exceptions.CmsoException;
+import org.onap.optf.cmso.optimizer.clients.common.models.ElementCriteria;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsRequest;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse.ActiveTicketResponseStatus;
+import org.onap.optf.cmso.optimizer.clients.topology.TopologyRequestManager;
+import org.onap.optf.cmso.optimizer.clients.topology.models.ConstraintElements;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyElementInfo;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyPolicyInfo;
+import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.filters.CmsoClientFilters;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Ticket;
+import org.onap.optf.cmso.optimizer.model.Topology;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.TicketDao;
+import org.onap.optf.cmso.optimizer.service.rs.models.ElementInfo;
+import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
+import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * The Class TicketMgtClient.
+ */
+@Component
+public class TicketMgtClient {
+    private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
+
+    @Autowired
+    Environment env;
+
+    @Autowired
+    PropertiesManagement pm;
+
+    @Autowired
+    RequestDao requestDao;
+
+    @Autowired
+    TicketDao ticketDao;
+
+    @Autowired
+    TopologyRequestManager topologyRequestManager;
+
+    /**
+     * Make request of ticket mgt system.
+     *
+     * @param requestRow the request row
+     * @param ticketRow the ticket row
+     * @return the active tickets response
+     */
+    public ActiveTicketsResponse makeRequest(Request requestRow, Ticket ticketRow) {
+        ActiveTicketsResponse ticketResponse = new ActiveTicketsResponse();
+        Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
+        if (ticketRow.getTicketsRetries() >= maxAttempts) {
+            ticketResponse.setStatus(ActiveTicketResponseStatus.FAILED);
+            ticketResponse.setErrorMessage(LogMessages.EXCEEDED_RETRY_LIMIT.format("Topology", maxAttempts.toString()));
+            Observation.report(LogMessages.EXCEEDED_RETRY_LIMIT, "TicketMgt", maxAttempts.toString());
+            return ticketResponse;
+        }
+        ObjectMapper om = new ObjectMapper();
+        String originalRequest = requestRow.getRequest();
+        OptimizerRequest optimizerRequest = null;;
+        try {
+            optimizerRequest = om.readValue(originalRequest, OptimizerRequest.class);
+            ActiveTicketsRequest apiRequest = buildRequest(optimizerRequest);
+            ticketResponse = initiateApiRequest(apiRequest, ticketRow, requestRow);
+        } catch (Exception e) {
+            ticketResponse.setStatus(ActiveTicketResponseStatus.FAILED);
+            ticketResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+            Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+        }
+        return ticketResponse;
+    }
+
+    private ActiveTicketsRequest buildRequest(OptimizerRequest optimizerRequest)
+                    throws JsonParseException, JsonMappingException, IOException {
+        UUID uuid = UUID.fromString(optimizerRequest.getRequestId());
+        Topology topologyRow = topologyRequestManager.getExistingTopology(uuid);
+        String topologyString = topologyRow.getTopology();
+        TopologyResponse topologyResponse = new ObjectMapper().readValue(topologyString, TopologyResponse.class);
+        ActiveTicketsRequest apiRequest = new ActiveTicketsRequest();
+        apiRequest.setRequestId(optimizerRequest.getRequestId());
+        apiRequest.setCommonData(optimizerRequest.getCommonData());
+        apiRequest.setChangeWindows(optimizerRequest.getChangeWindows());
+        apiRequest.setElements(getElementCriteria(topologyResponse));
+        return apiRequest;
+    }
+
+    private List<TopologyPolicyInfo> getPolicies(OptimizerRequest optimizerRequest) {
+        List<TopologyPolicyInfo> list = new ArrayList<>();
+        for (PolicyInfo optInfo : optimizerRequest.getPolicies()) {
+            TopologyPolicyInfo topInfo = new TopologyPolicyInfo();
+            topInfo.setPolicyDescription(optInfo.getPolicyDescription());
+            topInfo.setPolicyName(optInfo.getPolicyName());
+            topInfo.setPolicyModifiers(optInfo.getPolicyModifiers());
+            list.add(topInfo);
+        }
+        return list;
+    }
+
+    private List<ElementCriteria> getElementCriteria(TopologyResponse topologyResponse) {
+        Map<String, ElementCriteria> map = new HashMap<>();
+        for (TopologyElementInfo info : topologyResponse.getElements()) {
+            ElementCriteria criteria = new ElementCriteria();
+            criteria.setElementId(info.getElementId());
+            criteria.setElementData(info.getElementData());
+            map.put(criteria.getElementId(), criteria);
+            if (info.getRequiredElements() != null) {
+                for (String required : info.getRequiredElements()) {
+                    if (!map.containsKey(required)) {
+                        ElementCriteria crit = new ElementCriteria();
+                        crit.setElementId(required);
+                        map.put(crit.getElementId(), crit);
+                    }
+                }
+            }
+            if (info.getConstraintElements() != null) {
+                for (ConstraintElements constraint : info.getConstraintElements()) {
+                    if (!map.containsKey(constraint.getElementId())) {
+                        ElementCriteria crit = new ElementCriteria();
+                        crit.setElementId(constraint.getElementId());
+                        map.put(crit.getElementId(), crit);
+                    }
+                }
+            }
+
+        }
+        List<ElementCriteria> list = new ArrayList<>();
+        list.addAll(map.values());
+        return list;
+    }
+
+
+    private ActiveTicketsResponse initiateApiRequest(ActiveTicketsRequest apiRequest, Ticket ticketRow,
+                    Request requestRow) throws CmsoException, JsonProcessingException {
+        String url = env.getProperty("cmso.ticket.create.request.url");
+        String username = env.getProperty("mechid.user");
+        String password = pm.getProperty("mechid.pass", "");
+        Client client = ClientBuilder.newClient();
+        client.register(new BasicAuthenticatorFilter(username, password));
+        client.register(new CmsoClientFilters());
+        debug.debug("topology url / user: " + url + " / " + username);
+        debug.debug("topology Request: " + new ObjectMapper().writeValueAsString(apiRequest));
+        Observation.report(LogMessages.TOPOLOGY_REQUEST, "Begin", apiRequest.getRequestId(), url);
+        ticketRow.setTicketsStart(System.currentTimeMillis());
+
+        WebTarget webTarget = client.target(url);
+        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
+        Response response = invocationBuilder.post(Entity.json(apiRequest));
+        Observation.report(LogMessages.TOPOLOGY_REQUEST, "End", apiRequest.getRequestId(), url);
+        ActiveTicketsResponse apiResponse = null;
+        switch (response.getStatus()) {
+            case 202:
+                debug.debug("Successfully scheduled asynchronous ticket request: " + apiRequest.getRequestId());
+                break;
+            case 200:
+                debug.debug("Successfully retrieved tickets: " + apiRequest.getRequestId());
+                apiResponse = processApiResponse(apiRequest, response, ticketRow, requestRow);
+                break;
+            default:
+                throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNEXPECTED_RESPONSE, url,
+                                response.getStatusInfo().toString());
+        }
+        return apiResponse;
+    }
+
+    private ActiveTicketsResponse processApiResponse(ActiveTicketsRequest apiRequest, Response response,
+                    Ticket ticketRow, Request requestRow) {
+        String responseString = response.readEntity(String.class);
+        ActiveTicketsResponse apiResponse = null;
+        try {
+            apiResponse = new ObjectMapper().readValue(responseString, ActiveTicketsResponse.class);
+            ticketRow.setTickets(responseString);
+        } catch (Exception e) {
+            Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+            apiResponse = new ActiveTicketsResponse();
+            apiResponse.setRequestId(apiRequest.getRequestId());
+            apiResponse.setStatus(ActiveTicketResponseStatus.FAILED);
+            apiResponse.setErrorMessage(e.getMessage());
+        }
+        return apiResponse;
+    }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtRequestManager.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/TicketMgtRequestManager.java
new file mode 100644 (file)
index 0000000..8c7dfb6
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * ============LICENSE_START==============================================
+ * Copyright (c) 2019 AT&T Intellectual Property.
+ * =======================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ * ============LICENSE_END=================================================
+ *
+ */
+
+package org.onap.optf.cmso.optimizer.clients.ticketmgt;
+
+import java.util.Optional;
+import org.onap.observations.Observation;
+import org.onap.optf.cmso.optimizer.clients.ticketmgt.models.ActiveTicketsResponse;
+import org.onap.optf.cmso.optimizer.common.LogMessages;
+import org.onap.optf.cmso.optimizer.model.Request;
+import org.onap.optf.cmso.optimizer.model.Ticket;
+import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
+import org.onap.optf.cmso.optimizer.model.dao.TicketDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * Ticket Mgt request manager.
+ *
+ * @author jf9860
+ *
+ */
+@Component
+public class TicketMgtRequestManager {
+
+    @Autowired
+    Environment env;
+
+    @Autowired
+    RequestDao requestDao;
+
+    @Autowired
+    TicketDao ticketDao;
+
+    @Autowired
+    TicketMgtClient ticketmgtClient;
+
+    /**
+     * Creates the topology request.
+     *
+     * @param requestRow the uuid
+     * @return the active tickets response
+     */
+    public ActiveTicketsResponse createTicketsRequest(Request requestRow) {
+        try {
+            Ticket row = null;
+            Optional<Ticket> rowOpt = ticketDao.findById(requestRow.getUuid());
+            if (rowOpt.isPresent()) {
+                row = rowOpt.get();
+
+            }
+            if (row == null) {
+                row = new Ticket();
+                row.setUuid(requestRow.getUuid());
+                row.setTicketsRetries(0);
+            }
+            ActiveTicketsResponse apiResponse = ticketmgtClient.makeRequest(requestRow, row);
+            switch (apiResponse.getStatus()) {
+                case COMPLETED:
+                    break;
+                case FAILED:
+                    break;
+                case IN_PROGRESS:
+                    break;
+                default:
+                    break;
+            }
+            return apiResponse;
+        } catch (Exception e) {
+            Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+        }
+        return null;
+
+    }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsRequest.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsRequest.java
new file mode 100644 (file)
index 0000000..f03c6f3
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package org.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import org.onap.optf.cmso.optimizer.clients.common.models.ElementCriteria;
+import org.onap.optf.cmso.optimizer.service.rs.models.ChangeWindow;
+import org.onap.optf.cmso.optimizer.service.rs.models.NameValue;
+
+public class ActiveTicketsRequest implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private static EELFLogger log = EELFManager.getInstance().getLogger(ActiveTicketsRequest.class);
+
+    @ApiModelProperty(value = "Unique Id of the request")
+    private String requestId;
+
+    @ApiModelProperty(
+                    value = "Implementation specific name value pairs provided to be passed to Ticket Management query .")
+    private List<NameValue> commonData;
+
+    @ApiModelProperty(value = "Lists of desired change windows for which TicketData will be returned.")
+    private List<ChangeWindow> changeWindows = new ArrayList<>();
+
+    @ApiModelProperty(value = "List of the elements for which TicketData will be returned.")
+    private List<ElementCriteria> elements = new ArrayList<>();
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+
+
+    public List<NameValue> getCommonData() {
+        return commonData;
+    }
+
+
+    public void setCommonData(List<NameValue> commonData) {
+        this.commonData = commonData;
+    }
+
+
+    public List<ChangeWindow> getChangeWindows() {
+        return changeWindows;
+    }
+
+
+    public void setChangeWindows(List<ChangeWindow> changeWindows) {
+        this.changeWindows = changeWindows;
+    }
+
+
+    public List<ElementCriteria> getElements() {
+        return elements;
+    }
+
+
+    public void setElements(List<ElementCriteria> elements) {
+        this.elements = elements;
+    }
+
+
+    @Override
+    public String toString() {
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            return mapper.writeValueAsString(this);
+        } catch (JsonProcessingException e) {
+            log.debug("Error in toString()", e);
+        }
+        return "";
+    }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsResponse.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/ActiveTicketsResponse.java
new file mode 100644 (file)
index 0000000..9780af6
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright © 2017-2019 AT&T Intellectual Property.
+ * Modifications Copyright © 2018 IBM.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Unless otherwise specified, all documentation contained herein is licensed
+ * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ * you may not use this documentation except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         https://creativecommons.org/licenses/by/4.0/
+ *
+ * Unless required by applicable law or agreed to in writing, documentation
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package org.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ActiveTicketsResponse implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private static EELFLogger log = EELFManager.getInstance().getLogger(ActiveTicketsResponse.class);
+
+    public enum ActiveTicketResponseStatus {
+        IN_PROGRESS, COMPLETED, FAILED,
+    }
+
+    private String requestId;
+
+    private List<TicketData> elements = new ArrayList<>();
+
+    private ActiveTicketResponseStatus status;
+
+    private Integer pollingSeconds;
+    private String errorMessage;
+
+    public String getRequestId() {
+        return requestId;
+    }
+
+    public void setRequestId(String requestId) {
+        this.requestId = requestId;
+    }
+
+    public List<TicketData> getElements() {
+        return elements;
+    }
+
+    public void setElements(List<TicketData> elements) {
+        this.elements = elements;
+    }
+
+    public ActiveTicketResponseStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ActiveTicketResponseStatus status) {
+        this.status = status;
+    }
+
+    public Integer getPollingSeconds() {
+        return pollingSeconds;
+    }
+
+    public void setPollingSeconds(Integer pollingSeconds) {
+        this.pollingSeconds = pollingSeconds;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    @Override
+    public String toString() {
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            return mapper.writeValueAsString(this);
+        } catch (JsonProcessingException e) {
+            log.debug("Error in toString()", e);
+        }
+        return "";
+    }
+
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/Availability.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/Availability.java
new file mode 100644 (file)
index 0000000..37995bb
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * 
+ *  Copyright © 2019 AT&T Intellectual Property.
+ *  
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *  
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *  
+ *  
+ *  Unless otherwise specified, all documentation contained herein is licensed
+ *  under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ *  you may not use this documentation except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *  
+ *          https://creativecommons.org/licenses/by/4.0/
+ *  
+ *  Unless required by applicable law or agreed to in writing, documentation
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ ******************************************************************************/
+package org.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+public enum Availability {
+    full, partial, unavailable
+}
diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/TicketData.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/ticketmgt/models/TicketData.java
new file mode 100644 (file)
index 0000000..07b9f94
--- /dev/null
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ *
+ *  Copyright © 2019 AT&T Intellectual Property.
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *          http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *
+ *  Unless otherwise specified, all documentation contained herein is licensed
+ *  under the Creative Commons License, Attribution 4.0 Intl. (the "License");
+ *  you may not use this documentation except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *          https://creativecommons.org/licenses/by/4.0/
+ *
+ *  Unless required by applicable law or agreed to in writing, documentation
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ ******************************************************************************/
+package org.onap.optf.cmso.optimizer.clients.ticketmgt.models;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import org.springframework.format.annotation.DateTimeFormat;
+
+@ApiModel(value = "Ticket Data", description = "Change Management Ticket Information.")
+public class TicketData implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private static EELFLogger log = EELFManager.getInstance().getLogger(TicketData.class);
+
+    @ApiModelProperty(value = "Unique ticket identifier")
+    private String id;
+
+    @ApiModelProperty(value = "Scheduled start time of change.")
+    @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+    private Date startTime;
+
+    @ApiModelProperty(value = "Scheduled end time of change.")
+    @DateTimeFormat(pattern = "yyyy-MM-dd'T'hh:mm:ss'Z'")
+    private Date endTime;
+
+    @ApiModelProperty(value = "Availability of element(s) during change window")
+    private Availability availability;
+
+    @ApiModelProperty(
+                    value = "List elementIds  of elements being changed. At least one maps to elementId in the request")
+    private List<String> elementIds = new ArrayList<>();
+
+    @ApiModelProperty(value = "Details of the change.")
+    private String changeDetails;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Availability getAvailability() {
+        return availability;
+    }
+
+    public void setAvailability(Availability availability) {
+        this.availability = availability;
+    }
+
+    public List<String> getElementIds() {
+        return elementIds;
+    }
+
+    public void setElementIds(List<String> elementIds) {
+        this.elementIds = elementIds;
+    }
+
+    public String getChangeDetails() {
+        return changeDetails;
+    }
+
+    public void setChangeDetails(String changeDetails) {
+        this.changeDetails = changeDetails;
+    }
+
+    @Override
+    public String toString() {
+        ObjectMapper mapper = new ObjectMapper();
+        try {
+            return mapper.writeValueAsString(this);
+        } catch (JsonProcessingException e) {
+            log.debug("Error in toString()", e);
+        }
+        return "";
+    }
+}
index 7674f43..c333651 100644 (file)
@@ -21,11 +21,9 @@ package org.onap.optf.cmso.optimizer.clients.topology;
 
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
-import com.fasterxml.jackson.core.JsonParseException;
+import com.att.eelf.i18n.EELFResourceManager;
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import javax.ws.rs.client.Client;
@@ -40,7 +38,7 @@ import org.onap.observations.Observation;
 import org.onap.optf.cmso.common.BasicAuthenticatorFilter;
 import org.onap.optf.cmso.common.PropertiesManagement;
 import org.onap.optf.cmso.common.exceptions.CmsoException;
-import org.onap.optf.cmso.optimizer.clients.topology.models.ElementCriteria;
+import org.onap.optf.cmso.optimizer.clients.common.models.ElementCriteria;
 import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyPolicyInfo;
 import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyRequest;
 import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
@@ -53,12 +51,14 @@ import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
 import org.onap.optf.cmso.optimizer.model.dao.TopologyDao;
 import org.onap.optf.cmso.optimizer.service.rs.models.ElementInfo;
 import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest;
-import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus;
 import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 
+/**
+ * The Class TopologyClient.
+ */
 @Component
 public class TopologyClient {
     private static EELFLogger debug = EELFManager.getInstance().getDebugLogger();
@@ -75,37 +75,47 @@ public class TopologyClient {
     @Autowired
     TopologyDao topologyDao;
 
+    /**
+     * Make request.
+     *
+     * @param request the request
+     * @param topology the topology
+     * @return the topology response
+     */
     public TopologyResponse makeRequest(Request request, Topology topology) {
-            Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
-            if (topology.getTopologyRetries() >= maxAttempts) {
-                request.setStatus(OptimizeScheduleStatus.FAILED.toString());
-                request.setRequestEnd(System.currentTimeMillis());
-                requestDao.save(request);
-                return null;
-            }
-            TopologyRequest topologyRequest = new TopologyRequest();
-            ObjectMapper om = new ObjectMapper();
-            String originalRequest = request.getRequest();
-            TopologyResponse topologyResponse = new TopologyResponse();
-            OptimizerRequest optimizerRequest = null;;
-            try {
-                optimizerRequest = om.readValue(originalRequest, OptimizerRequest.class);
-            } catch (Exception e) {
-                topologyResponse.setStatus(TopologyRequestStatus.FAILED);
-                Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
-            }
-            topologyRequest = new TopologyRequest();
-            topologyRequest.setRequestId(optimizerRequest.getRequestId());
-            topologyRequest.setCommonData(optimizerRequest.getCommonData());
-            topologyRequest.setElements(getElementCriteria(optimizerRequest));
-            topologyRequest.setPolicies(getPolicies(optimizerRequest));
-            try {
-                topologyResponse = initiateTopology(topologyRequest, topology, request);
-            } catch (Exception e) {
-                topologyResponse.setStatus(TopologyRequestStatus.FAILED);
-                Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
-            }
+        Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20);
+        TopologyResponse topologyResponse = new TopologyResponse();
+        if (topology.getTopologyRetries() >= maxAttempts) {
+            topologyResponse.setStatus(TopologyRequestStatus.FAILED);
+            topologyResponse.setErrorMessage(LogMessages.EXCEEDED_RETRY_LIMIT.format(
+                            "Topology", maxAttempts.toString()));
+            Observation.report(LogMessages.EXCEEDED_RETRY_LIMIT, "Topology", maxAttempts.toString());
             return topologyResponse;
+        }
+        TopologyRequest topologyRequest = new TopologyRequest();
+        ObjectMapper om = new ObjectMapper();
+        String originalRequest = request.getRequest();
+        OptimizerRequest optimizerRequest = null;;
+        try {
+            optimizerRequest = om.readValue(originalRequest, OptimizerRequest.class);
+        } catch (Exception e) {
+            topologyResponse.setStatus(TopologyRequestStatus.FAILED);
+            topologyResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+            Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+        }
+        topologyRequest = new TopologyRequest();
+        topologyRequest.setRequestId(optimizerRequest.getRequestId());
+        topologyRequest.setCommonData(optimizerRequest.getCommonData());
+        topologyRequest.setElements(getElementCriteria(optimizerRequest));
+        topologyRequest.setPolicies(getPolicies(optimizerRequest));
+        try {
+            topologyResponse = initiateTopology(topologyRequest, topology, request);
+        } catch (Exception e) {
+            topologyResponse.setStatus(TopologyRequestStatus.FAILED);
+            topologyResponse.setErrorMessage(LogMessages.UNEXPECTED_EXCEPTION.format(e.getMessage()));
+            Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
+        }
+        return topologyResponse;
     }
 
     private List<TopologyPolicyInfo> getPolicies(OptimizerRequest optimizerRequest) {
@@ -131,19 +141,20 @@ public class TopologyClient {
         return list;
     }
 
-    private TopologyResponse initiateTopology(TopologyRequest request, Topology topology, Request requestRow) throws CmsoException, JsonProcessingException {
+    private TopologyResponse initiateTopology(TopologyRequest request, Topology topology, Request requestRow)
+                    throws CmsoException, JsonProcessingException {
         String url = env.getProperty("cmso.topology.create.request.url");
         String username = env.getProperty("mechid.user");
         String password = pm.getProperty("mechid.pass", "");
         Client client = ClientBuilder.newClient();
         client.register(new BasicAuthenticatorFilter(username, password));
         client.register(new CmsoClientFilters());
-        WebTarget webTarget = client.target(url);
-        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
         debug.debug("topology url / user: " + url + " / " + username);
         debug.debug("topology Request: " + new ObjectMapper().writeValueAsString(request));
         Observation.report(LogMessages.TOPOLOGY_REQUEST, "Begin", request.getRequestId(), url);
         topology.setTopologyStart(System.currentTimeMillis());
+        WebTarget webTarget = client.target(url);
+        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
         Response response = invocationBuilder.post(Entity.json(request));
         Observation.report(LogMessages.TOPOLOGY_REQUEST, "End", request.getRequestId(), url);
         TopologyResponse topologyResponse = null;
@@ -153,11 +164,11 @@ public class TopologyClient {
                 break;
             case 200:
                 debug.debug("Successfully retrieved topology: " + request.getRequestId());
-                topologyResponse =  processTopologyResponse(request, response, topology, requestRow);
+                topologyResponse = processTopologyResponse(request, response, topology, requestRow);
                 break;
             default:
-                throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNEXPECTED_RESPONSE,
-                                url, response.getStatusInfo().toString());
+                throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNEXPECTED_RESPONSE, url,
+                                response.getStatusInfo().toString());
         }
         return topologyResponse;
     }
@@ -168,9 +179,8 @@ public class TopologyClient {
         TopologyResponse topologyResponse = null;
         try {
             topologyResponse = new ObjectMapper().readValue(responseString, TopologyResponse.class);
-        }
-        catch (Exception e)
-        {
+            topology.setTopology(responseString);
+        } catch (Exception e) {
             Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
             topologyResponse = new TopologyResponse();
             topologyResponse.setRequestId(request.getRequestId());
index 3120e0d..ce0d583 100644 (file)
@@ -21,11 +21,7 @@ package org.onap.optf.cmso.optimizer.clients.topology;
 
 import java.util.Optional;
 import java.util.UUID;
-import javax.ws.rs.core.Response.Status;
-import org.onap.observations.Observation;
-import org.onap.optf.cmso.common.exceptions.CmsoException;
 import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse;
-import org.onap.optf.cmso.optimizer.common.LogMessages;
 import org.onap.optf.cmso.optimizer.model.Request;
 import org.onap.optf.cmso.optimizer.model.Topology;
 import org.onap.optf.cmso.optimizer.model.dao.RequestDao;
@@ -34,6 +30,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Component;
 
+/**
+ * The Class TopologyRequestManager.
+ */
 @Component
 public class TopologyRequestManager {
 
@@ -49,52 +48,37 @@ public class TopologyRequestManager {
     @Autowired
     TopologyClient topologyClient;
 
-    public TopologyResponse createTopologyRequest(UUID uuid)
-    {
-        try
-        {
-            Request request = null;
-            Optional<Request> requestOptional = requestDao.findById(uuid);
-            if (requestOptional.isPresent())
-            {
-                request = requestOptional.get();
-            }
-            if (request == null)
-            {
-                throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.EXPECTED_DATA_NOT_FOUND,
-                                uuid.toString(), "Request table");
-            }
-            Topology topology  = null;
-            Optional<Topology> topologyOpt  = topologyDao.findById(uuid);
-            if (topologyOpt.isPresent())
-            {
-                topology = topologyOpt.get();
-
-            }
-            if (topology == null)
-            {
-                topology = new Topology();
-                topology.setUuid(uuid);
-                topology.setTopologyRetries(0);
-            }
-            TopologyResponse topologyResponse = topologyClient.makeRequest(request, topology);
-            switch(topologyResponse.getStatus())
-            {
-                case COMPLETED:
-                    break;
-                case FAILED:
-                    break;
-                case IN_PROGRESS:
-                    break;
-            }
-            return topologyResponse;
+    /**
+     * Creates the topology request.
+     *
+     * @param requestRow the request row
+     * @return the topology response
+     */
+    public TopologyResponse createTopologyRequest(Request requestRow) {
+        Topology topology = getExistingTopology(requestRow.getUuid());
+        if (topology == null) {
+            topology = new Topology();
+            topology.setUuid(requestRow.getUuid());
+            topology.setTopologyRetries(0);
         }
-        catch (Exception e)
-        {
-            Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage());
-        }
-        return null;
+        TopologyResponse topologyResponse = topologyClient.makeRequest(requestRow, topology);
+        topologyDao.save(topology);
+        return topologyResponse;
 
     }
 
+
+    /**
+     * Gets the existing topology.
+     *
+     * @param uuid the uuid
+     * @return the existing topology
+     */
+    public Topology getExistingTopology(UUID uuid) {
+        Optional<Topology> topologyOpt = topologyDao.findById(uuid);
+        if (topologyOpt.isPresent()) {
+            return topologyOpt.get();
+        }
+        return null;
+    }
 }