diff options
Diffstat (limited to 'vid-app-common')
61 files changed, 3598 insertions, 1324 deletions
diff --git a/vid-app-common/pom.xml b/vid-app-common/pom.xml index 5082129c7..479510368 100755 --- a/vid-app-common/pom.xml +++ b/vid-app-common/pom.xml @@ -9,7 +9,7 @@ inherit from a parent maven module. -->
<groupId>org.onap.vid</groupId>
<artifactId>vid-app-common</artifactId>
- <version>3.0.0-SNAPSHOT</version>
+ <version>4.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>VID Common</name>
<description>VID Common code for opensource version</description>
diff --git a/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java b/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java index c1964c161..06e0f0174 100644 --- a/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java +++ b/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java @@ -413,9 +413,7 @@ public class AaiClient implements AaiClientInterface { } else { logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscribers() resp=" + resp.getStatusInfo().toString()); if (resp.getStatus() != HttpStatus.SC_OK) { - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "Invalid response from AAI"); - String rawData = resp.readEntity(String.class); - subscriberDataResponse = new AaiResponse<>(null, rawData, resp.getStatus()); + subscriberDataResponse = processFailureResponse(resp,responseBody); } else { subscriberDataResponse = processOkResponse(resp, classType, responseBody, omType, propagateExceptions); } @@ -423,6 +421,17 @@ public class AaiClient implements AaiClientInterface { return subscriberDataResponse; } + private AaiResponse processFailureResponse(Response resp, String responseBody) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "Invalid response from AAI"); + String rawData; + if (responseBody != null) { + rawData = responseBody; + } else { + rawData = resp.readEntity(String.class); + } + return new AaiResponse<>(null, rawData, resp.getStatus()); + } + private AaiResponse processOkResponse(Response resp, Class classType, String responseBody, VidObjectMapperType omType, boolean propagateExceptions) { AaiResponse subscriberDataResponse; String finalResponse = null; diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java new file mode 100644 index 000000000..73bef7636 --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java @@ -0,0 +1,72 @@ +package org.onap.vid.asdc.beans; + +import java.util.Collection; + +public class ServiceBuilder { + private String uuid; + private String invariantUUID; + private String name; + private String version; + private String toscaModelURL; + private String category; + private Service.LifecycleState lifecycleState; + private String distributionStatus; + private Collection<Artifact> artifacts; + private Collection<SubResource> resources; + + public ServiceBuilder setUuid(String uuid) { + this.uuid = uuid; + return this; + } + + public ServiceBuilder setInvariantUUID(String invariantUUID) { + this.invariantUUID = invariantUUID; + return this; + } + + public ServiceBuilder setName(String name) { + this.name = name; + return this; + } + + public ServiceBuilder setVersion(String version) { + this.version = version; + return this; + } + + public ServiceBuilder setToscaModelURL(String toscaModelURL) { + this.toscaModelURL = toscaModelURL; + return this; + } + + public ServiceBuilder setCategory(String category) { + this.category = category; + return this; + } + + public ServiceBuilder setLifecycleState(Service.LifecycleState lifecycleState) { + this.lifecycleState = lifecycleState; + return this; + } + + public ServiceBuilder setDistributionStatus(String distributionStatus) { + this.distributionStatus = distributionStatus; + return this; + } + + public ServiceBuilder setArtifacts(Collection<Artifact> artifacts) { + this.artifacts = artifacts; + return this; + } + + public ServiceBuilder setResources(Collection<SubResource> resources) { + this.resources = resources; + return this; + } + + public Service build() { + return new Service(uuid, invariantUUID, category, version, name, distributionStatus, toscaModelURL, lifecycleState, artifacts, resources); + } +} + + diff --git a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java index 89d3963ac..b19ea57e1 100644 --- a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java +++ b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java @@ -1,5 +1,27 @@ package org.onap.vid.category; +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright © 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + import org.onap.vid.model.ListOfErrorsResponse; import java.util.List; @@ -9,6 +31,10 @@ public class AddCategoryOptionResponse extends ListOfErrorsResponse { public AddCategoryOptionResponse() { } + public AddCategoryOptionResponse(String error) { + errors.add(error); + } + public AddCategoryOptionResponse(List<String> errors) { super(errors); } diff --git a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java index 5db474627..8e9b14422 100644 --- a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java +++ b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java @@ -1,7 +1,30 @@ package org.onap.vid.category; +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright © 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + import java.util.ArrayList; import java.util.List; +import java.util.Objects; public class AddCategoryOptionsRequest { @@ -10,4 +33,17 @@ public class AddCategoryOptionsRequest { public AddCategoryOptionsRequest() { options = new ArrayList<>(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || this.getClass() != o.getClass()) return false; + AddCategoryOptionsRequest that = (AddCategoryOptionsRequest) o; + return Objects.equals(this.options, that.options); + } + + @Override + public int hashCode() { + return Objects.hash(this.options); + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java b/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java index 355e54838..dc0ecba17 100644 --- a/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java +++ b/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java @@ -1,5 +1,29 @@ package org.onap.vid.category; +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright © 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +import java.util.Objects; + public class CategoryParameterOptionRep { private String id; @@ -28,4 +52,18 @@ public class CategoryParameterOptionRep { public void setName(String name) { this.name = name; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || this.getClass() != o.getClass()) return false; + CategoryParameterOptionRep that = (CategoryParameterOptionRep) o; + return Objects.equals(this.id, that.id) && + Objects.equals(this.name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(this.id, this.name); + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java index 84e83e8b2..a3ff5f923 100644 --- a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java +++ b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java @@ -23,6 +23,7 @@ package org.onap.vid.client; import io.joshworks.restclient.http.HttpResponse; import io.joshworks.restclient.http.JsonNode; import io.joshworks.restclient.http.RestClient; +import io.joshworks.restclient.http.exceptions.RestClientException; import io.joshworks.restclient.http.mapper.ObjectMapper; import org.apache.http.impl.client.CloseableHttpClient; import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; @@ -39,7 +40,7 @@ import java.security.UnrecoverableKeyException; import java.security.NoSuchAlgorithmException; import java.security.KeyManagementException; import java.security.cert.CertificateException; -import javax.net.ssl.SSLHandshakeException; +import javax.net.ssl.SSLException; import java.security.KeyStoreException; import java.text.SimpleDateFormat; import javax.net.ssl.SSLContext; @@ -134,6 +135,11 @@ public class SyncRestClient implements SyncRestClientInterface { } @Override + public <T> HttpResponse<T> delete(String url, Map<String, String> headers, Object body, Class<T> responseClass) { + return callWithRetryOverHttp(url, url2 -> restClient.delete(url2).headers(headers).body(body).asObject(responseClass)); + } + + @Override public <T> HttpResponse<T> delete(String url, Map<String, String> headers, Class<T> responseClass) { return callWithRetryOverHttp(url, url2 -> restClient.delete(url2).headers(headers).asObject(responseClass)); } @@ -150,13 +156,13 @@ public class SyncRestClient implements SyncRestClientInterface { @SneakyThrows private <T> HttpResponse<T> callWithRetryOverHttp(String url, - CheckedFunction1<String, HttpResponse<T>> httpRequest) { + CheckedFunction1<String, HttpResponse<T>> httpRequest) { try { return httpRequest.apply(url); - } catch (Exception e) { - if (e.getCause() instanceof SSLHandshakeException) { + } catch (RestClientException e) { + if (e.getCause() instanceof SSLException) { logger.warn(EELFLoggerDelegate.debugLogger, - DATE_FORMAT.format(new Date()) + TRY_TO_CALL_OVER_HTTP, e); + DATE_FORMAT.format(new Date()) + TRY_TO_CALL_OVER_HTTP, e); return httpRequest.apply(url.replaceFirst(HTTPS_SCHEMA, HTTP_SCHEMA)); } throw e; diff --git a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java index 142adde15..ae2f83862 100644 --- a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java +++ b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java @@ -27,6 +27,8 @@ public interface SyncRestClientInterface { <T> HttpResponse<T> put(String url, Map<String, String> headers, Object body, Class<T> aClass); + <T> HttpResponse<T> delete(String url, Map<String, String> headers, Object body, Class<T> aClass); + <T> HttpResponse<T> delete(String url, Map<String, String> headers, Class<T> aClass); HttpResponse<JsonNode> delete(String url, Map<String, String> headers); diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java index 03dc8083e..86e832ba7 100644 --- a/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java +++ b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java @@ -25,6 +25,7 @@ import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.onap.portalsdk.core.util.SystemProperties; import org.onap.vid.dao.FnAppDoaImpl; import org.onap.vid.model.GitRepositoryState; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -37,6 +38,9 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import static org.springframework.http.HttpStatus.OK; + /** * Controller for user profile view. The view is restricted to authenticated * users. The view name resolves to page user_profile.jsp which uses Angular. @@ -46,158 +50,86 @@ import java.util.Properties; @RequestMapping("/") public class HealthCheckController extends UnRestrictedBaseController { - - /** - * The logger. - */ private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(HealthCheckController.class); + private static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); + private static final String GIT_PROPERTIES_FILENAME = "git.properties"; + private FnAppDoaImpl fnAppDoaImpl; - /** - * The Constant dateFormat. - */ - final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS"); - - private static final String HEALTH_CHECK_PATH = "/healthCheck"; - - /** - * Model for JSON response with health-check results. - */ - public class HealthStatus { - // Either 200 or 500 - public int statusCode; - - // Additional detail in case of error, empty in case of success. - public String message; - - public String date; - - public HealthStatus(int code, String msg) { - this.statusCode = code; - this.message = msg; - } - - public HealthStatus(int code, String date, String msg) { - this.statusCode = code; - this.message = msg; - this.date = date; - } - - public int getStatusCode() { - return statusCode; - } - - public void setStatusCode(int code) { - this.statusCode = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String msg) { - this.message = msg; - } - - public String getDate() { - return date; - } - - public void setDate(String date) { - this.date = date; - } - - } - - @SuppressWarnings("unchecked") - public int getProfileCount(String driver, String URL, String username, String password) { - FnAppDoaImpl doa = new FnAppDoaImpl(); - int count = doa.getProfileCount(driver, URL, username, password); - return count; + @Autowired + public HealthCheckController(FnAppDoaImpl fnAppDoaImpl) { + this.fnAppDoaImpl = fnAppDoaImpl; } - /** * Obtain the HealthCheck Status from the System.Properties file. * Used by IDNS for redundancy * * @return ResponseEntity The response entity - * @throws IOException Signals that an I/O exception has occurred. */ @RequestMapping(value = "/healthCheck", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public HealthStatus gethealthCheckStatusforIDNS() { - - String driver = SystemProperties.getProperty("db.driver"); - String URL = SystemProperties.getProperty("db.connectionURL"); - String username = SystemProperties.getProperty("db.userName"); - String password = SystemProperties.getProperty("db.password"); - - LOGGER.debug(EELFLoggerDelegate.debugLogger, "driver ::" + driver); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::" + URL); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::" + username); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "password::" + password); - - - HealthStatus healthStatus = null; - try { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); - int count = getProfileCount(driver, URL, username, password); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::" + count); - healthStatus = new HealthStatus(200, "health check succeeded"); - } catch (Exception ex) { - - LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); - healthStatus = new HealthStatus(500, "health check failed: " + ex.toString()); - } - return healthStatus; + public HealthStatus getHealthCheckStatusForIDNS() { + return createCorrespondingStatus(); } /** * Obtain the HealthCheck Status from the System.Properties file. * * @return ResponseEntity The response entity - * @throws IOException Signals that an I/O exception has occurred. - * Project : */ @RequestMapping(value = "rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public HealthStatus getHealthCheck( @PathVariable("User-Agent") String UserAgent, @PathVariable("X-ECOMP-RequestID") String ECOMPRequestID) { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent ", UserAgent); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID ", ECOMPRequestID); + return createCorrespondingStatus(); + } - String driver = SystemProperties.getProperty("db.driver"); - String URL = SystemProperties.getProperty("db.connectionURL"); - String username = SystemProperties.getProperty("db.userName"); - String password = SystemProperties.getProperty("db.password"); - - LOGGER.debug(EELFLoggerDelegate.debugLogger, "driver ::" + driver); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::" + URL); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::" + username); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "password::" + password); - + @RequestMapping(value = "/commitInfo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public GitRepositoryState getCommitInfo() throws IOException { + Properties properties = new Properties(); + properties.load(getClass().getClassLoader().getResourceAsStream(GIT_PROPERTIES_FILENAME)); + return new GitRepositoryState(properties); + } - HealthStatus healthStatus = null; + private HealthStatus createCorrespondingStatus() { + logData(); try { - LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent" + UserAgent); - LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID" + ECOMPRequestID); + int count = fnAppDoaImpl.getProfileCount(getUrl(), getUsername(), getPassword()); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::", count); + return okStatus(); + } catch (Exception ex) { + String errorMsg = ex.getMessage(); + LOGGER.error(EELFLoggerDelegate.errorLogger, errorMsg); + return errorStatus(errorMsg); + } + } + private void logData() { + LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::", getUrl()); + LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::", getUsername()); + } - int count = getProfileCount(driver, URL, username, password); + private HealthStatus okStatus() { + return new HealthStatus(OK, dateFormat.format(new Date()), "health check succeeded"); + } - LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::" + count); - healthStatus = new HealthStatus(200, dateFormat.format(new Date()), "health check succeeded"); - } catch (Exception ex) { + private HealthStatus errorStatus(String msg) { + return new HealthStatus(INTERNAL_SERVER_ERROR, dateFormat.format( + new Date()), "health check failed: " + msg); + } - LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); - healthStatus = new HealthStatus(500, dateFormat.format(new Date()), "health check failed: " + ex.toString()); - } - return healthStatus; + private String getUrl() { + return SystemProperties.getProperty("db.connectionURL"); } - @RequestMapping(value = "/version", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) - public GitRepositoryState getCommitInfo() throws IOException { - Properties properties = new Properties(); - properties.load(getClass().getClassLoader().getResourceAsStream("git.properties")); - return new GitRepositoryState(properties); + private String getUsername() { + return SystemProperties.getProperty("db.userName"); + } + + private String getPassword() { + return SystemProperties.getProperty("db.password"); } } diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java new file mode 100644 index 000000000..6056c2898 --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java @@ -0,0 +1,31 @@ +package org.onap.vid.controllers; + +import org.springframework.http.HttpStatus; + +/** + * Model for JSON response with health-check results. + */ +public final class HealthStatus { + + private final int statusCode; + private final String detailedMsg; + private final String date; + + public HealthStatus(HttpStatus code, String date, String detailedMsg) { + this.statusCode = code.value(); + this.detailedMsg = detailedMsg; + this.date = date; + } + + public int getStatusCode() { + return statusCode; + } + + public String getDetailedMsg() { + return detailedMsg; + } + + public String getDate() { + return date; + } +} diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java b/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java index 0976f4039..1a3eb42fa 100644 --- a/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java +++ b/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java @@ -1,6 +1,30 @@ package org.onap.vid.controllers; +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright © 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +import static org.onap.vid.utils.Logging.getMethodCallerName; +import javax.ws.rs.ForbiddenException; import org.onap.portalsdk.core.controller.UnRestrictedBaseController; import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.onap.vid.category.AddCategoryOptionResponse; @@ -14,124 +38,114 @@ import org.onap.vid.services.CategoryParameterServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.ForbiddenException; -import java.util.Arrays; -import java.util.Collections; - -import static org.onap.vid.utils.Logging.getMethodCallerName; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; /** * Controler for APIs that are used only by vid operators */ @RestController -@RequestMapping(MaintenanceController.MAINTENANCE) +@RequestMapping("maintenance") public class MaintenanceController extends UnRestrictedBaseController { - public static final String MAINTENANCE = "maintenance"; + private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class); + private CategoryParameterService categoryParameterService; @Autowired - protected CategoryParameterService categoryParameterService; - private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class); + public MaintenanceController(CategoryParameterService categoryParameterService) { + this.categoryParameterService = categoryParameterService; + } /** * Add list of options to one category parameter - * @param request the request - * @return the new option - * @throws Exception the exception */ @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.POST) - public ResponseEntity addCategoryOptions ( - HttpServletRequest request, @PathVariable String categoryName, @RequestBody AddCategoryOptionsRequest option) { + public ResponseEntity addCategoryOptions(@PathVariable String categoryName, + @RequestBody AddCategoryOptionsRequest option) { debugStartLog(); try { - AddCategoryOptionResponse response = categoryParameterService.createCategoryParameterOptions(categoryName, option); - HttpStatus httpStatus = response.getErrors().size()>0 ? HttpStatus.MULTI_STATUS : HttpStatus.OK; + AddCategoryOptionResponse response = categoryParameterService + .createCategoryParameterOptions(categoryName, option); + HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; debugEndLog(response); - return new ResponseEntity<>(response, httpStatus); - } - catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { - return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.NOT_FOUND); - } - catch (Exception exception) { + return createResponseWithBody(httpStatus, response); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + } catch (RuntimeException exception) { LOGGER.error("failed to add option to parameter category " + categoryName, exception); - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } @RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.PUT) - public ResponseEntity updateNameForOption ( - HttpServletRequest request, @PathVariable String categoryName, @RequestBody CategoryParameterOptionRep option) { + public ResponseEntity updateNameForOption(@PathVariable String categoryName, + @RequestBody CategoryParameterOptionRep option) { debugStartLog(); try { - AddCategoryOptionResponse response = categoryParameterService.updateCategoryParameterOption(categoryName, option); - HttpStatus httpStatus = response.getErrors().size()>0 ? HttpStatus.MULTI_STATUS : HttpStatus.OK; + AddCategoryOptionResponse response = categoryParameterService + .updateCategoryParameterOption(categoryName, option); + HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS; debugEndLog(response); - return new ResponseEntity<>(response, httpStatus); - } - catch (ForbiddenException exception) { - return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.FORBIDDEN); - } - catch (CategoryParameterServiceImpl.UnfoundedCategoryException|CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) { - return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.NOT_FOUND); - } - catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) { - return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.CONFLICT); - } - catch (Exception exception) { + return createResponseWithBody(httpStatus, response); + } catch (ForbiddenException exception) { + return createResponseWithBody(HttpStatus.FORBIDDEN, new AddCategoryOptionResponse(exception.getMessage())); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException | CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + + } catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) { + return createResponseWithBody(HttpStatus.CONFLICT, new AddCategoryOptionResponse(exception.getMessage())); + + } catch (RuntimeException exception) { LOGGER.error("failed to update option to parameter category " + categoryName, exception); - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } /** * Gets the owning entity properties. - * @param request the request - * @return the property - * @throws Exception the exception */ @RequestMapping(value = "/category_parameter", method = RequestMethod.GET) - public ResponseEntity getCategoryParameter(HttpServletRequest request, @RequestParam(value="familyName", required = true) Family familyName) { + public ResponseEntity getCategoryParameter(@RequestParam(value = "familyName", required = true) Family familyName) { debugStartLog(); try { CategoryParametersResponse response = categoryParameterService.getCategoryParameters(familyName); debugEndLog(response); - return new ResponseEntity<>(response, HttpStatus.OK); - } - catch (Exception exception) { + return ResponseEntity.ok().body(response); + } catch (RuntimeException exception) { LOGGER.error("failed to retrieve category parameter list from DB.", exception); - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } - /** * Delete option of the category. - * @param request the request - * @throws Exception the exception */ - @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.POST) - public ResponseEntity deleteCategoryOption ( - HttpServletRequest request, @PathVariable String categoryName, @RequestBody CategoryParameterOption option) { + @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.DELETE) + public ResponseEntity deleteCategoryOption(@PathVariable String categoryName, + @RequestBody CategoryParameterOption option) { debugStartLog(); try { categoryParameterService.deleteCategoryOption(categoryName, option); debugEndLog(HttpStatus.OK); - return new ResponseEntity<>(HttpStatus.OK); - } - catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { - return new ResponseEntity<>(new AddCategoryOptionResponse(Arrays.asList(exception.getMessage())), HttpStatus.NOT_FOUND); - } - catch (Exception exception) { + return ResponseEntity.status(HttpStatus.OK).build(); + } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) { + return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage())); + } catch (RuntimeException exception) { LOGGER.error("failed to add/update owning entity option", exception); - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } + private ResponseEntity createResponseWithBody(HttpStatus status, AddCategoryOptionResponse response) { + return ResponseEntity.status(status).body(response); + } + private void debugStartLog() { LOGGER.debug(EELFLoggerDelegate.debugLogger, "start {}({})", getMethodCallerName()); } diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java b/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java index 6d6ffb31b..b9d67b6df 100644 --- a/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java +++ b/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java @@ -4,12 +4,14 @@ * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ * 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. @@ -40,122 +42,73 @@ import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.util.List; -//import org.onap.vid.model.Service; - @RestController public class VidController extends RestrictedBaseController { - private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VidController.class); - - private final VidService service; + private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VidController.class); - @Autowired - public VidController(VidService vidService) { - service = vidService; - } - - @Autowired - private AaiService aaiService; - - @Autowired - RoleProvider roleProvider; + private final VidService vidService; + private final AaiService aaiService; + private final RoleProvider roleProvider; + private final PombaService pombaService; @Autowired - private PombaService pombaService; - -// /** -// * Gets the services. -// * -// * @param request the request -// * @return the services -// * @throws VidServiceUnavailableException the vid service unavailable exception -// */ -// @RequestMapping(value={"/rest/models/services"}, method = RequestMethod.GET) -// public SecureServices getServices(HttpServletRequest request) throws VidServiceUnavailableException { -// try { -// AaiService aaiService = new AaiServiceImpl(); -// LOG.info("Start API for browse ASDC was called"); -// SecureServices secureServices = new SecureServices(); -// Map<String, String[]> requestParams = request.getParameterMap(); -// List<Role> roles = roleProvider.getUserRoles(request); -// secureServices.setServices(aaiService.getServicesByDistributionStatus()); -// secureServices.setServices(service.getServices(requestParams)); -// secureServices.setReadOnly(roleProvider.userPermissionIsReadOnly(roles)); -// return secureServices; -// } catch (AsdcCatalogException e) { -// LOG.error("Failed to retrieve service definitions from SDC", e); -// throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e); -// } catch (Throwable t) { -// LOG.debug("Unexpected error while retrieving service definitions from SDC: " + t.getMessage() + ":", t); -// t.printStackTrace(); -// throw new VidServiceUnavailableException("Unexpected error while retrieving service definitions from SDC: " + t.getMessage(), t); -// } -// } - - /** - * Gets the services. - * - * @param request the request - * @return the services - * @throws VidServiceUnavailableException the vid service unavailable exception - */ - @RequestMapping(value={"/rest/models/services"}, method = RequestMethod.GET) - public SecureServices getServices(HttpServletRequest request) throws VidServiceUnavailableException { - try { - LOG.info("Start API for browse ASDC was called"); - SecureServices secureServices = new SecureServices(); - List<Role> roles = roleProvider.getUserRoles(request); - secureServices.setServices(aaiService.getServicesByDistributionStatus()); - //Disable roles until AAF integration finishes - //secureServices.setReadOnly(roleProvider.userPermissionIsReadOnly(roles)); - secureServices.setReadOnly(false); - return secureServices; - } - catch (Exception t) { - LOG.debug("Unexpected error while retrieving service definitions from A&AI: " + t.getMessage() + ":", t); - throw new VidServiceUnavailableException("Unexpected error while retrieving service definitions from A&AI: " + t.getMessage(), t); - } - } + public VidController(VidService vidService, AaiService aaiService, RoleProvider roleProvider, + PombaService pombaService) { + this.vidService = vidService; + this.aaiService = aaiService; + this.roleProvider = roleProvider; + this.pombaService = pombaService; + } + /** + * @param request the request + * @return the services + */ + @RequestMapping(value = {"/rest/models/services"}, method = RequestMethod.GET) + public SecureServices getServices(HttpServletRequest request) { + LOG.info("Start API for browse ASDC was called"); + SecureServices secureServices = new SecureServices(); + List<Role> roles = roleProvider.getUserRoles(request); + secureServices.setServices(aaiService.getServicesByDistributionStatus()); + secureServices.setReadOnly(roleProvider.userPermissionIsReadOnly(roles)); + return secureServices; + } - /** - * Gets the services. - * - * @param uuid the uuid - * @return the services - * @throws VidServiceUnavailableException the vid service unavailable exception - */ - @RequestMapping(value={"/rest/models/services/{uuid}"}, method = RequestMethod.GET) - public ServiceModel getServices(@PathVariable("uuid") String uuid, HttpServletRequest request) throws VidServiceUnavailableException { - try { - return service.getService(uuid); - } catch (AsdcCatalogException e) { - LOG.error("Failed to retrieve service definitions from SDC. Error: "+e.getMessage() , e); - throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e); - } - } + /** + * @param uuid the uuid + * @return the services + * @throws VidServiceUnavailableException the vid service unavailable exception + */ + @RequestMapping(value = {"/rest/models/services/{uuid}"}, method = RequestMethod.GET) + public ServiceModel getService(@PathVariable("uuid") String uuid) throws VidServiceUnavailableException { + try { + return vidService.getService(uuid); + } catch (AsdcCatalogException e) { + LOG.error("Failed to retrieve service definitions from SDC. Error: " + e.getMessage(), e); + throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e); + } + } - @RequestMapping(value = "/rest/models/reset", method = RequestMethod.POST) - @ResponseStatus(HttpStatus.ACCEPTED) - public void invalidateServiceModelCache(HttpServletRequest request) { - service.invalidateServiceCache(); - } + @RequestMapping(value = "/rest/models/reset", method = RequestMethod.POST) + @ResponseStatus(HttpStatus.ACCEPTED) + public void invalidateServiceModelCache() { + vidService.invalidateServiceCache(); + } - /** - * Gets the services view. - * - * @param request the request - * @return the services view - * @throws VidServiceUnavailableException the vid service unavailable exception - */ - @RequestMapping(value={"/serviceModels"}, method=RequestMethod.GET) - public ModelAndView getServicesView(HttpServletRequest request) { + /** + * @return the services view + * @throws VidServiceUnavailableException the vid service unavailable exception + */ + // FIX ME: Circular view path [serviceModels]: would dispatch back to the current handler URL [/serviceModels] again. + @RequestMapping(value = {"/serviceModels"}, method = RequestMethod.GET) + public ModelAndView getServicesView() { return new ModelAndView("serviceModels"); } @RequestMapping(value = {"/rest/models/services/verifyService"}, method = RequestMethod.POST) - public void verifyServiceInstance(HttpServletRequest request, @RequestBody PombaRequest pombaRequest) { - pombaService.verify(pombaRequest); + public void verifyServiceInstance(@RequestBody PombaRequest pombaRequest) { + pombaService.verify(pombaRequest); } } diff --git a/vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java b/vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java new file mode 100644 index 000000000..bd7a67b5a --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java @@ -0,0 +1,20 @@ +package org.onap.vid.dao; + +import org.springframework.stereotype.Component; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +import static com.google.common.base.Preconditions.checkNotNull; + +@Component +public class ConnectionFactory { + + public Connection getConnection(String url, String username, String password) throws SQLException { + checkNotNull(url); + checkNotNull(username); + checkNotNull(password); + return DriverManager.getConnection(url, username, password); + } +} diff --git a/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java b/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java index 65fc5217f..e3fdc95f2 100644 --- a/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java @@ -7,9 +7,9 @@ * 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. @@ -21,94 +21,38 @@ package org.onap.vid.dao; import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; import java.sql.*; - +@Repository public class FnAppDoaImpl { - /** The logger. */ - static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FnAppDoaImpl.class); - - public int getProfileCount(String driver, String URL, String username, String password) { - Connection dbc = null; - PreparedStatement pst = null; - ResultSet rs = null; - String q = null; - int count = 0; - try { - dbc = getConnection(URL,username,password); - logger.debug(EELFLoggerDelegate.debugLogger, "getConnection:::"+ dbc); - q = "select count(*) from fn_app"; - pst = dbc.prepareStatement(q); - rs = pst.executeQuery(); - - if (rs.next()) - count = rs.getInt(1); - } catch(Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); - } finally { - cleanup(rs,pst,dbc); - } - logger.debug(EELFLoggerDelegate.debugLogger, "count:::"+ count); - return count; - } - - public static Connection getConnection(String url, String username, String password) throws SQLException { - java.sql.Connection con=null; - - if( url!=null && username!=null && password!=null ){ - con = DriverManager.getConnection(url, username, password); - } - - logger.info("Connection Successful"); - - return con; - - } - - public static void cleanup(ResultSet rs, PreparedStatement st, Connection c) { - if (rs != null) { - closeResultSet(rs); - } - if (st != null) { - closePreparedStatement(st); - } - if (c != null) { - rollbackAndCloseConnection(c); - } - } - - private static void rollbackAndCloseConnection(Connection c) { - try { - c.rollback(); - } catch (Exception e) { - if (logger != null) - logger.error("Error when trying to rollback connection", e); + static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FnAppDoaImpl.class); + + private ConnectionFactory connectionFactory; + + @Autowired + public FnAppDoaImpl(ConnectionFactory connectionFactory) { + this.connectionFactory = connectionFactory; + } + + public int getProfileCount(String URL, String username, String password) throws SQLException { + String q = "select count(*) from fn_app"; + int count = 0; + try (Connection dbc = connectionFactory.getConnection(URL, username, password); + PreparedStatement pst = dbc.prepareStatement(q); ResultSet rs = pst.executeQuery()) { + logger.debug(EELFLoggerDelegate.debugLogger, "getConnection:::", dbc); + if (rs.next()) { + count = rs.getInt(1); + } + } catch (SQLException ex) { + logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); + throw ex; } - try { - c.close(); - } catch (Exception e) { - if (logger != null) - logger.error("Error when trying to close connection", e); - } - } - - private static void closePreparedStatement(PreparedStatement st) { - try { - st.close(); - } catch (Exception e) { - if (logger != null) - logger.error("Error when trying to close statement", e); - } - } - private static void closeResultSet(ResultSet rs) { - try { - rs.close(); - } catch (Exception e) { - if (logger != null) - logger.error("Error when trying to close result set", e); - } - } + logger.debug(EELFLoggerDelegate.debugLogger, "count:::", count); + return count; + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java index cee5af697..6685a63d6 100644 --- a/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java +++ b/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java @@ -23,6 +23,7 @@ package org.onap.vid.job.command; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableMap; import io.joshworks.restclient.http.HttpResponse; +import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.onap.vid.job.Job.JobStatus; import org.onap.vid.job.JobCommand; import org.onap.vid.job.NextCommand; @@ -30,13 +31,13 @@ import org.onap.vid.mso.MsoInterface; import org.onap.vid.mso.rest.AsyncRequestStatus; import org.onap.vid.services.AsyncInstantiationBusinessLogic; import org.onap.vid.services.AuditService; -import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import javax.inject.Inject; import java.util.Map; +import java.util.Objects; import java.util.UUID; @@ -68,33 +69,38 @@ public class InProgressStatusCommand implements JobCommand { init(jobUuid, requestId); } + InProgressStatusCommand(AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic, MsoInterface msoInterface, AuditService auditService, UUID jobUuid, String requestId) { + this(jobUuid, requestId); + this.asyncInstantiationBL = asyncInstantiationBusinessLogic; + this.restMso = msoInterface; + this.auditService = auditService; + } + @Override public NextCommand call() { try { - String path = asyncInstantiationBL.getOrchestrationRequestsPath()+"/"+requestId; + String path = asyncInstantiationBL.getOrchestrationRequestsPath() + "/" + requestId; HttpResponse<AsyncRequestStatus> msoResponse = restMso.get(path, AsyncRequestStatus.class); JobStatus jobStatus; if (msoResponse.getStatus() >= 400 || msoResponse.getBody() == null) { - auditService.setFailedAuditStatusFromMso(jobUuid, requestId, msoResponse.getStatus(), msoResponse.getBody().toString()); + auditService.setFailedAuditStatusFromMso(jobUuid, requestId, msoResponse.getStatus(), Objects.toString(msoResponse.getBody())); LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to get orchestration status for {}. Status code: {}, Body: {}", - requestId, msoResponse.getStatus(), msoResponse.getRawBody().toString()); + requestId, msoResponse.getStatus(), Objects.toString(msoResponse.getRawBody())); return new NextCommand(JobStatus.IN_PROGRESS, this); - } - else { + } else { jobStatus = asyncInstantiationBL.calcStatus(msoResponse.getBody()); } - asyncInstantiationBL.auditMsoStatus(jobUuid,msoResponse.getBody().request); + asyncInstantiationBL.auditMsoStatus(jobUuid, msoResponse.getBody().request); if (jobStatus == JobStatus.FAILED) { asyncInstantiationBL.handleFailedInstantiation(jobUuid); - } - else { + } else { asyncInstantiationBL.updateServiceInfoAndAuditStatus(jobUuid, jobStatus); } //in case of JobStatus.PAUSE we leave the job itself as IN_PROGRESS, for keep tracking job progress @@ -128,5 +134,4 @@ public class InProgressStatusCommand implements JobCommand { return ImmutableMap.of("requestId", requestId); } - } diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java index 9d22b8bfa..958fc115e 100644 --- a/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java +++ b/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java @@ -42,6 +42,7 @@ import org.springframework.stereotype.Component; import javax.inject.Inject; import java.util.Map; +import java.util.Objects; import java.util.UUID; @@ -73,6 +74,14 @@ public class ServiceInstantiationCommand implements JobCommand { init(uuid, serviceInstantiationRequest, userId); } + ServiceInstantiationCommand(AsyncInstantiationBusinessLogic asyncInstantiationBL, AuditService auditService, MsoInterface msoInterface, + UUID uuid, ServiceInstantiation serviceInstantiation, String userId) { + this(uuid, serviceInstantiation, userId); + this.asyncInstantiationBL = asyncInstantiationBL; + this.auditService = auditService; + this.restMso = msoInterface; + } + @Override public NextCommand call() { RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper ; @@ -81,7 +90,6 @@ public class ServiceInstantiationCommand implements JobCommand { uuid, serviceInstantiationRequest, userId ); } - //Aai return bad response while checking names uniqueness catch (InvalidAAIResponseException exception) { LOGGER.error("Failed to check name uniqueness in AAI. VID will try again later", exception); @@ -116,7 +124,7 @@ public class ServiceInstantiationCommand implements JobCommand { return new NextCommand(jobStatus, new InProgressStatusCommand(uuid, requestId)); } else { auditService.setFailedAuditStatusFromMso(uuid,null, msoResponse.getStatus(), - msoResponse.getBody().toString()); + Objects.toString(msoResponse.getBody())); return handleCommandFailed(); } diff --git a/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java b/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java index 77e1dd2cf..59f12f4c5 100644 --- a/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java @@ -33,14 +33,10 @@ public class JobAdapterImpl implements JobAdapter { } @Override - public Job createJob(JobType jobType, AsyncJobRequest request, UUID templateId, String userId, Integer indexInBulk){ - JobDaoImpl job = new JobDaoImpl(); - job.setStatus(Job.JobStatus.PENDING); - job.setTypeAndData(jobType, ImmutableMap.of( + public Job createJob(JobType jobType, AsyncJobRequest request, UUID templateId, String userId, Integer indexInBulk) { + JobDaoImpl job = createJob(jobType, templateId, indexInBulk, ImmutableMap.of( "request", request, "userId", userId)); - job.setTemplateId(templateId); - job.setIndexInBulk(indexInBulk); job.setUserId(userId); return job; } @@ -59,14 +55,17 @@ public class JobAdapterImpl implements JobAdapter { List<Job> jobList = new ArrayList<>(count + 1); UUID templateId = UUID.randomUUID(); for (int i = 0; i < count; i++) { - Job child = new JobDaoImpl(); - child.setTypeAndData(jobType, bulkRequest); - child.setStatus(Job.JobStatus.PENDING); - child.setTemplateId(templateId); - child.setIndexInBulk(i); - jobList.add(child); + jobList.add(createJob(jobType, templateId, i, bulkRequest)); } return jobList; } + private JobDaoImpl createJob(JobType jobType, UUID templateId, Integer indexInBulk, Map<String, Object> data) { + JobDaoImpl job = new JobDaoImpl(); + job.setStatus(Job.JobStatus.PENDING); + job.setTypeAndData(jobType, data); + job.setTemplateId(templateId); + job.setIndexInBulk(indexInBulk); + return job; + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java b/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java index 99824e72b..91617ff42 100644 --- a/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java +++ b/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java @@ -1,12 +1,41 @@ package org.onap.vid.model; -//import org.hibernate.annotations.Table; +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright © 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ -import javax.persistence.*; import java.util.HashSet; +import java.util.Objects; import java.util.Set; - -//import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; @Entity @Table(name = "vid_category_parameter", uniqueConstraints = @UniqueConstraint(columnNames = "name")) @@ -72,4 +101,20 @@ public class CategoryParameter extends VidBaseEntity { public void setIdSupported(boolean idSupported) { this.idSupported = idSupported; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || this.getClass() != o.getClass()) return false; + CategoryParameter that = (CategoryParameter) o; + return this.idSupported == that.idSupported && + Objects.equals(this.name, that.name) && + Objects.equals(this.family, that.family) && + Objects.equals(this.options, that.options); + } + + @Override + public int hashCode() { + return Objects.hash(this.name, this.idSupported, this.family, this.options); + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java index 79befe176..0ecb9257e 100644 --- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java +++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java @@ -28,6 +28,8 @@ public interface MsoBusinessLogic { MsoResponseWrapper createVfModuleInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId); + MsoResponseWrapper scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId); + MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId); MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus); diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java index 00db464ab..a6226e00e 100644 --- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java @@ -46,7 +46,11 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import static java.util.stream.Collectors.collectingAndThen; +import static java.util.stream.Collectors.toList; import static org.apache.commons.lang.StringUtils.upperCase; import static org.onap.vid.changeManagement.ChangeManagementRequest.MsoChangeManagementRequest; import static org.onap.vid.controllers.MsoController.*; @@ -56,10 +60,14 @@ import static org.onap.vid.utils.Logging.debugRequestDetails; public class MsoBusinessLogicImpl implements MsoBusinessLogic { - public static final String START = " start"; - public static final String RESOURCE_TYPE = "resourceType"; - FeatureManager featureManager; - + static final List<String> DASHBOARD_ALLOWED_TYPES = Stream.of(RequestType.REPLACE_INSTANCE, + RequestType.UPDATE_INSTANCE, + RequestType.APPLY_UPDATED_CONFIG, + RequestType.IN_PLACE_SOFTWARE_UPDATE, + RequestType.SCALE_OUT) + .map(requestType -> requestType.toString().toUpperCase()) + .collect(collectingAndThen(toList(), Collections::unmodifiableList)); + private static final String RESOURCE_TYPE = "resourceType"; /** * The Constant dateFormat. */ @@ -74,16 +82,16 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { private static final String SOURCE_OPERATIONAL_ENVIRONMENT = "VID"; private static final ObjectMapper objectMapper = new ObjectMapper(); /** + * The logger. + */ + private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoBusinessLogicImpl.class); + /** * The Mso REST client * This should be replaced with mso client factory. */ private final MsoInterface msoClientInterface; + FeatureManager featureManager; - /** - * The logger. - */ - private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoBusinessLogicImpl.class); - @Autowired public MsoBusinessLogicImpl(MsoInterface msoClientInterface, FeatureManager featureManager) { this.msoClientInterface = msoClientInterface; @@ -101,34 +109,26 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { // this function should get params from tosca and send them to instance at mso, then return success response. @Override public MsoResponseWrapper createSvcInstance(RequestDetails msoRequest) { - String methodName = "createSvcInstance "; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("createSvcInstance"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE); return msoClientInterface.createSvcInstance(msoRequest, endpoint); } @Override - public MsoResponseWrapper createE2eSvcInstance(Object msoRequest){ - String methodName = "createE2eSvcInstance "; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); - - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE); - + public MsoResponseWrapper createE2eSvcInstance(Object msoRequest) { + logInvocationInDebug("createE2eSvcInstance"); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE); return msoClientInterface.createE2eSvcInstance(msoRequest, endpoint); - } + } @Override public MsoResponseWrapper createVnf(RequestDetails requestDetails, String serviceInstanceId) { - String methodName = "createVnf"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("createVnf"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE); String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); return msoClientInterface.createVnf(requestDetails, vnf_endpoint); @@ -136,11 +136,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper createNwInstance(RequestDetails requestDetails, String serviceInstanceId) { - String methodName = "createNwInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("createNwInstance"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); String nw_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); return msoClientInterface.createNwInstance(requestDetails, nw_endpoint); @@ -148,11 +146,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper createVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { - String methodName = "createVolumeGroupInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("createVolumeGroupInstance"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); vnf_endpoint = vnf_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId); @@ -162,11 +158,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper createVfModuleInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { - String methodName = "createVfModuleInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("createVfModuleInstance"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId); @@ -175,9 +169,24 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { } @Override + public MsoResponseWrapper scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { + logInvocationInDebug("scaleOutVfModuleInstance"); + + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT); + + String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); + String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId); + RequestDetailsWrapper wrapper = new RequestDetailsWrapper(); + requestDetails.setVnfName(null); + requestDetails.setVnfInstanceId(null); + wrapper.requestDetails = requestDetails; + + return msoClientInterface.scaleOutVFModuleInstance(wrapper, vf_module_endpoint); + } + + @Override public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId) { - String methodName = "createConfigurationInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("createConfigurationInstance"); String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATIONS); endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId); @@ -187,24 +196,21 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper deleteE2eSvcInstance(Object requestDetails, String serviceInstanceId) { - String methodName = "deleteE2eSvcInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("deleteE2eSvcInstance"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId; + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId; return msoClientInterface.deleteE2eSvcInstance(requestDetails, endpoint); } @Override public MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus) { - String methodName = "deleteSvcInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("deleteSvcInstance"); String endpoint; - if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)){ + if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)) { endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE); - if (shouldUnassignService(serviceStatus)){ + if (shouldUnassignService(serviceStatus)) { logger.debug(EELFLoggerDelegate.debugLogger, "unassign service"); String svc_endpoint = endpoint + "/" + serviceInstanceId + "/unassign"; return msoClientInterface.unassignSvcInstance(requestDetails, svc_endpoint); @@ -218,16 +224,14 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { } private boolean shouldUnassignService(String serviceStatus) { - return ImmutableList.of("created","pendingdelete","pending-delete", "assigned").contains(serviceStatus.toLowerCase()); + return ImmutableList.of("created", "pendingdelete", "pending-delete", "assigned").contains(serviceStatus.toLowerCase()); } @Override public MsoResponseWrapper deleteVnf(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { - String methodName = "deleteVnf"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("deleteVnf"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE); String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); vnf_endpoint = vnf_endpoint + '/' + vnfInstanceId; @@ -236,14 +240,10 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper deleteVfModule(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String vfModuleId) { - String methodName = "deleteVfModule"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); - - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); + logInvocationInDebug("deleteVfModule"); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId).replaceFirst(VNF_INSTANCE_ID, vnfInstanceId); - String delete_vf_endpoint = vf__modules_endpoint + '/' + vfModuleId; return msoClientInterface.deleteVfModule(requestDetails, delete_vf_endpoint); @@ -251,12 +251,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper deleteVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String volumeGroupId) { - String methodName = "deleteVolumeGroupInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); - - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); + logInvocationInDebug("deleteVolumeGroupInstance"); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); String vnf_endpoint = svc_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId); String delete_volume_group_endpoint = vnf_endpoint + "/" + volumeGroupId; @@ -266,12 +263,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper deleteNwInstance(RequestDetails requestDetails, String serviceInstanceId, String networkInstanceId) { - String methodName = "deleteNwInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); - - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); + logInvocationInDebug("deleteNwInstance"); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); String delete_nw_endpoint = svc_endpoint + "/" + networkInstanceId; @@ -281,7 +275,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper getOrchestrationRequest(String requestId) { String methodName = "getOrchestrationRequest"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug(methodName); try { String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ); String path = p + "/" + requestId; @@ -289,8 +283,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { return msoClientInterface.getOrchestrationRequest(path); } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logException(methodName, e); throw e; } } @@ -298,7 +291,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper getOrchestrationRequests(String filterString) { String methodName = "getOrchestrationRequest"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug(methodName); try { String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS); String path = p + filterString; @@ -306,8 +299,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { return msoClientInterface.getOrchestrationRequest(path); } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logException(methodName, e); throw e; } } @@ -315,48 +307,51 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public List<Request> getOrchestrationRequestsForDashboard() { String methodName = "getOrchestrationRequestsForDashboard"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); - List<Request> filteredOrchestrationRequests = new ArrayList<>(); - try { - String path = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS); - path += "filter=modelType:EQUALS:vnf"; - RestObject<String> restObjStr = new RestObject<>(); - String str = new String(); - restObjStr.set(str); + logInvocationInDebug(methodName); - MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequestsForDashboard(str, "", path, restObjStr); - List<RequestWrapper> allOrchestrationRequests = deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity()); - - final ImmutableList<String> suppoertedRequestTypes = ImmutableList.of( - RequestType.REPLACE_INSTANCE.toString().toUpperCase(), - RequestType.UPDATE_INSTANCE.toString().toUpperCase(), - RequestType.APPLY_UPDATED_CONFIG.toString().toUpperCase(), - RequestType.IN_PLACE_SOFTWARE_UPDATE.toString().toUpperCase() - ); - - for (RequestWrapper currentRequest : allOrchestrationRequests) { - if (currentRequest.getRequest() != null - && "vnf".equalsIgnoreCase(currentRequest.getRequest().getRequestScope()) - && suppoertedRequestTypes.contains(upperCase(currentRequest.getRequest().getRequestType())) - ) { - filteredOrchestrationRequests.add(currentRequest.getRequest()); - } - } + List<Request> dashboardOrchestrationReqs = new ArrayList<>(); + try { + List<RequestWrapper> vnfOrchestrationReqsWrappers = getOrchestrationRequestsByFilter("modelType", "vnf"); + dashboardOrchestrationReqs = vnfOrchestrationReqsWrappers.stream() + .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest()) + && DASHBOARD_ALLOWED_TYPES.contains(upperCase(reqWrapper.getRequest().getRequestType()))) + .map(RequestWrapper::getRequest) + .collect(Collectors.toList()); + + List<RequestWrapper> scaleOutOrchestrationReqWrappers = getOrchestrationRequestsByFilter("action", "scaleOut"); + List<Request> scaleoutRequests = scaleOutOrchestrationReqWrappers.stream() + .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest())) + .map(RequestWrapper::getRequest) + .collect(Collectors.toList()); + + dashboardOrchestrationReqs.addAll(scaleoutRequests); } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logException(methodName, e); } - return filteredOrchestrationRequests; + return dashboardOrchestrationReqs; + } + + private String constructOrchestrationRequestFilter(String filterName, String filterValue) { + return String.format("%sfilter=%s:EQUALS:%s", + SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS), filterName, filterValue); + } + + private List<RequestWrapper> getOrchestrationRequestsByFilter(String filterName, String filterValue) { + String orchestrationReqPath = constructOrchestrationRequestFilter(filterName, filterValue); + RestObject<String> restObjStr = new RestObject<>(); + String str = new String(); + restObjStr.set(str); + MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequestsForDashboard(str, "", orchestrationReqPath, restObjStr); + return deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity()); } private List<RequestWrapper> deserializeOrchestrationRequestsJson(String orchestrationRequestsJson) { - String methodName = "deserializeOrchestrationRequestsJson"; - logger.debug(dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("deserializeOrchestrationRequestsJson"); ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true); - RequestList requestList = null; + RequestList requestList; try { requestList = mapper.readValue(orchestrationRequestsJson, RequestList.class); } catch (IOException e) { @@ -369,7 +364,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public List<Task> getManualTasksByRequestId(String originalRequestId) { String methodName = "getManualTasksByRequestId"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug(methodName); try { String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS); @@ -383,15 +378,13 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { return deserializeManualTasksJson(msoResponseWrapper.getEntity()); } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logException(methodName, e); throw e; } } private List<Task> deserializeManualTasksJson(String manualTasksJson) { - String methodName = "deserializeManualTasksJson"; - logger.debug(dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("deserializeManualTasksJson"); ObjectMapper mapper = new ObjectMapper(); try { @@ -406,7 +399,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper completeManualTask(RequestDetails requestDetails, String taskId) { String methodName = "completeManualTask"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug(methodName); try { String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS); String path = p + "/" + taskId + "/complete"; @@ -420,8 +413,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { return MsoUtil.wrapResponse(restObjStr); } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logException(methodName, e); throw e; } } @@ -429,7 +421,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper activateServiceInstance(RequestDetails requestDetails, String serviceInstanceId) { String methodName = "activateServiceInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug(methodName); try { String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE); String activateServicePath = serviceEndpoint + "/" + serviceInstanceId + ACTIVATE; @@ -443,8 +435,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { return MsoUtil.wrapResponse(restObjStr); } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logException(methodName, e); throw e; } } @@ -452,8 +443,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapperInterface updateVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { - String methodName = "updateVnf"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("updateVnf"); String endpoint; endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE); @@ -464,11 +454,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapperInterface replaceVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { - String methodName = "replaceVnf"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("replaceVnf"); - String endpoint; - endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE); String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId); vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, MsoChangeManagementRequest.REPLACE); @@ -489,22 +477,17 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public RequestDetailsWrapper generateConfigMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) { validateUpdateVnfConfig(requestDetails); - RequestDetails ConfigUpdateRequest = new RequestDetails(); - ConfigUpdateRequest.setRequestParameters(requestDetails.getRequestParameters()); - ConfigUpdateRequest.setRequestInfo(requestDetails.getRequestInfo()); + RequestDetails configUpdateRequest = new RequestDetails(); + configUpdateRequest.setRequestParameters(requestDetails.getRequestParameters()); + configUpdateRequest.setRequestInfo(requestDetails.getRequestInfo()); RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper(); - requestDetailsWrapper.requestDetails = ConfigUpdateRequest; + requestDetailsWrapper.requestDetails = configUpdateRequest; return requestDetailsWrapper; } - - - - @Override public MsoResponseWrapperInterface updateVnfSoftware(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { - String methodName = "updateVnfSoftware"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("updateVnfSoftware"); String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.SOFTWARE_UPDATE); //workflow name in mso is different than workflow name in vid UI RequestDetailsWrapper finalRequestDetails = generateInPlaceMsoRequest(requestDetails); return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint); @@ -512,30 +495,28 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapperInterface updateVnfConfig(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) { - String methodName = "updateVnfConfig"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("updateVnfConfig"); RequestDetailsWrapper finalRequestDetails = generateConfigMsoRequest(requestDetails); String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.CONFIG_UPDATE); return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint); } private String getChangeManagementEndpoint(String serviceInstanceId, String vnfInstanceId, String vnfRequestType) { - String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE); + String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE); String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId); vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId); vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, vnfRequestType); return vnf_endpoint; } - private Map getChangeManagementPayload(RequestDetails requestDetails, String message){ - if(requestDetails.getRequestParameters()==null||requestDetails.getRequestParameters().getAdditionalProperties()==null){ + private Map getChangeManagementPayload(RequestDetails requestDetails, String message) { + if (requestDetails.getRequestParameters() == null || requestDetails.getRequestParameters().getAdditionalProperties() == null) { throw new BadRequestException(message); } - Object payloadRaw=requestDetails.getRequestParameters().getAdditionalProperties().get("payload"); - try{ - return objectMapper.readValue((String)payloadRaw,Map.class); - } - catch(Exception exception){ + Object payloadRaw = requestDetails.getRequestParameters().getAdditionalProperties().get("payload"); + try { + return objectMapper.readValue((String) payloadRaw, Map.class); + } catch (Exception exception) { throw new BadRequestException(message); } } @@ -564,30 +545,12 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { } } - private void validateUpdateVnfConfig(RequestDetails requestDetails) { - final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request"; - - Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg); - validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters"); - validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters"); - } - - private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) { - final String noValidPayloadPropertyMsg = noValidPayloadMsg+ ", "+ propertyName + " property is not valid"; - if(!payload.containsKey(propertyName)) { - throw new BadRequestException( noValidPayloadPropertyMsg); - } - } - @Override - public MsoResponseWrapper deleteConfiguration( - org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, - String serviceInstanceId, - String configurationId) { - - String methodName = "deleteConfiguration"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + public MsoResponseWrapper deleteConfiguration(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, + String serviceInstanceId, + String configurationId) { + logInvocationInDebug("deleteConfiguration"); String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE); endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId); endpoint = endpoint.replace(CONFIGURATION_ID, configurationId); @@ -602,8 +565,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { String configurationId, boolean isActivate) { - String methodName = "setConfigurationActiveStatus"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("setConfigurationActiveStatus"); String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE); endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId); @@ -616,9 +578,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { } @Override - public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails , String serviceInstanceId, boolean isActivate) { + public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails, String serviceInstanceId, boolean isActivate) { + logInvocationInDebug("setServiceInstanceStatus"); String methodName = "setServiceInstanceStatus"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); try { String serviceEndpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE); String endpoint = serviceEndpoint + "/" + serviceInstanceId; @@ -631,7 +593,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { String str = ""; restObjStr.set(str); - msoClientInterface.setServiceInstanceStatus(requestDetails , str, "", endpoint, restObjStr); + msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", endpoint, restObjStr); return MsoUtil.wrapResponse(restObjStr); @@ -648,8 +610,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { String serviceInstanceId, String configurationId, boolean isEnable) { - String methodName = "setPortOnConfigurationStatus"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("setPortOnConfigurationStatus"); String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE); endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId); @@ -663,7 +624,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override - public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) { + public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) { RequestDetails requestDetails = new RequestDetails(); RequestInfo requestInfo = new RequestInfo(); requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT); @@ -737,7 +698,6 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { } - @Override public RequestDetailsWrapper<OperationEnvironmentRequestDetails> convertParametersToRequestDetails(OperationalEnvironmentController.OperationalEnvironmentCreateBody input, String userId) { OperationEnvironmentRequestDetails.RequestInfo requestInfo = new OperationEnvironmentRequestDetails.RequestInfo( @@ -766,8 +726,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper removeRelationshipFromServiceInstance(RequestDetails requestDetails, String serviceInstanceId) { - String methodName = "removeRelationshipFromServiceInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("removeRelationshipFromServiceInstance"); String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE); String removeRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/removeRelationships"; @@ -777,8 +736,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { @Override public MsoResponseWrapper addRelationshipToServiceInstance(RequestDetails requestDetails, String serviceInstanceId) { - String methodName = "addRelationshipToServiceInstance"; - logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + logInvocationInDebug("addRelationshipToServiceInstance"); String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE); String addRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/addRelationships"; @@ -786,8 +744,31 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { return msoClientInterface.addRelationshipToServiceInstance(requestDetails, addRelationshipsPath); } + private void validateUpdateVnfConfig(RequestDetails requestDetails) { + final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request"; - public enum RequestType { + Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg); + validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters"); + validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters"); + } + + private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) { + final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid"; + if (!payload.containsKey(propertyName)) { + throw new BadRequestException(noValidPayloadPropertyMsg); + } + } + + private void logInvocationInDebug(String methodName) { + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start"); + } + + private void logException(String methodName, Exception e) { + logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString()); + } + + enum RequestType { CREATE_INSTANCE("createInstance"), DELETE_INSTANCE("deleteInstance"), @@ -797,27 +778,23 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { DEACTIVATE_INSTANCE("deactivateInstance"), APPLY_UPDATED_CONFIG("applyUpdatedConfig"), IN_PLACE_SOFTWARE_UPDATE("inPlaceSoftwareUpdate"), + SCALE_OUT("scaleOut"), UNKNOWN("unknown"), NOT_PROVIDED("not provided"); - private final String value; private static final Map<String, RequestType> CONSTANTS = new HashMap<>(); static { - for (RequestType c: values()) { + for (RequestType c : values()) { CONSTANTS.put(c.value, c); } } + private final String value; + RequestType(String value) { this.value = value; } - @JsonValue - @Override - public String toString() { - return this.value; - } - @JsonCreator public static RequestType fromValue(String value) { RequestType constant = CONSTANTS.get(value); @@ -827,5 +804,11 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic { return constant; } } + + @JsonValue + @Override + public String toString() { + return this.value; + } } }
\ No newline at end of file diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java index 3cba12f67..834f80885 100644 --- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java +++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java @@ -74,6 +74,8 @@ public interface MsoInterface { MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String endpoint); + MsoResponseWrapper scaleOutVFModuleInstance(RequestDetailsWrapper requestDetailsWrapper, String endpoint); + MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String endpoint); MsoResponseWrapper unassignSvcInstance(RequestDetails requestDetails, String endpoint); diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java index 773b8a83a..1d71e9c75 100644 --- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java +++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java @@ -99,6 +99,8 @@ public class MsoProperties extends SystemProperties { /** The Constant MSO_REST_API_VF_MODULE_INSTANCE. */ public static final String MSO_REST_API_VF_MODULE_INSTANCE = "mso.restapi.vf.module.instance"; + public static final String MSO_REST_API_VF_MODULE_SCALE_OUT = "mso.restapi.vf.module.scaleout"; + /** The Constant MSO_REST_API_VOLUME_GROUP_INSTANCE. */ public static final String MSO_REST_API_VOLUME_GROUP_INSTANCE = "mso.restapi.volume.group.instance"; //serviceInstances/v2/{serviceInstanceId}/volumeGroups diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java b/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java index 9cac3e4e2..37600f7b9 100644 --- a/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java +++ b/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java @@ -124,6 +124,14 @@ public class MsoRestClientNew implements MsoInterface { } @Override + public MsoResponseWrapper scaleOutVFModuleInstance(RequestDetailsWrapper requestDetailsWrapper, String endpoint) { + String methodName = "scaleOutVFModuleInstance"; + logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); + String path = baseUrl + endpoint; + return createInstance(requestDetailsWrapper, path); + } + + @Override public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String endpoint) { String methodName = "createConfigurationInstance"; logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START); @@ -478,7 +486,7 @@ public class MsoRestClientNew implements MsoInterface { try { logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Delete, path =[" + path + "]"); - HttpResponse<String> response = client.delete(path, commonHeaders, String.class); + HttpResponse<String> response = client.delete(path, commonHeaders, request, String.class); MsoResponseWrapper w = MsoUtil.wrapResponse(response); logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse()); diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java index df6914843..2b159f812 100644 --- a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java +++ b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java @@ -20,11 +20,20 @@ package org.onap.vid.mso.rest; -import com.fasterxml.jackson.annotation.*; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; -import org.apache.commons.lang.builder.ToStringBuilder; -import org.onap.vid.domain.mso.*; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.onap.vid.domain.mso.CloudConfiguration; +import org.onap.vid.domain.mso.ModelInfo; +import org.onap.vid.domain.mso.RequestInfo; +import org.onap.vid.domain.mso.RequestParameters; +import org.onap.vid.domain.mso.SubscriberInfo; import java.util.HashMap; import java.util.List; @@ -41,7 +50,8 @@ import java.util.Map; "relatedModelList", "requestInfo", "subscriberInfo", - "requestParameters" + "requestParameters", + "configurationParameters" }) public class RequestDetails{ @@ -71,6 +81,9 @@ public class RequestDetails{ @JsonProperty("requestParameters") private RequestParameters requestParameters; + @JsonProperty("configurationParameters") + protected List<Map<String, String>> configurationParameters; + /** The additional properties. */ @JsonIgnore private Map<String, Object> additionalProperties = new HashMap<String, Object>(); @@ -198,12 +211,31 @@ public class RequestDetails{ this.additionalProperties.put(name, value); } + @JsonProperty("configurationParameters") + public List<Map<String, String>> getConfigurationParameters() { + return configurationParameters; + } + + @JsonProperty("configurationParameters") + public void setConfigurationParameters(List<Map<String, String>> configurationParameters) { + this.configurationParameters = configurationParameters; + } + /* (non-Javadoc) * @see org.onap.vid.domain.mso.RequestDetails#hashCode() */ @Override public int hashCode() { - return new HashCodeBuilder().append(cloudConfiguration).append(modelInfo).append(relatedInstanceList).append(requestInfo).append(getRequestParameters()).append(subscriberInfo).append(additionalProperties).toHashCode(); + return new HashCodeBuilder() + .append(cloudConfiguration) + .append(modelInfo) + .append(relatedInstanceList) + .append(requestInfo) + .append(getRequestParameters()) + .append(subscriberInfo) + .append(additionalProperties) + .append(configurationParameters) + .toHashCode(); } /* (non-Javadoc) @@ -214,11 +246,20 @@ public class RequestDetails{ if (other == this) { return true; } - if ((other instanceof RequestDetails) == false) { + if (!(other instanceof RequestDetails)) { return false; } RequestDetails rhs = ((RequestDetails) other); - return new EqualsBuilder().append(cloudConfiguration, rhs.cloudConfiguration).append(modelInfo, rhs.modelInfo).append(relatedInstanceList, rhs.relatedInstanceList).append(requestInfo, rhs.requestInfo).append(getRequestParameters(), rhs.getRequestParameters()).append(subscriberInfo, rhs.subscriberInfo).append(additionalProperties, rhs.additionalProperties).isEquals(); + return new EqualsBuilder() + .append(cloudConfiguration, rhs.cloudConfiguration) + .append(modelInfo, rhs.modelInfo) + .append(relatedInstanceList, rhs.relatedInstanceList) + .append(requestInfo, rhs.requestInfo) + .append(getRequestParameters(), rhs.getRequestParameters()) + .append(subscriberInfo, rhs.subscriberInfo) + .append(additionalProperties, rhs.additionalProperties) + .append(configurationParameters, rhs.configurationParameters) + .isEquals(); } public RequestParameters getRequestParameters() { diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java index 0e320a35f..20c84422e 100644 --- a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java +++ b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java @@ -1,5 +1,34 @@ +/* + * ============LICENSE_START========================================== + * =================================================================== + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * =================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * + * + */ package org.onap.vid.mso.rest; -public class RequestDetailsWrapper { - public RequestDetails requestDetails; +public final class RequestDetailsWrapper { + + private final RequestDetails requestDetails; + + public RequestDetailsWrapper(RequestDetails requestDetails) { + this.requestDetails = requestDetails; + } + + public RequestDetails getRequestDetails() { + return requestDetails; + } } diff --git a/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java b/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java index 45835d459..5c1ee9e89 100644 --- a/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java +++ b/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java @@ -1,3 +1,23 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * 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.vid.roles; import com.fasterxml.jackson.core.JsonProcessingException; @@ -16,8 +36,6 @@ import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.util.*; -//import org.codehaus.jackson.map.ObjectMapper; - /** * Created by Oren on 7/1/17. */ @@ -45,16 +63,16 @@ public class RoleProvider { LOG.debug(EELFLoggerDelegate.debugLogger, "Role provider => init method finished"); } - public List<Role> getUserRoles(HttpServletRequest request) throws JsonProcessingException { + public List<Role> getUserRoles(HttpServletRequest request) { String logPrefix = "Role Provider (" + UserUtils.getUserId(request) + ") ==>"; LOG.debug(EELFLoggerDelegate.debugLogger, logPrefix + "Entering to get user role for user " + UserUtils.getUserId(request)); List<Role> roleList = new ArrayList<>(); - //Disable roles until AAF integration finishes - /*HashMap roles = UserUtils.getRoles(request); + + Map roles = UserUtils.getRoles(request); for (Object role : roles.keySet()) { - org.openecomp.portalsdk.core.domain.Role sdkRol = (org.openecomp.portalsdk.core.domain.Role) roles.get(role); + org.onap.portalsdk.core.domain.Role sdkRol = (org.onap.portalsdk.core.domain.Role) roles.get(role); LOG.debug(EELFLoggerDelegate.debugLogger, logPrefix + "Role " + sdkRol.getName() + " is being proccessed"); try { @@ -67,11 +85,11 @@ public class RoleProvider { roleList.add(createRoleFromStringArr(roleParts, logPrefix)); String msg = String.format(logPrefix + " User %s got permissions %s", UserUtils.getUserId(request), Arrays.toString(roleParts)); LOG.debug(EELFLoggerDelegate.debugLogger, msg); - } catch (RoleParsingException e) { + } catch (Exception e) { LOG.error(logPrefix + " Failed to parse permission"); } - }*/ + } return roleList; } diff --git a/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java index 13db1ae98..b4806f1ce 100644 --- a/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java @@ -1,3 +1,23 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ package org.onap.vid.services; import com.fasterxml.jackson.core.JsonParseException; @@ -16,12 +36,12 @@ public class AuditServiceImpl implements AuditService{ @Inject private AsyncInstantiationBusinessLogic asyncInstantiationBL; + public static final String FAILED_MSO_REQUEST_STATUS = "FAILED"; @Override public void setFailedAuditStatusFromMso(UUID jobUuid, String requestId, int statusCode, String msoResponse){ - final String failedMsoRequestStatus = "FAILED"; String additionalInfo = formatExceptionAdditionalInfo(statusCode, msoResponse); - asyncInstantiationBL.auditMsoStatus(jobUuid, failedMsoRequestStatus, requestId, additionalInfo); + asyncInstantiationBL.auditMsoStatus(jobUuid, FAILED_MSO_REQUEST_STATUS, requestId, additionalInfo); } private String formatExceptionAdditionalInfo(int statusCode, String msoResponse) { diff --git a/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java index fa531ffc1..b3d20a622 100644 --- a/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java @@ -1,3 +1,23 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ package org.onap.vid.services; import org.onap.vid.category.AddCategoryOptionResponse; @@ -20,6 +40,7 @@ import java.util.stream.Collectors; @Service public class CategoryParameterServiceImpl implements CategoryParameterService { + public static final String OPTION_ALREADY_EXIST_FOR_CATEGORY = "Option %s already exist for category %s"; @Autowired private DataAccessService dataAccessService; @@ -68,7 +89,7 @@ public class CategoryParameterServiceImpl implements CategoryParameterService { Set<String> categoryOptions = categoryParameter.getOptions().stream().map(CategoryParameterOption::getName).collect(Collectors.toSet()); for (String optionName : optionsRequest.options) { if (categoryOptions.contains(optionName)) { - response.getErrors().add(String.format("Option %s already exist for category %s", optionName, categoryName)); + response.getErrors().add(String.format(OPTION_ALREADY_EXIST_FOR_CATEGORY, optionName, categoryName)); continue; } String appId = categoryParameter.isIdSupported() ? UUID.randomUUID().toString() : optionName; diff --git a/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java index 90d1c33e3..e4a6b3990 100644 --- a/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java @@ -102,7 +102,7 @@ public class ChangeManagementServiceImpl implements ChangeManagementService { break; } case ChangeManagementRequest.SCALE_OUT:{ - msoResponseWrapperObject = msoBusinessLogic.createVfModuleInstance(currentRequestDetails, serviceInstanceId, vnfInstanceId); + msoResponseWrapperObject = msoBusinessLogic.scaleOutVfModuleInstance(currentRequestDetails, serviceInstanceId, vnfInstanceId); break; } default: diff --git a/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java index 21b1ec1c3..231b35222 100644 --- a/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java @@ -1,3 +1,23 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ package org.onap.vid.services; import org.onap.vid.aai.PombaClientInterface; diff --git a/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java index dc2541b3f..1890a5b37 100644 --- a/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java +++ b/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java @@ -1,3 +1,23 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ package org.onap.vid.services; import com.google.common.cache.CacheBuilder; diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js index 89660fb18..aee4c05fe 100755 --- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js +++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js @@ -190,7 +190,7 @@ DataService.setPnf(!angular.equals(serviceModel.pnfs, {}));
$scope.createType = COMPONENT.A_LA_CARTE;
var broadcastType = COMPONENT.CREATE_COMPONENT;
- if (AsdcService.isMacro(serviceModel)) {
+ if (AsdcService.isMacro(serviceModel) || DataService.getE2EService()) {
DataService.setALaCarte(false);
if(AsdcService.shouldExcludeMacroFromAsyncInstatiationFlow(serviceModel)){
DataService.setShouldExcludeMacroFromAsyncInstatiationFlow(true);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js index c55092e4c..3a5a1c7e0 100644 --- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js +++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js @@ -10,7 +10,7 @@ vm.hasScheduler = !!VIDCONFIGURATION.SCHEDULER_PORTAL_URL; vm.configUpdatePatternError = "Invalid file type. Please select a file with a CSV extension."; vm.configUpdateContentError = "Invalid file structure."; - + vm.wizardStep = 1; vm.nextStep = function(){ vm.wizardStep++; @@ -94,14 +94,14 @@ _.forEach(newVNFName.vfModules, function (mdl, key) { mdl.scale = false; //defaults to not scale unless user changes it - if(mdl.properties && mdl.properties.max_vf_module_instances) { + if(mdl.properties && mdl.properties.maxCountInstances) { //how many vf modules of the same customizationId belong to that vnf instance mdl.currentCount = _.filter(vm.vfModules, function(item){ return modulesAaiIds.indexOf(item.id) > -1 && item.properties["model-customization-id"] === mdl.customizationUuid; }).length; - mdl.scalable = mdl.properties.max_vf_module_instances.value - mdl.currentCount > 0; + mdl.scalable = mdl.properties.maxCountInstances.value - mdl.currentCount > 0; }else{ mdl.scalable = false; } @@ -193,9 +193,10 @@ var result = {}; result.requestType = changeManagement.workflow; var workflowType = changeManagement.workflow; + var configurationParameters = changeManagement.configurationParameters; result.requestDetails = []; _.forEach(changeManagement.vnfNames, function (vnf) { - + try{ var requestInfoData ={}; var requestParametersData ={}; @@ -203,13 +204,13 @@ return !item.scale; }); if (vnf.availableVersions && vnf.availableVersions.length!=0){ - + requestInfoData ={ source: vnf.availableVersions[0].requestInfo.source, suppressRollback: vnf.availableVersions[0].requestInfo.suppressRollback, requestorId: vnf.availableVersions[0].requestInfo.requestorId } - + if(workflowType=='Update'){ requestParametersData = { usePreload: vnf.availableVersions[0].requestParameters.usePreload @@ -268,17 +269,22 @@ var data; if(workflowType=="VNF Scale Out") { data = { + vnfName: vnf.name, + vnfInstanceId: vnf.id, modelInfo: { modelType: 'vfModule', modelInvariantId: moduleToScale.invariantUuid, modelName: moduleToScale.modelCustomizationName, modelVersion: moduleToScale.version, + modelCustomizationName: moduleToScale.modelCustomizationName, + modelCustomizationId: moduleToScale.customizationUuid, modelVersionId: moduleToScale.uuid }, cloudConfiguration: vnf.cloudConfiguration, requestInfo: requestInfoData, relatedInstanceList: [], - requestParameters:requestParametersData + requestParameters:requestParametersData, + configurationParameters: JSON.parse(configurationParameters) }; requestInfoData.instanceName = vnf.name + "_" + (moduleToScale.currentCount + 1); }else{ @@ -333,6 +339,7 @@ var relatedInstance = { instanceId: vnf.id, modelInfo: { + modelCustomizationId: vnf.availableVersions[0].modelInfo.modelCustomizationId, modelCustomizationName: vnf.availableVersions[0].modelInfo.modelCustomizationName, modelInvariantId: vnf.availableVersions[0].modelInfo.modelInvariantId, modelName: vnf.availableVersions[0].modelInfo.modelName, @@ -352,7 +359,6 @@ }); return JSON.stringify(result); } - vm.openModal = function () { if(vm.hasScheduler) { //scheduling supported $scope.widgetParameter = ""; // needed by the scheduler? @@ -370,22 +376,14 @@ widgetData: vm.changeManagement, widgetParameter: $scope.widgetParameter }; - + window.parent.postMessage(data, VIDCONFIGURATION.SCHEDULER_PORTAL_URL); } else { //no scheduling support var dataToSo = extractChangeManagementCallbackDataStr(vm.changeManagement); if(dataToSo) { - - if(vm.changeManagement.workflow==="VNF Scale Out") { - dataToSo = JSON.parse(dataToSo); - dataToSo = {requestDetails: dataToSo.requestDetails[0]}; - changeManagementService.postChangeManagementScaleOutNow(dataToSo, vm.changeManagement.vnfNames[0]["service-instance-node"][0].properties["service-instance-id"], vm.changeManagement.vnfNames[0].id); - }else{ - //TODO: foreach - var vnfName = vm.changeManagement.vnfNames[0].name; - changeManagementService.postChangeManagementNow(dataToSo, vnfName); - } + var vnfName = vm.changeManagement.vnfNames[0].name; + changeManagementService.postChangeManagementNow(dataToSo, vnfName); } } }; @@ -649,7 +647,7 @@ vm.isConfigUpdate = function () { return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfConfigUpdate; } - + vm.isScaleOut = function () { return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfScaleOut; } diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html index ec1d4cde6..21f9c5d3f 100644 --- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html +++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html @@ -58,6 +58,10 @@ <option value="" disabled>Select workflow</option> </select> </div> + <div class="form-group" ng-if="vm.isScaleOut()"> + <label class="control-label">Configuration Parameters</label> + <input type="text" name="configurationParameters" ng-model="vm.changeManagement.configurationParameters" id="configuration-parameters" required> + </div> <div class="form-group" ng-if="vm.isConfigUpdate()"> <label class="control-label">Attach configuration file</label> <div class="file-wrapper"> @@ -143,4 +147,4 @@ <button ng-if="vm.isScaleOut() && vm.wizardStep === 1" ng-click="vm.nextStep();" type="button" id="next" name="next" class="btn btn-primary" data-ng-disabled="newChangeManagement.$invalid">Next</button> </div> </div> -</form> +</form>
\ No newline at end of file diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js index 753f9fd19..6bdc0ae9c 100755 --- a/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js +++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js @@ -20,7 +20,7 @@ "use strict";
-var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCONFIGURATION, COMPONENT, featureFlags) {
+var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCONFIGURATION, COMPONENT, DataService, featureFlags) {
return {
getModel: function (modelId, successCallbackFunction) {
$log.debug("AsdcService:getModel: modelId: " + modelId);
@@ -37,6 +37,8 @@ var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCON shouldExcludeMacroFromAsyncInstatiationFlow: function(serviceModel){
if (!featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_ASYNC_INSTANTIATION))
return true;
+ if (DataService.getE2EService())
+ return true;
if (!_.isEmpty(serviceModel.pnfs))
return true;
if (!_.isEmpty(serviceModel.collectionResource))
@@ -72,4 +74,4 @@ var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCON }
appDS2.factory("AsdcService", ["$http", "$log", "PropertyService",
- "UtilityService", "VIDCONFIGURATION","COMPONENT", "featureFlags", AsdcService]);
+ "UtilityService", "VIDCONFIGURATION","COMPONENT", "DataService", "featureFlags", AsdcService]);
diff --git a/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java b/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java index 76d1d4aff..43ac2899b 100644 --- a/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java @@ -33,6 +33,7 @@ import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.onap.portalsdk.core.util.SystemProperties; import org.onap.vid.aai.model.AaiGetTenatns.GetTenantsResponse; import org.onap.vid.aai.model.AaiNodeQueryResponse; +import org.onap.vid.aai.model.PortDetailsTranslator; import org.onap.vid.aai.model.ResourceType; import org.onap.vid.aai.util.AAIRestInterface; import org.onap.vid.aai.util.HttpsAuthClient; @@ -76,7 +77,9 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalToIgnoringCase; import static org.mockito.Matchers.any; import static org.mockito.Matchers.*; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.testng.Assert.*; @@ -88,19 +91,19 @@ public class AaiClientTest { private ServletContext servletContext; @BeforeMethod - public void initMocks(){ + public void initMocks() { aaiClientMock = mock(AaiClient.class); aaiClientMock.logger = mock(EELFLoggerDelegate.class); servletContext = mock(ServletContext.class); when(servletContext.getRealPath(any(String.class))).thenReturn(""); - when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(null); + when(aaiClientMock.doAaiGet(any(String.class), any(Boolean.class))).thenReturn(null); } @DataProvider public static Object[][] logicalLinkData() { - return new Object[][] { + return new Object[][]{ {"", "network/logical-links/logical-link/"}, {"link", "network/logical-links/logical-link/link"} }; @@ -111,21 +114,26 @@ public class AaiClientTest { when(aaiClientMock.getLogicalLink(any(String.class))).thenCallRealMethod(); aaiClientMock.getLogicalLink(link); - Mockito.verify(aaiClientMock).doAaiGet(argThat(equalToIgnoringCase(expectedUrl)),any(Boolean.class)); + Mockito.verify(aaiClientMock).doAaiGet(argThat(equalToIgnoringCase(expectedUrl)), any(Boolean.class)); } @DataProvider public static Object[][] subscribersResults() { - return new Object[][] { - {new SubscriberList(new ArrayList<Subscriber>() {{ add(new Subscriber()); add(new Subscriber()); }}), true}, - {new SubscriberList(new ArrayList<Subscriber>() {{ add(new Subscriber()); }}), true}, + return new Object[][]{ + {new SubscriberList(new ArrayList<Subscriber>() {{ + add(new Subscriber()); + add(new Subscriber()); + }}), true}, + {new SubscriberList(new ArrayList<Subscriber>() {{ + add(new Subscriber()); + }}), true}, {new SubscriberList(new ArrayList<Subscriber>()), false} }; } @Test(dataProvider = "subscribersResults") - public void testProbeAaiGetAllSubscribers_returnsTwoToZeroSubscribers_ResultsAsExpected(SubscriberList subscribers, boolean isAvailable){ - ExternalComponentStatus expectedStatus = new ExternalComponentStatus(ExternalComponentStatus.Component.AAI,isAvailable, new HttpRequestMetadata( + public void testProbeAaiGetAllSubscribers_returnsTwoToZeroSubscribers_ResultsAsExpected(SubscriberList subscribers, boolean isAvailable) { + ExternalComponentStatus expectedStatus = new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, isAvailable, new HttpRequestMetadata( HttpMethod.GET, 200, "url", @@ -138,9 +146,9 @@ public class AaiClientTest { HttpMethod.GET, "url", new AaiResponse<>(subscribers, null, 200), "rawData")); Mockito.when(aaiClientMock.probeAaiGetAllSubscribers()).thenCallRealMethod(); - ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers(); - assertThat(statusDataReflected(result),is(statusDataReflected(expectedStatus))); - assertThat(requestMetadataReflected(result.getMetadata()),is(requestMetadataReflected(expectedStatus.getMetadata()))); + ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers(); + assertThat(statusDataReflected(result), is(statusDataReflected(expectedStatus))); + assertThat(requestMetadataReflected(result.getMetadata()), is(requestMetadataReflected(expectedStatus.getMetadata()))); } //serialize fields except of fields we cannot know ahead of time @@ -159,12 +167,12 @@ public class AaiClientTest { @DataProvider public static Object[][] rawData() { return new Object[][]{ - {"errorMessage", }, {""}, {null} + {"errorMessage",}, {""}, {null} }; } @Test(dataProvider = "rawData") - public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String rawData){ + public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String rawData) { Mockito.when(aaiClientMock.getAllSubscribers(true)).thenReturn( new AaiResponseWithRequestInfo<>(HttpMethod.GET, "url", null, rawData)); @@ -175,7 +183,7 @@ public class AaiClientTest { @DataProvider public static Object[][] exceptions() { - return new Object[][] { + return new Object[][]{ {"NullPointerException", "errorMessage", new ExceptionWithRequestInfo(HttpMethod.GET, "url", "errorMessage", null, new NullPointerException())}, @@ -188,7 +196,7 @@ public class AaiClientTest { } @Test(dataProvider = "exceptions") - public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String description, String expectedRawData, Exception exception){ + public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String description, String expectedRawData, Exception exception) { Mockito.when(aaiClientMock.getAllSubscribers(true)).thenThrow(exception); ExternalComponentStatus result = callProbeAaiGetAllSubscribersAndAssertNotAvailable(); if (exception instanceof ExceptionWithRequestInfo) { @@ -200,7 +208,7 @@ public class AaiClientTest { private ExternalComponentStatus callProbeAaiGetAllSubscribersAndAssertNotAvailable() { Mockito.when(aaiClientMock.probeAaiGetAllSubscribers()).thenCallRealMethod(); - ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers(); + ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers(); assertFalse(result.isAvailable()); return result; } @@ -227,7 +235,7 @@ public class AaiClientTest { when(aaiClientMock.getTenants(any(String.class), any(String.class))).thenCallRealMethod(); Response generalEmptyResponse = mock(Response.class); - when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(generalEmptyResponse); + when(aaiClientMock.doAaiGet(any(String.class), any(Boolean.class))).thenReturn(generalEmptyResponse); AaiResponse response = aaiClientMock.getTenants("subscriberId", "serviceType"); @@ -263,14 +271,14 @@ public class AaiClientTest { }); - when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(generalEmptyResponse); + when(aaiClientMock.doAaiGet(any(String.class), any(Boolean.class))).thenReturn(generalEmptyResponse); AaiResponse<GetTenantsResponse[]> response = aaiClientMock.getTenants("subscriberId", "serviceType"); - Assert.assertTrue(response.t.length> 0); + Assert.assertTrue(response.t.length > 0); } - final String tenantResponseRaw ="" + + final String tenantResponseRaw = "" + "{" + "\"service-type\": \"VIRTUAL USP\"," + "\"resource-version\": \"1494001841964\"," + @@ -301,7 +309,7 @@ public class AaiClientTest { @DataProvider public static Object[][] resourceTypesProvider() { - return new Object[][] { + return new Object[][]{ {"service-instance", ResourceType.SERVICE_INSTANCE}, {"generic-vnf", ResourceType.GENERIC_VNF}, {"vf-module", ResourceType.VF_MODULE} @@ -313,9 +321,9 @@ public class AaiClientTest { String link = "/aai/v12/business/customers/customer/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/service-subscriptions/service-subscription/Nimbus/service-instances/service-instance/7131d483-b450-406f-8e30-0c650645fc67"; String json = "{\"result-data\": [{" + - "\"resource-type\": \""+resourceType+"\"," + - "\"resource-link\": \""+ link+ "\"" + - "}]}"; + "\"resource-type\": \"" + resourceType + "\"," + + "\"resource-link\": \"" + link + "\"" + + "}]}"; AaiNodeQueryResponse nodeQueryResponse = new ObjectMapper().readValue(json, AaiNodeQueryResponse.class); assertThat(nodeQueryResponse.resultData.get(0).resourceLink, equalTo(link)); @@ -323,7 +331,7 @@ public class AaiClientTest { } @Test - public void aaiNodeQueryEmptyResponseDeserializationTest() throws IOException{ + public void aaiNodeQueryEmptyResponseDeserializationTest() throws IOException { String json = "{}"; AaiNodeQueryResponse nodeQueryResponse = new ObjectMapper().readValue(json, AaiNodeQueryResponse.class); assertNull(nodeQueryResponse.resultData); @@ -331,7 +339,7 @@ public class AaiClientTest { @DataProvider public static Object[][] nameAndResourceTypeProvider() { - return new Object[][] { + return new Object[][]{ {"SRIOV_SVC", ResourceType.SERVICE_INSTANCE, "search/nodes-query?search-node-type=service-instance&filter=service-instance-name:EQUALS:SRIOV_SVC"}, {"b1707vidnf", ResourceType.GENERIC_VNF, "search/nodes-query?search-node-type=generic-vnf&filter=vnf-name:EQUALS:b1707vidnf"}, {"connectivity_test", ResourceType.VF_MODULE, "search/nodes-query?search-node-type=vf-module&filter=vf-module-name:EQUALS:connectivity_test"}, @@ -460,6 +468,25 @@ public class AaiClientTest { assertFalse(propagateExceptions, "calling doAaiGet when propagateExceptions is 'true' must result with an exception (in this test)"); } + @Test + public void shouldProperlyReadResponseOnceWhenSubscribersAreNotPresent() { + AAIRestInterface restInterface = mock(AAIRestInterface.class); + PortDetailsTranslator portDetailsTranslator = mock(PortDetailsTranslator.class); + Response response = mock(Response.class); + when(response.getStatus()).thenReturn(404); + when(response.readEntity(String.class)).thenReturn("sampleEntity"); + when(response.getStatusInfo()).thenReturn(Response.Status.NOT_FOUND); + ResponseWithRequestInfo responseWithRequestInfo = new ResponseWithRequestInfo(response, "test", HttpMethod.GET); + when(restInterface.RestGet(eq("VidAaiController"), any(String.class), + eq("business/customers?subscriber-type=INFRA&depth=0"), eq(false), eq(true))).thenReturn(responseWithRequestInfo); + AaiClient aaiClient = new AaiClient(restInterface, portDetailsTranslator); + + + aaiClient.getAllSubscribers(true); + + verify(response).readEntity(String.class); + } + @FunctionalInterface public interface UncheckedBiConsumer<T, U> extends BiConsumer<T, U> { @Override diff --git a/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java index ca7a163a8..da9cdaa6e 100644 --- a/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java @@ -1,48 +1,101 @@ package org.onap.vid.controllers; +import org.apache.log4j.BasicConfigurator; +import org.junit.Before; import org.junit.Test; -import org.onap.vid.controllers.HealthCheckController; -import org.onap.vid.controllers.HealthCheckController.HealthStatus; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.vid.dao.FnAppDoaImpl; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import java.sql.SQLException; + +import static org.mockito.BDDMockito.given; +import static org.mockito.Matchers.anyString; +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; +import static org.springframework.http.HttpStatus.OK; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(MockitoJUnitRunner.class) public class HealthCheckControllerTest { - private HealthCheckController createTestSubject() { - return new HealthCheckController(); - } - - @Test - public void testGetProfileCount() throws Exception { - HealthCheckController testSubject; - String driver = ""; - String URL = ""; - String username = ""; - String password = ""; - int result; - - // default test - testSubject = createTestSubject(); - result = testSubject.getProfileCount(driver, URL, username, password); - } - - @Test - public void testGethealthCheckStatusforIDNS() throws Exception { - HealthCheckController testSubject; - HealthStatus result; - - // default test - testSubject = createTestSubject(); - result = testSubject.gethealthCheckStatusforIDNS(); - } - - @Test - public void testGetHealthCheck() throws Exception { - HealthCheckController testSubject; - String UserAgent = ""; - String ECOMPRequestID = ""; - HealthStatus result; - - // default test - testSubject = createTestSubject(); - result = testSubject.getHealthCheck(UserAgent, ECOMPRequestID); - } + private static final String ERROR_MESSAGE = "error message"; + private HealthCheckController testSubject; + private MockMvc mockMvc; + + @Mock + private FnAppDoaImpl fnAppDoa; + + @Before + public void setUp() { + testSubject = new HealthCheckController(fnAppDoa); + BasicConfigurator.configure(); + mockMvc = MockMvcBuilders.standaloneSetup(testSubject).build(); + } + + @Test + public void getHealthCheckStatusForIDNS_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception { + databaseConnectionEstablished(); + mockMvc.perform(get("/healthCheck") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(OK.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check succeeded")); + } + + @Test + public void getHealthCheckStatusForIDNS_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception { + databaseNotAccessible(); + mockMvc.perform(get("/healthCheck") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE)); + } + + @Test + public void getHealthCheck_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception { + databaseConnectionEstablished(); + mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(OK.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check succeeded")) + .andExpect(jsonPath("$.date").isString()); + } + + @Test + public void getHealthCheck_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception { + databaseNotAccessible(); + mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value())) + .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE)); + } + + @Test + public void getCommitInfo_shouldReturnCommitData_whenCorrectPropertiesFileExists() throws Exception { + mockMvc.perform(get("/commitInfo") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.commitId").value("123")) + .andExpect(jsonPath("$.commitMessageShort").value("Test short commit message")) + .andExpect(jsonPath("$.commitTime").value("1999-09-12T13:48:55+0200")); + } + + private void databaseConnectionEstablished() throws SQLException { + given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString())) + .willReturn(0); + } + + private void databaseNotAccessible() throws SQLException { + given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString())) + .willThrow(new SQLException(ERROR_MESSAGE)); + } }
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java index 80c65935e..7bdd6b863 100644 --- a/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java @@ -1,66 +1,340 @@ package org.onap.vid.controllers; -import javax.servlet.http.HttpServletRequest; +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright © 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; +import static org.mockito.BDDMockito.willThrow; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.times; +import static org.onap.vid.model.CategoryParameter.Family.PARAMETER_STANDARDIZATION; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.util.Collections; +import java.util.function.BiFunction; +import javax.ws.rs.ForbiddenException; +import org.apache.log4j.BasicConfigurator; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatcher; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.vid.category.AddCategoryOptionResponse; import org.onap.vid.category.AddCategoryOptionsRequest; import org.onap.vid.category.CategoryParameterOptionRep; +import org.onap.vid.category.CategoryParametersResponse; +import org.onap.vid.model.CategoryParameter; import org.onap.vid.model.CategoryParameterOption; -import org.springframework.http.ResponseEntity; +import org.onap.vid.services.CategoryParameterService; +import org.onap.vid.services.CategoryParameterServiceImpl; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +@RunWith(MockitoJUnitRunner.class) public class MaintenanceControllerTest { - private MaintenanceController createTestSubject() { - return new MaintenanceController(); + final private String MAINTENANCE_CATEGORY_PATH = "/maintenance/category_parameter"; + final private String CATEGORY_PARAMETER_PATH = MAINTENANCE_CATEGORY_PATH + "/{name}"; + final private String DELETE_CATEGORY_PATH = "/maintenance/delete_category_parameter/{name}"; + + @Mock + private CategoryParameterService service; + private MaintenanceController maintenanceController; + private MockMvc mockMvc; + private ObjectMapper objectMapper; + + @Before + public void setUp() { + maintenanceController = new MaintenanceController(service); + BasicConfigurator.configure(); + mockMvc = MockMvcBuilders.standaloneSetup(maintenanceController).build(); + objectMapper = new ObjectMapper(); + } + + @Test + public void addCategoryOptions_shouldReturnMultiStatus_whenErrorsExist() throws Exception { + String categoryName = "catName1"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("first option", "second option"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse( + ImmutableList.of("error one", "error two")); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willReturn(addCategoryOptionResponse); + + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isMultiStatus()) + .andExpect( + content().json(objectMapper + .writeValueAsString(addCategoryOptionResponse))); + } + + @Test + public void addCategoryOptions_shouldReturnOk_whenNoErrorsExist() throws Exception { + String categoryName = "catName2"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("first option", "second option", "third option"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList()); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willReturn(addCategoryOptionResponse); + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isOk()) + .andExpect(content().json( + objectMapper.writeValueAsString(addCategoryOptionResponse))); + } + + @Test + public void addCategoryOptions_shouldReturnNotFound_whenUnfoundedCategoryExceptionIsThrown() throws Exception { + String unfoundedMsg = "unfounded category exception message"; + String categoryName = "catName3"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("first option"); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg)); + + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isNotFound()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg))))); + } + + @Test + public void addCategoryOptions_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + String categoryName = "catName13"; + AddCategoryOptionsRequest req = new AddCategoryOptionsRequest(); + req.options = ImmutableList.of("option second", "first option"); + + given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req)))) + .willThrow(new RuntimeException()); + + prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(req)) + .andExpect(status().isInternalServerError()); + } + + @Test + public void updateNameForOption_shouldReturnMultiStatus_whenErrorsExist() throws Exception { + String categoryName = "catName4"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id1", "name1"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse( + ImmutableList.of("error one", "error two")); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willReturn(addCategoryOptionResponse); + + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isMultiStatus()) + .andExpect( + content().json(objectMapper + .writeValueAsString(addCategoryOptionResponse))); } @Test - public void testAddCategoryOptions() throws Exception { - MaintenanceController testSubject; - HttpServletRequest request = null; - String categoryName = ""; - AddCategoryOptionsRequest option = null; - ResponseEntity result; + public void updateNameForOption_shouldReturnOk_whenNoErrorsExist() throws Exception { + String categoryName = "catName5"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id2", "name2"); + AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList()); - // default test - testSubject = createTestSubject(); - result = testSubject.addCategoryOptions(request, categoryName, option); + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willReturn(addCategoryOptionResponse); + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isOk()) + .andExpect(content().json( + objectMapper.writeValueAsString(addCategoryOptionResponse))); } @Test - public void testUpdateNameForOption() throws Exception { - MaintenanceController testSubject; - HttpServletRequest request = null; - String categoryName = ""; - CategoryParameterOptionRep option = null; - ResponseEntity result; + public void updateNameForOption_shouldReturnForbidden_whenForbiddenExceptionIsThrown() throws Exception { + String categoryName = "catName6"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id3", "name3"); - // default test - testSubject = createTestSubject(); - result = testSubject.updateNameForOption(request, categoryName, option); + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new ForbiddenException()); + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isForbidden()) + .andExpect(content().json( + objectMapper + .writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of("HTTP 403 Forbidden"))))); } @Test - public void testGetCategoryParameter() throws Exception { - MaintenanceController testSubject; - HttpServletRequest request = null; - ResponseEntity result; + public void updateNameForOption_shouldReturnNotFound_whenUnfoundedIsThrown() throws Exception { + String unfoundedOptionMsg = "unfounded category option exception message"; + String categoryName = "catName7"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id4", "name4"); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryOptionException(unfoundedOptionMsg)); - // default test - testSubject = createTestSubject(); - result = testSubject.getCategoryParameter(request, null); + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isNotFound()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedOptionMsg))))); } @Test - public void testDeleteCategoryOption() throws Exception { - MaintenanceController testSubject; - HttpServletRequest request = null; - String categoryName = ""; - CategoryParameterOption option = null; - ResponseEntity result; - - // default test - testSubject = createTestSubject(); - result = testSubject.deleteCategoryOption(request, categoryName, option); + public void updateNameForOption_shouldReturnConflict_whenAlreadyExistOptionNameIsThrown() throws Exception { + String conflictMsg = "already exists option name exception message"; + String categoryName = "catName8"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id5", "name5"); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new CategoryParameterServiceImpl.AlreadyExistOptionNameException(conflictMsg)); + + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isConflict()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(conflictMsg))))); + } + + @Test + public void updateNameForOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + String categoryName = "catName18"; + CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id6", "name6"); + + given(service + .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep)))) + .willThrow(new RuntimeException()); + + prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOptionRep)) + .andExpect(status().isInternalServerError()); + } + + @Test + public void getCategoryParameter_shouldReturnExistingMap() throws Exception { + CategoryParametersResponse categoryParametersResponse = + new CategoryParametersResponse( + ImmutableMap.of( + "key1", ImmutableList.of( + new CategoryParameterOptionRep("testId", "testName")))); + + given(service.getCategoryParameters(PARAMETER_STANDARDIZATION)) + .willReturn(categoryParametersResponse); + + mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH) + .param("familyName", "PARAMETER_STANDARDIZATION") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(categoryParametersResponse))); + } + + @Test + public void getCategoryParameter_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + given(service.getCategoryParameters(PARAMETER_STANDARDIZATION)) + .willThrow(new RuntimeException()); + + mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH) + .param("familyName", "PARAMETER_STANDARDIZATION") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isInternalServerError()); + } + + @Test + public void deleteCategoryOption_shouldReturnOk_whenNoExceptionIsThrown() throws Exception { + String categoryName = "catName9"; + CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id1", "name1", + new CategoryParameter()); + + prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOption)) + .andExpect(status().isOk()); + + then(service).should(times(1)) + .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); + } + + @Test + public void deleteCategoryOption_shouldReturnNotFound_whenUnfoundedExceptionIsThrown() throws Exception { + String unfoundedMsg = "unfounded category exception message"; + String categoryName = "catName10"; + CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id2", "name2", + new CategoryParameter()); + + willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg)) + .given(service).deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); + + prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOption)) + .andExpect(status().isNotFound()) + .andExpect(content().json( + objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg))))); + } + + @Test + public void deleteCategoryOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception { + String categoryName = "catName19"; + CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id3", "name3", + new CategoryParameter()); + + willThrow(new RuntimeException()).given(service) + .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption))); + + prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName, + objectMapper.writeValueAsString(categoryParameterOption)) + .andExpect(status().isInternalServerError()); + } + + private <T> ArgumentMatcher<T> requestMatcher(T t) { + return new ArgumentMatcher<T>() { + @Override + public boolean matches(Object o) { + return t.equals(o); + } + }; + } + + private ResultActions prepareRequestExpectations( + BiFunction<String, String, MockHttpServletRequestBuilder> httpMethod, + String path, String name, String jsonContent) throws Exception { + return mockMvc.perform(httpMethod.apply(path, name) + .contentType(MediaType.APPLICATION_JSON) + .content(jsonContent)); } }
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java index 4e2d994e6..168d90090 100644 --- a/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java @@ -1,189 +1,210 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Modifications Copyright 2018 Nokia + * ================================================================================ + * 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.vid.controllers; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import net.javacrumbs.jsonunit.JsonAssert; -//import org.apache.commons.io.IOUtils; -//import org.onap.vid.asdc.AsdcCatalogException; -//import org.onap.vid.asdc.AsdcClient; -//import org.onap.vid.asdc.parser.ToscaParserImpl2; -//import org.onap.vid.model.*; -//import org.onap.portalsdk.core.util.SystemProperties; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.mock.web.MockServletContext; -//import org.springframework.test.context.ContextConfiguration; -//import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; -//import org.springframework.test.context.web.WebAppConfiguration; -//import org.testng.Assert; -//import org.testng.annotations.Test; -// -//import static org.onap.vid.testUtils.TestUtils.assertJsonStringEqualsIgnoreNulls; -// -//import java.io.IOException; -//import java.io.InputStream; -//import java.nio.file.Path; -//import java.util.Map; -//import java.util.UUID; -// -////import org.junit.Assert; -////import org.junit.Ignore; -////import org.junit.Test; -////import org.junit.runner.RunWith; -////import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -// -//@ContextConfiguration(classes = {LocalWebConfig.class, SystemProperties.class}) -////@RunWith(SpringJUnit4ClassRunner.class) -//@WebAppConfiguration -// -//public class VidControllerTest extends AbstractTestNGSpringContextTests { -// -// @Autowired -// MockServletContext context; -// @Autowired -// private AsdcClient asdcClient; -// private ToscaParserImpl2 p2 = new ToscaParserImpl2(); -// private ObjectMapper om = new ObjectMapper(); -// -// -// @Test -// public void assertEqualsBetweenServices() throws Exception { -// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -// Service expectedService = mockHelper.getNewServiceModel().getService(); -// Service actualService = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getService(); -// assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(expectedService), om.writeValueAsString(actualService)); -// } -// } -// -//// @Test -//// public void assertEqualBetweenObjects() throws Exception { -//// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -//// final Path csarPath = getCsarPath(mockHelper.getUuid()); -//// System.out.println("Comparing for csar " + csarPath); -//// ServiceModel actualServiceModel = p2.makeServiceModel(csarPath, getServiceByUuid(mockHelper.getUuid())); -//// assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(mockHelper.getNewServiceModel()), om.writeValueAsString(actualServiceModel)); -//// } -//// } -// -//// @Test -//// public void assertEqualsBetweenNetworkNodes() throws Exception { -//// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -//// Map<String, Network> expectedNetworksMap = mockHelper.getNewServiceModel().getNetworks(); -//// Map<String, Network> actualNetworksMap = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getNetworks(); -//// for (Map.Entry<String, Network> entry : expectedNetworksMap.entrySet()) { -//// Network expectedNetwork = entry.getValue(); -//// Network actualNetwork = actualNetworksMap.get(entry.getKey()); -//// Assert.assertEquals(expectedNetwork.getModelCustomizationName(), actualNetwork.getModelCustomizationName()); -//// verifyBaseNodeProperties(expectedNetwork, actualNetwork); -//// compareProperties(expectedNetwork.getProperties(), actualNetwork.getProperties()); -//// } -//// } -//// } -// -// //Because we are not supporting the old flow, the JSON are different by definition. -// @Test -// public void assertEqualsBetweenVnfsOfTosca() throws Exception { -// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -// Map<String, VNF> expectedVnfsMap = mockHelper.getNewServiceModel().getVnfs(); -// Map<String, VNF> actualVnfsMap = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVnfs(); -// for (Map.Entry<String, VNF> entry : expectedVnfsMap.entrySet()) { -// VNF expectedVnf = entry.getValue(); -// VNF actualVnf = actualVnfsMap.get(entry.getKey()); -// //need to uncomment these after 1806 merge -// //verifyBaseNodeProperties(expectedVnf, actualVnf); -// Assert.assertEquals(expectedVnf.getModelCustomizationName(), actualVnf.getModelCustomizationName()); -// //compareProperties(expectedVnf.getProperties(), actualVnf.getProperties()); -// //assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(expectedVnf), om.writeValueAsString(actualVnf)); -// } -// } -// } -// -// @Test -// public void assertEqualsBetweenVolumeGroups() throws Exception { -// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -// Map<String, VolumeGroup> actualVolumeGroups = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVolumeGroups(); -// Map<String, VolumeGroup> expectedVolumeGroups = mockHelper.getNewServiceModel().getVolumeGroups(); -// JsonAssert.assertJsonEquals(actualVolumeGroups, expectedVolumeGroups); -// } -// } -// -// @Test -// public void assertEqualsBetweenVfModules() throws Exception { -// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -// Map<String, VfModule> actualVfModules = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVfModules(); -// Map<String, VfModule> expectedVfModules = mockHelper.getNewServiceModel().getVfModules(); -// //need to uncomment after 1906 merge -// //JsonAssert.assertJsonEquals(actualVfModules, expectedVfModules); -// } -// } -// -// /*@Test -// public void assertEqualsBetweenPolicyConfigurationNodes() throws Exception { -// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -// Map<String, PortMirroringConfig> actualConfigurations = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getConfigurations(); -// Map<String, PortMirroringConfig> expectedConfigurations = mockHelper.getNewServiceModel().getConfigurations(); -// JsonAssert.assertJsonEquals(actualConfigurations, expectedConfigurations); -// } -// }*/ -// -// @Test -// public void assertEqualsBetweenServiceProxyNodes() throws Exception { -// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) { -// Map<String, ServiceProxy> actualServiceProxies = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getServiceProxies(); -// Map<String, ServiceProxy> expectedServiceProxies = mockHelper.getNewServiceModel().getServiceProxies(); -// JsonAssert.assertJsonEquals(actualServiceProxies, expectedServiceProxies); -// } -// } -// -// private void verifyBaseNodeProperties(Node expectedNode, Node actualNode) { -// Assert.assertEquals(expectedNode.getName(), actualNode.getName()); -// Assert.assertEquals(expectedNode.getCustomizationUuid(), actualNode.getCustomizationUuid()); -// Assert.assertEquals(expectedNode.getDescription(), actualNode.getDescription()); -// Assert.assertEquals(expectedNode.getInvariantUuid(), actualNode.getInvariantUuid()); -// Assert.assertEquals(expectedNode.getUuid(), actualNode.getUuid()); -// Assert.assertEquals(expectedNode.getVersion(), actualNode.getVersion()); -// } -// -// private void compareProperties(Map<String, String> expectedProperties, Map<String, String> actualProperties) { -// for (Map.Entry<String, String> property : expectedProperties.entrySet()) { -// String expectedValue = property.getValue(); -// String key = property.getKey(); -// String actualValue = actualProperties.get(key); -// Assert.assertEquals(expectedValue, actualValue); -// } -// } -// -// private ToscaParserMockHelper[] getExpectedServiceModel() throws IOException { -// ToscaParserMockHelper[] mockHelpers = { -// new ToscaParserMockHelper(Constants.vlUuid, Constants.vlFilePath), -// new ToscaParserMockHelper(Constants.vfUuid, Constants.vfFilePath), -// new ToscaParserMockHelper(Constants.configurationUuid, Constants.configurationFilePath), -// }; -// for (ToscaParserMockHelper mockHelper : mockHelpers) { -// InputStream jsonFile = VidControllerTest.class.getClassLoader().getResourceAsStream(mockHelper.getFilePath()); -// String expectedJsonAsString = IOUtils.toString(jsonFile); -// NewServiceModel newServiceModel1 = om.readValue(expectedJsonAsString, NewServiceModel.class); -// mockHelper.setNewServiceModel(newServiceModel1); -// } -// return mockHelpers; -// } -// -// private Path getCsarPath(String uuid) throws AsdcCatalogException { -// return asdcClient.getServiceToscaModel(UUID.fromString(uuid)); -// } -// -// private org.onap.vid.asdc.beans.Service getServiceByUuid(String uuid) throws AsdcCatalogException { -// return asdcClient.getService(UUID.fromString(uuid)); -// } -// -// public class Constants { -// public static final String configurationUuid = "ee6d61be-4841-4f98-8f23-5de9da846ca7"; -// public static final String configurationFilePath = "policy-configuration-csar.JSON"; -// static final String vfUuid = "48a52540-8772-4368-9cdb-1f124ea5c931"; -// static final String vlUuid = "cb49608f-5a24-4789-b0f7-2595473cb997"; -// // public static final String PNFUuid = "68101369-6f08-4e99-9a28-fa6327d344f3"; -// static final String vfFilePath = "vf-csar.JSON"; -// static final String vlFilePath = "vl-csar.JSON"; -//// public static final String PNFFilePath = "/Users/Oren/Git/Att/vid_internal/vid-app-common/src/main/resources/pnf.csar"; -// -// } -// -//}
\ No newline at end of file + +import static java.util.stream.Collectors.toMap; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.Matchers.not; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; +import static org.mockito.Mockito.times; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.IntStream; +import javax.ws.rs.core.MediaType; +import org.apache.log4j.BasicConfigurator; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.onap.vid.asdc.AsdcCatalogException; +import org.onap.vid.asdc.beans.SecureServices; +import org.onap.vid.asdc.beans.Service; +import org.onap.vid.asdc.beans.ServiceBuilder; +import org.onap.vid.model.CR; +import org.onap.vid.model.Network; +import org.onap.vid.model.Node; +import org.onap.vid.model.PombaInstance.PombaRequest; +import org.onap.vid.model.PombaInstance.ServiceInstance; +import org.onap.vid.model.ServiceModel; +import org.onap.vid.model.ServiceProxy; +import org.onap.vid.model.VNF; +import org.onap.vid.model.VfModule; +import org.onap.vid.model.VolumeGroup; +import org.onap.vid.roles.RoleProvider; +import org.onap.vid.services.AaiService; +import org.onap.vid.services.PombaService; +import org.onap.vid.services.VidService; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +@RunWith(MockitoJUnitRunner.class) +public class VidControllerTest { + + public static final String REST_MODELS_SERVICES = "/rest/models/services"; + public static final String REST_MODELS_SERVICES_UUID = "/rest/models/services/{uuid}"; + public static final String REST_MODELS_RESET = "/rest/models/reset"; + public static final String REST_MODELS_SERVICES_VERIFY_SERVICE = "/rest/models/services/verifyService"; + @Mock + private VidService vidService; + @Mock + private AaiService aaiService; + @Mock + private RoleProvider roleProvider; + @Mock + private PombaService pombaService; + + private VidController vidController; + private MockMvc mockMvc; + private ObjectMapper objectMapper; + + private String uuid1; + private String uuid2; + private String uuid3; + + @Before + public void setUp() { + vidController = new VidController(vidService, aaiService, roleProvider, pombaService); + BasicConfigurator.configure(); + mockMvc = MockMvcBuilders.standaloneSetup(vidController).build(); + objectMapper = new ObjectMapper(); + + uuid1 = UUID.randomUUID().toString(); + uuid2 = UUID.randomUUID().toString(); + uuid3 = UUID.randomUUID().toString(); + } + + @Test + public void getServices_shouldReturnService_whenServiceExists() throws Exception { + List<Service> services = ImmutableList.of(createService(uuid1, 1), createService(uuid2, 2), createService(uuid3, 3)); + + given(aaiService.getServicesByDistributionStatus()).willReturn(services); + + SecureServices secureServices = new SecureServices(); + secureServices.setServices(services); + secureServices.setReadOnly(false); + + mockMvc.perform(get(REST_MODELS_SERVICES) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(secureServices))); + } + + @Test + public void getService_shouldReturnService_whenNoExceptionIsThrown() throws Exception { + ServiceModel model = expectedServiceModel(uuid1); + + given(vidService.getService(uuid1)).willReturn(model); + + mockMvc.perform(get(REST_MODELS_SERVICES_UUID, uuid1) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(model))); + } + + @Test + public void getService_shouldThrow_whenAsdcCatalogExceptionIsThrown() throws Exception { + String testUuid = UUID.randomUUID().toString(); + + given(vidService.getService(testUuid)).willThrow(new AsdcCatalogException("error msg")); + + mockMvc.perform(get(REST_MODELS_SERVICES_UUID, testUuid) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isServiceUnavailable()); + } + + @Test + public void invalidateServiceModelCache_shouldReturnAccepted() throws Exception { + mockMvc.perform(post(REST_MODELS_RESET) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isAccepted()); + + then(vidService).should(times(1)).invalidateServiceCache(); + } + + @Test + public void verifyServiceInstance_shouldReturnOk() throws Exception { + PombaRequest pombaRequest = new PombaRequest(); + pombaRequest.serviceInstanceList = ImmutableList.of(new ServiceInstance()); + + mockMvc.perform(post(REST_MODELS_SERVICES_VERIFY_SERVICE) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(pombaRequest))) + .andExpect(status().isOk()); + + ArgumentCaptor<PombaRequest> argumentCaptor = ArgumentCaptor.forClass(PombaRequest.class); + then(pombaService).should(times(1)).verify(argumentCaptor.capture()); + + assertThat(pombaRequest).isEqualToComparingFieldByFieldRecursively(argumentCaptor.getValue()); + } + + private ServiceModel expectedServiceModel(String uuid) { + final ServiceModel serviceModel = getModelsByUuid().get(uuid); + Assert.assertThat(serviceModel, is(not(nullValue()))); + return serviceModel; + } + + private Service createService(String uuid, int i) { + return new ServiceBuilder().setUuid(uuid).setInvariantUUID("invariantUUID" + i) + .setCategory("category" + i).setVersion("version" + i).setName("name" + i) + .setDistributionStatus("distStatus" + i).setToscaModelURL("toscaModelUrl" + i).build(); + } + + private ServiceModel createServiceModel(int i) { + ServiceModel model = new ServiceModel(); + + model.setCollectionResource(ImmutableMap.of("resKey" + i, new CR())); + model.setNetworks(ImmutableMap.of("network" + i, new Network())); + model.setPnfs(ImmutableMap.of("pnf" + i, new Node())); + model.setServiceProxies(ImmutableMap.of("servProxy" + i, new ServiceProxy())); + model.setVfModules(ImmutableMap.of("vfmod" + i, new VfModule())); + model.setVnfs(ImmutableMap.of("vnf" + i, new VNF())); + model.setVolumeGroups(ImmutableMap.of("volgroup" + i, new VolumeGroup())); + model.setService(new org.onap.vid.model.Service()); + return model; + } + + private Map<String, ServiceModel> getModelsByUuid() { + ServiceModel serviceModel1 = createServiceModel(1); + ServiceModel serviceModel2 = createServiceModel(2); + ServiceModel serviceModel3 = createServiceModel(3); + + List<ServiceModel> pseudoServiceModels = ImmutableList.of(serviceModel1, serviceModel2, serviceModel3); + List<String> uuids = ImmutableList.of(uuid1, uuid2, uuid3); + return IntStream.range(0, pseudoServiceModels.size()).boxed() + .collect(toMap(i -> uuids.get(i), i -> pseudoServiceModels.get(i))); + } +}
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java b/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java index e7a7e3a37..2c2aa89a0 100644 --- a/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java @@ -3,95 +3,67 @@ package org.onap.vid.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.SQLException; -import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Java6Assertions.assertThatThrownBy; +import static org.mockito.BDDMockito.given; +import static org.mockito.Matchers.anyString; + +@RunWith(MockitoJUnitRunner.class) public class FnAppDoaImplTest { - private FnAppDoaImpl createTestSubject() { - return new FnAppDoaImpl(); - } + private FnAppDoaImpl fnAppDoa; - @Test - public void testGetConnection() throws Exception { - String driver2 = ""; - String url = ""; - String username = ""; - String password = ""; - Connection result; - - // test 1 - url = null; - username = null; - password = null; - result = FnAppDoaImpl.getConnection(driver2, url, username); - Assert.assertEquals(null, result); - - // test 2 - url = ""; - username = null; - password = null; - result = FnAppDoaImpl.getConnection(driver2, url, username); - Assert.assertEquals(null, result); - - // test 3 - username = null; - url = null; - password = null; - result = FnAppDoaImpl.getConnection(driver2, url, username); - Assert.assertEquals(null, result); - - // test 4 - username = ""; - url = null; - password = null; - result = FnAppDoaImpl.getConnection(driver2, url, username); - Assert.assertEquals(null, result); - - // test 5 - password = null; - url = null; - username = null; - result = FnAppDoaImpl.getConnection(driver2, url, username); - Assert.assertEquals(null, result); - - // test 6 - password = ""; - url = null; - username = null; - result = FnAppDoaImpl.getConnection(driver2, url, username); - Assert.assertEquals(null, result); + @Mock + private ConnectionFactory connectionFactory; + + @Mock + private Connection connection; + + @Mock + private PreparedStatement preparedStatement; + + @Mock + private ResultSet resultSet; + + private static final String ERROR_MESSAGE = "error message"; + private static final String QUERY = "select count(*) from fn_app"; + + @Before + public void setUp() throws SQLException { + given(resultSet.next()).willReturn(true); + given(resultSet.getInt(1)).willReturn(5); + given(preparedStatement.executeQuery()).willReturn(resultSet); + given(connectionFactory.getConnection(anyString(), anyString(), anyString())).willReturn(connection); + fnAppDoa = new FnAppDoaImpl(connectionFactory); } - @Test - public void testCleanup() throws Exception { - ResultSet rs = null; - PreparedStatement st = null; + private void okCaseSetUp() throws SQLException { - // test 1 - rs = null; - FnAppDoaImpl.cleanup(rs, st, null); + given(connection.prepareStatement(QUERY)).willReturn(preparedStatement); + } - // test 2 - st = null; - FnAppDoaImpl.cleanup(rs, st, null); + private void nokCaseSetup() throws SQLException { + given(connection.prepareStatement(QUERY)).willThrow(new SQLException(ERROR_MESSAGE)); + } - // test 3 - FnAppDoaImpl.cleanup(rs, st, null); + @Test + public void getProfileCount_shouldReturnNumber_whenNoExceptionIsThrown() throws SQLException { + okCaseSetUp(); + assertThat(fnAppDoa.getProfileCount("anyUrl", "anyUsername", "anyPassword")).isEqualTo(5); } @Test - public void testGetProfileCount() throws Exception { - FnAppDoaImpl testSubject; - String driver = ""; - String URL = ""; - String username = ""; - String password = ""; - int result; - - // default test - testSubject = createTestSubject(); - result = testSubject.getProfileCount(driver, URL, username, password); + public void getProfileCount_shouldRethrowSQLException() throws SQLException { + nokCaseSetup(); + assertThatThrownBy(() -> fnAppDoa.getProfileCount("anyUrl", "anyUsername", "anyPassword")) + .isInstanceOf(SQLException.class).hasMessage(ERROR_MESSAGE); } }
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java b/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java new file mode 100644 index 000000000..bc623928c --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java @@ -0,0 +1,143 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.job.command; + + +import io.joshworks.restclient.http.HttpResponse; +import org.mockito.Mock; +import org.onap.vid.job.Job; +import org.onap.vid.job.NextCommand; +import org.onap.vid.mso.MsoInterface; +import org.onap.vid.mso.rest.AsyncRequestStatus; +import org.onap.vid.services.AsyncInstantiationBusinessLogic; +import org.onap.vid.services.AuditService; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import javax.ws.rs.ProcessingException; +import java.util.UUID; + + +import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class InProgressStatusCommandTest { + + @Mock + private AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic; + + @Mock + private MsoInterface msoInterface; + + @Mock + private AuditService auditService; + + @Mock + private HttpResponse<AsyncRequestStatus> msoResponse; + + @Mock + private AsyncRequestStatus asyncRequestStatus; + + @Mock + private AsyncRequestStatus.Request request; + + private UUID uuid = UUID.randomUUID(); + + private InProgressStatusCommand inProgressStatusCommand; + + @BeforeMethod + public void setUp() { + initMocks(this); + + inProgressStatusCommand = new InProgressStatusCommand(asyncInstantiationBusinessLogic, msoInterface, auditService, uuid, "sampleRequestId"); + + when(asyncInstantiationBusinessLogic.getOrchestrationRequestsPath()).thenReturn("http://localhost:8080/samplePath"); + when(msoInterface.get("http://localhost:8080/samplePath/sampleRequestId", AsyncRequestStatus.class)).thenReturn(msoResponse); + when(msoResponse.getBody()).thenReturn(asyncRequestStatus); + } + + + @Test + public void whenSOReturnsErrorShouldSetProperFailureStateAndReturnRetryCommand() { + when(msoResponse.getStatus()).thenReturn(500); + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS); + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + + verify(auditService).setFailedAuditStatusFromMso(uuid, "sampleRequestId", 500, asyncRequestStatus.toString()); + } + + @Test + public void shouldProperlyHandleFailedInstantiation() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenReturn(Job.JobStatus.FAILED); + asyncRequestStatus.request = request; + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.FAILED); + + verify(asyncInstantiationBusinessLogic).handleFailedInstantiation(uuid); + verify(asyncInstantiationBusinessLogic).auditMsoStatus(uuid, request); + } + + @Test + public void shouldRetryCommandWithPausedState() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenReturn(Job.JobStatus.PAUSE); + asyncRequestStatus.request = request; + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS); + + verify(asyncInstantiationBusinessLogic).auditMsoStatus(uuid, request); + verify(asyncInstantiationBusinessLogic).updateServiceInfoAndAuditStatus(uuid, Job.JobStatus.PAUSE); + } + + @Test + public void shouldRetryCommandExitedWithProcessingException() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenThrow(new ProcessingException("")); + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS); + } + + @Test + public void shouldSetStoppedStatusWhenRuntimeExceptionOccurs() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenThrow(new RuntimeException()); + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.STOPPED); + } +}
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java b/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java new file mode 100644 index 000000000..e7ab4f098 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java @@ -0,0 +1,157 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.job.command; + + +import io.joshworks.restclient.http.HttpResponse; +import org.mockito.Mock; +import org.onap.vid.aai.AaiResponse; +import org.onap.vid.aai.exceptions.InvalidAAIResponseException; +import org.onap.vid.changeManagement.RequestDetailsWrapper; +import org.onap.vid.domain.mso.RequestReferences; +import org.onap.vid.exceptions.MaxRetriesException; +import org.onap.vid.job.Job; +import org.onap.vid.job.NextCommand; +import org.onap.vid.model.RequestReferencesContainer; +import org.onap.vid.model.serviceInstantiation.ServiceInstantiation; +import org.onap.vid.mso.MsoInterface; +import org.onap.vid.mso.model.ServiceInstantiationRequestDetails; +import org.onap.vid.services.AsyncInstantiationBusinessLogic; +import org.onap.vid.services.AuditService; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class ServiceInstantiationCommandTest { + @Mock + private AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic; + + @Mock + private MsoInterface msoInterface; + + @Mock + private AuditService auditService; + + @Mock + private ServiceInstantiation serviceInstantiation; + + @Mock + private HttpResponse<RequestReferencesContainer> msoResponse; + + @Mock + private RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper; + + @Mock + private AaiResponse aaiResponse; + + @Mock + private RequestReferencesContainer requestReferencesContainer; + + + private UUID uuid = UUID.randomUUID(); + + + private ServiceInstantiationCommand serviceInstantiationCommand; + + @BeforeMethod + public void setUp() { + initMocks(this); + serviceInstantiationCommand = new ServiceInstantiationCommand(asyncInstantiationBusinessLogic, auditService, msoInterface, uuid, serviceInstantiation, "sampleUserId"); + } + + + @Test + public void shouldProperlyHandleMaxRetriesException() { + when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenThrow(new MaxRetriesException("", 2)); + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), is(nullValue())); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.FAILED))); + + verify(asyncInstantiationBusinessLogic).handleFailedInstantiation(uuid); + } + + @Test + public void shouldProperlyHandleInvalidAAIResponseException() { + doThrow(new InvalidAAIResponseException(aaiResponse)).when(asyncInstantiationBusinessLogic).generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId"); + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), is(serviceInstantiationCommand)); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.IN_PROGRESS))); + } + + + @Test + public void shouldProperlyHandleInvalidSOResponse() { + when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenReturn(requestDetailsWrapper); + when(asyncInstantiationBusinessLogic.getServiceInstantiationPath(serviceInstantiation)).thenReturn("samplePath"); + when(msoInterface.post("samplePath", requestDetailsWrapper, RequestReferencesContainer.class)).thenReturn(msoResponse); + when(msoResponse.getStatus()).thenReturn(500); + when(msoResponse.getBody()).thenReturn(requestReferencesContainer); + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), is(nullValue())); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.FAILED))); + + verify(auditService).setFailedAuditStatusFromMso(uuid, null, 500, requestReferencesContainer.toString()); + } + + + @Test + public void shouldProperlyUpdateServiceStatusAndReturnInProgressCommand() { + RequestReferences requestReferences = createRequestReferences(); + + when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenReturn(requestDetailsWrapper); + when(asyncInstantiationBusinessLogic.getServiceInstantiationPath(serviceInstantiation)).thenReturn("samplePath"); + when(msoInterface.post("samplePath", requestDetailsWrapper, RequestReferencesContainer.class)).thenReturn(msoResponse); + when(msoResponse.getStatus()).thenReturn(200); + when(msoResponse.getBody()).thenReturn(requestReferencesContainer); + when(requestReferencesContainer.getRequestReferences()).thenReturn(requestReferences); + + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), instanceOf(InProgressStatusCommand.class)); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.IN_PROGRESS))); + + } + + private RequestReferences createRequestReferences() { + RequestReferences requestReferences = new RequestReferences(); + requestReferences.setInstanceId("sampleInstanceId"); + requestReferences.setRequestId("sampleRequestId"); + return requestReferences; + } +}
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java new file mode 100644 index 000000000..dc2eafc9b --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.job.impl; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.mockito.Mock; +import org.onap.vid.job.Job; +import org.onap.vid.job.JobAdapter; +import org.onap.vid.job.JobType; +import org.onap.vid.model.JobBulk; +import org.onap.vid.model.JobModel; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class JobAdapterImplTest { + + + private static final int SAMPLE_INDEX = 10; + private static final String SAMPLE_USER_ID = "sampleUserId"; + + @Mock + private Job job; + + @Mock + private JobAdapter.AsyncJobRequest asyncJobRequest; + + private UUID sampleUuid=UUID.randomUUID(); + + private JobAdapterImpl jobAdapter = new JobAdapterImpl(); + + @BeforeMethod + public void setUp() { + initMocks(this); + + when(job.getUuid()).thenReturn(sampleUuid); + when(job.getStatus()).thenReturn(Job.JobStatus.IN_PROGRESS); + when(job.getTemplateId()).thenReturn(sampleUuid); + } + + @Test + public void shouldConvertJobToJobModel() { + + + JobModel convertedJob = jobAdapter.toModel(job); + + assertThat(convertedJob.getUuid()).isEqualByComparingTo(sampleUuid); + assertThat(convertedJob.getStatus()).isEqualByComparingTo(Job.JobStatus.IN_PROGRESS); + assertThat(convertedJob.getTemplateId()).isEqualByComparingTo(sampleUuid); + } + + + @Test + public void shouldProperlyCreateJob() { + UUID uuid = UUID.randomUUID(); + + Job createdJob = jobAdapter.createJob(JobType.ServiceInstantiation, asyncJobRequest, uuid, SAMPLE_USER_ID, SAMPLE_INDEX); + + assertThat(createdJob.getStatus()).isEqualByComparingTo(Job.JobStatus.PENDING); + assertThat(createdJob.getTemplateId()).isEqualByComparingTo(uuid); + assertThat(createdJob.getType()).isEqualByComparingTo(JobType.ServiceInstantiation); + assertThat(createdJob.getData()).isEqualTo(ImmutableMap.of("request", asyncJobRequest, "userId", SAMPLE_USER_ID)); + } + + @Test + public void shouldProperlyCreateBulkOfJobs(){ + List<Job> bulkOfJobs = jobAdapter.createBulkOfJobs(ImmutableMap.of("count", 5, "type", JobType.InProgressStatus.name())); + + + assertThat(bulkOfJobs).hasSize(5); + + Stream<Job> jobStream = bulkOfJobs.stream().filter(x -> JobType.InProgressStatus.equals(x.getType()) && Job.JobStatus.PENDING.equals(x.getStatus())); + + assertThat(jobStream).hasSize(5); + } + + + @Test + public void shouldConvertListToBulkJob(){ + JobBulk jobBulk = jobAdapter.toModelBulk(ImmutableList.of(job, job)); + + assertThat(jobBulk.getJobs()).hasSize(2); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java new file mode 100644 index 000000000..93afd1709 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java @@ -0,0 +1,121 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.job.impl; + + +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.onap.vid.job.JobsBrokerService; +import org.onap.vid.job.command.JobCommandFactory; +import org.onap.vid.properties.Features; +import org.quartz.JobDetail; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.togglz.core.manager.FeatureManager; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class JobSchedulerInitializerTest { + + @Mock + private JobsBrokerService brokerService; + + @Mock + private SchedulerFactoryBean schedulerFactoryBean; + + @Mock + private FeatureManager featureManager; + + @Mock + private JobCommandFactory commandFactory; + + @Mock + private Scheduler scheduler; + + @InjectMocks + private JobSchedulerInitializer jobSchedulerInitializer; + + @BeforeMethod + public void setUp() { + initMocks(this); + } + + + @Test + public void shouldNotInitializeSchedulerWhenAsyncJobsAreDisabled() { + when(featureManager.isActive(Features.FLAG_ASYNC_JOBS)).thenReturn(false); + + jobSchedulerInitializer.init(); + + verifyZeroInteractions(schedulerFactoryBean); + } + + + @Test + public void shouldInitializeSchedulerWhenAsyncJobsAreEnabled() throws SchedulerException { + ArgumentCaptor<JobDetail> jobDetailArgumentCaptor = ArgumentCaptor.forClass(JobDetail.class); + ArgumentCaptor<Trigger> triggerArgumentCaptor = ArgumentCaptor.forClass(Trigger.class); + when(featureManager.isActive(Features.FLAG_ASYNC_JOBS)).thenReturn(true); + when(schedulerFactoryBean.getScheduler()).thenReturn(scheduler); + + jobSchedulerInitializer.init(); + + verify(scheduler, times(2)).scheduleJob(jobDetailArgumentCaptor.capture(), triggerArgumentCaptor.capture()); + + List<Object> topics = extractTopics(jobDetailArgumentCaptor); + + List<String> descriptions = extractDescription(triggerArgumentCaptor); + + assertThat(topics, containsInAnyOrder(org.onap.vid.job.Job.JobStatus.IN_PROGRESS, org.onap.vid.job.Job.JobStatus.PENDING)); + assertThat(descriptions, containsInAnyOrder("Trigger to run async worker for PENDING", "Trigger to run async worker for IN_PROGRESS")); + } + + private List<Object> extractTopics(ArgumentCaptor<JobDetail> jobDetailArgumentCaptor) { + return jobDetailArgumentCaptor + .getAllValues() + .stream() + .map(JobDetail::getJobDataMap) + .map(x -> x.get("topic")) + .collect(Collectors.toList()); + } + + private List<String> extractDescription(ArgumentCaptor<Trigger> triggerArgumentCaptor) { + return triggerArgumentCaptor + .getAllValues() + .stream() + .map(Trigger::getDescription) + .collect(Collectors.toList()); + } +}
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java index 36f4bdd43..461673224 100644 --- a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java @@ -1,153 +1,306 @@ +/* + * ============LICENSE_START========================================== + * =================================================================== + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * =================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + * + * + */ package org.onap.vid.mso; -import org.mockito.InjectMocks; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.junit.Assert.assertEquals; +import static org.mockito.BDDMockito.given; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.argThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.mock; +import static org.onap.vid.mso.MsoBusinessLogicImpl.validateEndpointPath; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatcher; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.onap.portalsdk.core.util.SystemProperties; +import org.onap.vid.exceptions.GenericUncheckedException; +import org.onap.vid.mso.rest.Request; import org.onap.vid.mso.rest.RequestDetails; +import org.onap.vid.mso.rest.RequestDetailsWrapper; import org.onap.vid.properties.Features; -import org.onap.portalsdk.core.util.SystemProperties; +import org.springframework.http.HttpStatus; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; -import org.springframework.test.context.web.WebAppConfiguration; -import org.testng.Assert; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.togglz.core.manager.FeatureManager; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.onap.vid.controllers.MsoController.SVC_INSTANCE_ID; -import static org.onap.vid.controllers.MsoController.VNF_INSTANCE_ID; -import static org.onap.vid.mso.MsoBusinessLogicImpl.validateEndpointPath; - @ContextConfiguration(classes = {SystemProperties.class}) -@WebAppConfiguration -public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests { +@RunWith(SpringJUnit4ClassRunner.class) +public class MsoBusinessLogicImplTest { - @InjectMocks - private MsoBusinessLogicImpl msoBusinessLogic; + private static final ObjectMapper objectMapper = new ObjectMapper(); @Mock - private FeatureManager featureManagerMock; + private FeatureManager featureManager; @Mock - private MsoInterface msoInterfaceMock; + private MsoInterface msoInterface; + private MsoBusinessLogicImpl msoBusinessLogic; - @BeforeTest - public void initMocks(){ + @Before + public void setUp() { MockitoAnnotations.initMocks(this); + msoBusinessLogic = new MsoBusinessLogicImpl(msoInterface, featureManager); } @Test - public void validateEndpointPath_endPointIsNotEmptyAndVaild_returnProperty(){ - System.setProperty("TestEnv","123"); - String foundEndPoint = validateEndpointPath("TestEnv"); - Assert.assertEquals("123",foundEndPoint); - } + public void createConfigurationInstance_shouldCallMsoInterface_withCorrectServiceInstanceId() throws Exception { + // given + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String endpointTemplate = String.format("/serviceInstances/v6/%s/configurations", serviceInstanceId); + RequestDetailsWrapper requestDetailsWrapper = createRequestDetails("mso_request_create_configuration.json"); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.createConfigurationInstance(requestDetailsWrapper, endpointTemplate)) + .willReturn(expectedResponse); - @Test(expectedExceptions = RuntimeException.class) - public void validateEndpointPath_endPointIsNull_throwRuntimeException(){ - validateEndpointPath("NotExists"); - } + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .createConfigurationInstance(requestDetailsWrapper, serviceInstanceId); - @Test(expectedExceptions = RuntimeException.class) - public void validateEndpointPath_endPointIsNotEmptyButDoesntExists_throwRuntimeException(){ - System.setProperty("EmptyEndPoint",""); - validateEndpointPath("EmptyEndPoint"); + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } + private RequestDetailsWrapper createRequestDetails(String bodyFileName) throws Exception { + final URL resource = this.getClass().getResource("/payload_jsons/" + bodyFileName); + RequestDetails requestDetails = objectMapper.readValue(resource, RequestDetails.class); + return new RequestDetailsWrapper(requestDetails); + } - //@Test(dataProvider = "unAssignOrDeleteParams") - public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOffOrUnAssignFlagIsFalse(boolean isAssignFlag,String status) { - Mockito.reset(msoInterfaceMock); - String endpoint = validateEndpointPath(isAssignFlag ? MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE : MsoProperties.MSO_REST_API_SVC_INSTANCE); - RequestDetails requestDetails = new RequestDetails(); - - when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(isAssignFlag); - - msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status); + @Test + public void validateEndpointPath_endPointIsNotEmptyAndVaild_returnProperty() { + System.setProperty("TestEnv", "123"); + String foundEndPoint = validateEndpointPath("TestEnv"); + assertEquals("123", foundEndPoint); + } - verify(msoInterfaceMock).deleteSvcInstance(requestDetails, endpoint + "/tempId"); + @Test + public void validateEndpointPath_endPointIsNull_throwRuntimeException() { + assertThatExceptionOfType(RuntimeException.class) + .isThrownBy(() -> validateEndpointPath("NotExists")); } - @DataProvider - public Object[][] unAssignOrDeleteParams() { - return new Object[][]{ - {Boolean.FALSE, "active"}, - {Boolean.FALSE, "created"}, - {Boolean.TRUE, "Active"}, - {Boolean.TRUE, "unexpected-status"}, - }; + @Test + public void validateEndpointPath_endPointIsNotEmptyButDoesntExists_throwRuntimeException() { + String endPoint = "EmptyEndPoint"; + System.setProperty(endPoint, ""); + assertThatExceptionOfType(GenericUncheckedException.class) + .isThrownBy(() -> validateEndpointPath(endPoint)) + .withMessage(endPoint + " env variable is not defined"); } - //@Test(dataProvider = "unAssignStatus") - public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOnAndUnAssignFlagIsTrue(String status) { - Mockito.reset(msoInterfaceMock); - // in the test Features.FLAG_UNASSIGN_SERVICE is active so the endpoint should be MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE - String endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE); + @Test + public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOffOrUnAssignFlagIsFalse() { + // given + String endpointTemplate = "/serviceInstances/v5/%s"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String svcEndpoint = String.format(endpointTemplate, serviceInstanceId); RequestDetails requestDetails = new RequestDetails(); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.deleteSvcInstance(requestDetails, svcEndpoint)).willReturn(expectedResponse); + given(featureManager.isActive(Features.FLAG_UNASSIGN_SERVICE)).willReturn(false); - when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(true); + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteSvcInstance(requestDetails, serviceInstanceId, "unAssignOrDeleteParams"); - msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status); - - verify(msoInterfaceMock).unassignSvcInstance(requestDetails, endpoint + "/tempId/unassign"); + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } - @DataProvider - public Object[][] unAssignStatus() { - return new Object[][]{ - {"Created"}, - {"Pendingdelete"}, - {"pending-Delete"}, - {"Assigned"} - }; + @Test + public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOnAndUnAssignFlagIsTrue() { + // given + String endpointTemplate = "/serviceInstantiation/v5/serviceInstances/%s/unassign"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String svcEndpoint = String.format(endpointTemplate, serviceInstanceId); + RequestDetails requestDetails = new RequestDetails(); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.unassignSvcInstance(requestDetails, svcEndpoint)).willReturn(expectedResponse); + given(featureManager.isActive(Features.FLAG_UNASSIGN_SERVICE)).willReturn(true); + + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteSvcInstance(requestDetails, serviceInstanceId, "assigned"); + + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } @Test public void deleteVnf_verifyEndPointPathConstructing() { - String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE); + // when + String endpointTemplate = "/serviceInstances/v5/%s/vnfs/%s"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String vnfInstanceId = "testVnfInstanceTempId"; + String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId); RequestDetails requestDetails = new RequestDetails(); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.deleteVnf(requestDetails, vnfEndpoint)).willReturn(expectedResponse); - String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId"); + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteVnf(requestDetails, serviceInstanceId, vnfInstanceId); - msoBusinessLogic.deleteVnf(requestDetails, "serviceInstanceTempId","vnfInstanceTempId"); - verify(msoInterfaceMock).deleteVnf(requestDetails, vnf_endpoint + "/vnfInstanceTempId"); + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); } @Test public void deleteVfModule_verifyEndPointPathConstructing() { - String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); + // when + String endpointTemplate = "/serviceInstances/v7/%s/vnfs/%s/vfModules/%s"; + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String vnfInstanceId = "testVnfInstanceTempId"; + String vfModuleId = "testVfModuleId"; + String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId, vfModuleId); RequestDetails requestDetails = new RequestDetails(); + MsoResponseWrapper expectedResponse = createOkResponse(); + given(msoInterface.deleteVfModule(requestDetails, vnfEndpoint)).willReturn(expectedResponse); + + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .deleteVfModule(requestDetails, serviceInstanceId, vnfInstanceId, vfModuleId); + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse); + } + + @Test + public void shouldSendProperScaleOutRequest() throws IOException { + // given + String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; + String vnfInstanceId = "testVnfInstanceTempId"; + String endpointTemplate = "/serviceInstantiation/v7/serviceInstances/%s/vnfs/%s/vfModules/scaleOut"; + String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId); + org.onap.vid.changeManagement.RequestDetails requestDetails = readRequest( + "scaleOutVfModulePayload.json"); + org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest = readExpectedRequest( + "scaleOutVfModulePayloadToMso.json"); + MsoResponseWrapper expectedMsoResponseWrapper = createOkResponse(); + given( + msoInterface + .scaleOutVFModuleInstance(argThat(new MsoRequestWrapperMatcher(expectedRequest)), + eq(vnfEndpoint))) + .willReturn(expectedMsoResponseWrapper); + + // when + MsoResponseWrapper msoResponseWrapper = msoBusinessLogic + .scaleOutVfModuleInstance(requestDetails, serviceInstanceId, vnfInstanceId); + + // then + assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedMsoResponseWrapper); + } - String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId").replaceFirst(VNF_INSTANCE_ID, "vnfInstanceTempId"); + private org.onap.vid.changeManagement.RequestDetails readRequest(String requestJsonFilename) throws IOException { + Path path = Paths.get("payload_jsons", requestJsonFilename); + URL url = this.getClass().getClassLoader().getResource(path.toString()); + return objectMapper.readValue(url, org.onap.vid.changeManagement.RequestDetails.class); + } - msoBusinessLogic.deleteVfModule(requestDetails, "serviceInstanceTempId","vnfInstanceTempId", "vfModuleTempId"); - verify(msoInterfaceMock).deleteVfModule(requestDetails, vf__modules_endpoint + "/vfModuleTempId" ); + private org.onap.vid.changeManagement.RequestDetailsWrapper readExpectedRequest(String requestJsonFilename) + throws IOException { + Path path = Paths.get("payload_jsons", requestJsonFilename); + URL url = this.getClass().getClassLoader().getResource(path.toString()); + return objectMapper.readValue(url, + new TypeReference<org.onap.vid.changeManagement.RequestDetailsWrapper<org.onap.vid.changeManagement.RequestDetails>>() { + }); + } + + private MsoResponseWrapper createOkResponse() { + HttpStatus expectedStatus = HttpStatus.ACCEPTED; + String expectedBody = " \"body\": {\n" + + " \"requestReferences\": {\n" + + " \"instanceId\": \" 123456 \",\n" + + " \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"\n" + + " }"; + MsoResponseWrapper responseWrapper = new MsoResponseWrapper(); + responseWrapper.setEntity(expectedBody); + responseWrapper.setStatus(expectedStatus.value()); + return responseWrapper; } @Test - public void insertServiceInstantiationToDB_StartJob() { - -// broker = new JobsBrokerServiceInDatabaseImpl(dataAccessServiceMock, sessionFactory); -// ((JobsBrokerServiceInDatabaseImpl)broker).deleteAll(); -// -//// msoBusinessLogic.setDataAccessService(dataAccessServiceMock); -//// msoBusinessLogic.setJobsBrokerService(broker); -//// msoBusinessLogic.setJobAdapter(jobAdapter); -// -// ServiceInstantiation serviceInstantiation = new ServiceInstantiation(); -// serviceInstantiation.setCount(2); -// serviceInstantiation.setInstanceName("TestName"); -// -// msoBusinessLogic.pushBulkJob(serviceInstantiation, "testUserId"); -// -// List<ServiceInfo> serviceInfoList = dataAccessServiceMock.getList(ServiceInfo.class, null); -// int k = 9; -// Assert.assertEquals(serviceInstantiation, containsInAnyOrder(serviceInfoList.toArray())); + public void shouldFilterOutOrchestrationRequestsNotAllowedInDashboard() throws IOException { + //given + String vnfModelTypeOrchestrationRequests = getFileContentAsString("mso_model_info_sample_response.json"); + String scaleOutActionOrchestrationRequests = getFileContentAsString("mso_action_scaleout_sample_response.json"); + + MsoResponseWrapper msoResponseWrapperMock = mock(MsoResponseWrapper.class); + given(msoInterface + .getOrchestrationRequestsForDashboard(any(String.class), any(String.class), any(String.class), + any(RestObject.class))) + .willReturn(msoResponseWrapperMock); + given(msoResponseWrapperMock.getEntity()) + .willReturn(vnfModelTypeOrchestrationRequests, scaleOutActionOrchestrationRequests); + + //when + List<Request> filteredOrchestrationReqs = msoBusinessLogic.getOrchestrationRequestsForDashboard(); + + //then + assertThat(filteredOrchestrationReqs).hasSize(3); + assertThat(MsoBusinessLogicImpl.DASHBOARD_ALLOWED_TYPES) + .containsAll(filteredOrchestrationReqs + .stream() + .map(el -> el.getRequestType().toUpperCase()) + .collect(Collectors.toList())); + assertThat(filteredOrchestrationReqs) + .extracting(org.onap.vid.domain.mso.Request::getRequestScope) + .containsOnly("vnf", "vfModule"); + } + + private String getFileContentAsString(String resourceName) throws IOException { + URL url = this.getClass().getClassLoader().getResource("."); + Path path = Paths.get(url.getPath(), "payload_jsons", resourceName); + return new String(Files.readAllBytes(path)); + } + + private static class MsoRequestWrapperMatcher extends + ArgumentMatcher<org.onap.vid.changeManagement.RequestDetailsWrapper> { + + private final org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest; + + public MsoRequestWrapperMatcher(org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest) { + this.expectedRequest = expectedRequest; + } + + @Override + public boolean matches(Object argument) { + org.onap.vid.changeManagement.RequestDetailsWrapper requestDetailsWrapper = (org.onap.vid.changeManagement.RequestDetailsWrapper) argument; + return expectedRequest.requestDetails.equals(requestDetailsWrapper.requestDetails); + } } } diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java deleted file mode 100644 index af7f74b3d..000000000 --- a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.onap.vid.mso; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.runner.RunWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.runners.MockitoJUnitRunner; -import org.onap.vid.mso.MsoBusinessLogicImpl; -import org.onap.vid.mso.MsoInterface; -import org.onap.vid.mso.MsoResponseWrapper; -import org.onap.vid.mso.rest.RequestDetails; -import org.onap.vid.mso.rest.RequestDetailsWrapper; -import org.testng.annotations.Test; - -import java.net.URL; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; - -@RunWith(MockitoJUnitRunner.class) -public class MsoBusinessLogicTest { - - @InjectMocks - private MsoBusinessLogicImpl msoBusinessLogic; - - @Mock - private MsoInterface msoClient; - - @Test - public void testCreateInstance() throws Exception { - String instanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d"; - final RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper(); - requestDetailsWrapper.requestDetails = setRequestDetails("mso_request_create_configuration.json"); - Mockito.doReturn(getOkResponse(instanceId)).when(msoClient).createConfigurationInstance(requestDetailsWrapper, "/serviceInstances/v6/3f93c7cb-2fd0-4557-9514-e189b7b04f9d/configurations"); - final MsoResponseWrapper msoResponseWrapper = msoBusinessLogic.createConfigurationInstance(requestDetailsWrapper, instanceId); - - assertNotNull(msoResponseWrapper); - assertEquals(202, msoResponseWrapper.getStatus()); - } - - private MsoResponseWrapper getOkResponse(String instanceId){ - MsoResponseWrapper responseWrapper = new MsoResponseWrapper(); - String entity = " \"body\": {\n" + - " \"requestReferences\": {\n" + - " \"instanceId\": \""+instanceId+"\",\n" + - " \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"\n" + - " }"; - responseWrapper.setEntity(entity); - responseWrapper.setStatus(202); - return responseWrapper; - } - - private RequestDetails setRequestDetails(String bodyFileName)throws Exception { - final URL resource = this.getClass().getResource("/payload_jsons/" + bodyFileName); - ObjectMapper mapper = new ObjectMapper(); - RequestDetails requestDetails = mapper.readValue(resource, RequestDetails.class); - return requestDetails; - - } -} diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java index 402386a50..bfc82ce2a 100644 --- a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java @@ -21,17 +21,12 @@ package org.onap.vid.mso.rest; import com.xebialabs.restito.server.StubServer; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Properties; -import java.util.UUID; import org.glassfish.grizzly.http.util.HttpStatus; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; +import org.onap.portalsdk.core.util.SystemProperties; import org.onap.vid.client.SyncRestClient; import org.onap.vid.controllers.MsoController; import org.onap.vid.mso.MsoInterface; @@ -39,16 +34,30 @@ import org.onap.vid.mso.MsoProperties; import org.onap.vid.mso.MsoResponseWrapper; import org.onap.vid.mso.MsoResponseWrapperInterface; import org.onap.vid.mso.RestObject; +import org.springframework.test.context.ContextConfiguration; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Properties; +import java.util.UUID; + +import static org.onap.vid.controllers.MsoController.SVC_INSTANCE_ID; +import static org.onap.vid.controllers.MsoController.VNF_INSTANCE_ID; + +@ContextConfiguration(classes = {SystemProperties.class}) public class MsoRestClientNewTest { private static StubServer server; private static StubServer securedServer; private static Properties props = new Properties(); private static String msoCreateServiceInstanceJson; + private static String msoScaleOutVfModule; private final static String CREATE_INSTANCE_RESPONSE_STR = - "{\"requestReferences\":{\"instanceId\":\"baa13544-0e95-4644-9565-9a198a29a294\"," - + "\"requestId\":\"a42a1a35-3d63-4629-bbe0-4989fa7414cb\"}}"; + "{\"requestReferences\":{\"instanceId\":\"baa13544-0e95-4644-9565-9a198a29a294\"," + + "\"requestId\":\"a42a1a35-3d63-4629-bbe0-4989fa7414cb\"}}"; private final static String SERVICE_INSTANCE_ID = "12345"; private static final String SAMPLE_VNF_INSTANCE_ID = "111"; private static final String SAMPLE_VNF_MODULE_ID = "987"; @@ -63,15 +72,19 @@ public class MsoRestClientNewTest { securedServer = new StubServer().secured().run(); Path resourceDirectory = - Paths.get("src", "test", "resources", "WEB-INF", "conf", "system.properties"); - try(InputStream is = Files.newInputStream(resourceDirectory)) { + Paths.get("src", "test", "resources", "WEB-INF", "conf", "system.properties"); + try (InputStream is = Files.newInputStream(resourceDirectory)) { props.load(is); } Path msoServiceInstantiationJsonFilePath = - Paths.get("src", "test", "resources", "payload_jsons", "mso_service_instantiation.json"); + Paths.get("src", "test", "resources", "payload_jsons", "mso_service_instantiation.json"); + + Path scaleOutJsonFilePath = Paths.get("src", "test", "resources", "payload_jsons", "scaleOutVfModulePayloadToMso.json"); msoCreateServiceInstanceJson = - String.join("\n", Files.readAllLines(msoServiceInstantiationJsonFilePath)); + String.join("\n", Files.readAllLines(msoServiceInstantiationJsonFilePath)); + msoScaleOutVfModule = String.join("\n", Files.readAllLines(scaleOutJsonFilePath)); + } @AfterClass @@ -89,11 +102,11 @@ public class MsoRestClientNewTest { public void testCreateSvcInstance() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_CONFIGURATIONS); endpoint = endpoint.replace(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - endpoint, - HttpStatus.ACCEPTED_202, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + endpoint, + HttpStatus.ACCEPTED_202, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createSvcInstance); } } @@ -102,12 +115,12 @@ public class MsoRestClientNewTest { public void testCreateVnf() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE); endpoint = endpoint.replace(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - endpoint, - HttpStatus.ACCEPTED_202, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { - + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + endpoint, + HttpStatus.ACCEPTED_202, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { + closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVnf); } } @@ -116,11 +129,11 @@ public class MsoRestClientNewTest { public void testCreateNwInstance() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); String nw_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - nw_endpoint, - HttpStatus.ACCEPTED_202, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + nw_endpoint, + HttpStatus.ACCEPTED_202, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createNwInstance); } } @@ -130,11 +143,11 @@ public class MsoRestClientNewTest { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); String vnf_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); vnf_endpoint = vnf_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID); - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - vnf_endpoint, - HttpStatus.ACCEPTED_202, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + vnf_endpoint, + HttpStatus.ACCEPTED_202, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVolumeGroupInstance); } } @@ -144,14 +157,14 @@ public class MsoRestClientNewTest { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); String partial_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); String vf_module_endpoint = - partial_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID); + partial_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID); - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - vf_module_endpoint, - HttpStatus.ACCEPTED_202, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + vf_module_endpoint, + HttpStatus.ACCEPTED_202, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVfModuleInstance); } } @@ -170,36 +183,38 @@ public class MsoRestClientNewTest { } catch (Exception e) { } } - + @Ignore @Test public void testDeleteSvcInstance() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE); endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - endpoint, - HttpStatus.NO_CONTENT_204, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + endpoint, + HttpStatus.NO_CONTENT_204, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteSvcInstance); } } + @Ignore @Test public void testDeleteVnf() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE); endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - endpoint, - HttpStatus.NO_CONTENT_204, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + endpoint, + HttpStatus.NO_CONTENT_204, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVnf); } } + @Ignore @Test public void testDeleteVfModule() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE); @@ -207,15 +222,16 @@ public class MsoRestClientNewTest { String vf_modules_endpoint = part_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID); String delete_vf_endpoint = vf_modules_endpoint + '/' + SAMPLE_VNF_MODULE_ID; - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - delete_vf_endpoint, - HttpStatus.NO_CONTENT_204, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + delete_vf_endpoint, + HttpStatus.NO_CONTENT_204, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVfModule); } } + @Ignore @Test public void testDeleteVolumeGroupInstance() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE); @@ -223,15 +239,16 @@ public class MsoRestClientNewTest { String vnf_endpoint = svc_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID); String delete_volume_group_endpoint = vnf_endpoint + "/" + SAMPLE_VNF_MODULE_ID; - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - delete_volume_group_endpoint, - HttpStatus.NO_CONTENT_204, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + delete_volume_group_endpoint, + HttpStatus.NO_CONTENT_204, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVolumeGroupInstance); } } + @Ignore @Test public void testDeleteNwInstance() throws Exception { String endpoint = props.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE); @@ -410,11 +427,11 @@ public class MsoRestClientNewTest { String serviceEndpoint = props.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE); String removeRelationshipsPath = serviceEndpoint + "/" + SERVICE_INSTANCE_ID + "/removeRelationships"; - try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil( - server, - removeRelationshipsPath, - HttpStatus.ACCEPTED_202, - CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) { + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + removeRelationshipsPath, + HttpStatus.ACCEPTED_202, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::removeRelationshipFromServiceInstance); } } @@ -433,6 +450,20 @@ public class MsoRestClientNewTest { } catch (Exception e) { } } + @Test + public void testScaleOutVfModule() throws IOException { + String serviceEndpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT); + String partial_endpoint = serviceEndpoint.replaceFirst(SVC_INSTANCE_ID, SERVICE_INSTANCE_ID); + String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID); + try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil( + server, + vf_module_endpoint, + HttpStatus.ACCEPTED_202, + CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) { + closure.executePostCall(msoScaleOutVfModule, msoRestClient()::scaleOutVFModuleInstance); + } + + } private MsoRestClientNew msoRestClient() { return new MsoRestClientNew(new SyncRestClient(MsoInterface.objectMapper()), baseUrl()); diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java index e8f556999..c81fa16fd 100644 --- a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java +++ b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java @@ -20,11 +20,13 @@ import java.util.function.BiFunction; import java.util.function.Function; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; + import org.glassfish.grizzly.http.Method; import org.glassfish.grizzly.http.util.HttpStatus; import org.json.JSONObject; import org.junit.Assert; import org.onap.portalsdk.core.util.SystemProperties; +import org.onap.vid.changeManagement.RequestDetailsWrapper; import org.onap.vid.mso.MsoResponseWrapper; class MsoRestClientTestUtil implements AutoCloseable { @@ -60,6 +62,21 @@ class MsoRestClientTestUtil implements AutoCloseable { verifyServer(server, endpoint, Method.POST); } + void executePostCall(String jsonPayload, BiFunction<RequestDetailsWrapper, String, MsoResponseWrapper> func) throws IOException { + whenHttp(server) + .match(post(endpoint)) + .then(status(expectedStatus), jsonContent(responsePayload), contentType(MediaType.APPLICATION_JSON)); + + RequestDetailsWrapper sampleRequestDetails = + new ObjectMapper().readValue(jsonPayload, RequestDetailsWrapper.class); + + MsoResponseWrapper response = func.apply(sampleRequestDetails, endpoint); + JSONObject actualJson = new JSONObject(response.getEntity()); + + Assert.assertEquals(expectedStatus.getStatusCode(), response.getStatus()); + Assert.assertEquals(expectedResponseStr, actualJson.toString()); + verifyServer(server, endpoint, Method.POST); + } void executeDelete(String jsonPayload, BiFunction<RequestDetails, String, MsoResponseWrapper> func) throws IOException { diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java new file mode 100644 index 000000000..3d2a20b63 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java @@ -0,0 +1,63 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.vid.services; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.MockitoAnnotations.initMocks; + +import java.util.UUID; +import org.glassfish.grizzly.http.util.HttpStatus; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class AuditServiceImplTest { + @Mock + private AsyncInstantiationBusinessLogic asyncInstantiationBL; + + @InjectMocks + private AuditServiceImpl auditService; + + @BeforeClass + public void init() { + initMocks(this); + } + + @Test + public void setFailedAuditStatusFromMsoTest() { + + UUID jobUuid = UUID.randomUUID(); + String requestId = "1"; + int statusCode = HttpStatus.OK_200.getStatusCode(); + String msoResponse = "{}"; + + auditService.setFailedAuditStatusFromMso(jobUuid, requestId, statusCode, msoResponse); + + verify(asyncInstantiationBL, times(1)) + .auditMsoStatus( + Mockito.any(UUID.class), + Mockito.anyString(), + Mockito.anyString(), + Mockito.anyString()); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java new file mode 100644 index 000000000..6677da357 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ +package org.onap.vid.services; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import javax.ws.rs.NotFoundException; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.onap.vid.job.Job; +import org.onap.vid.job.JobAdapter; +import org.onap.vid.job.JobsBrokerService; +import org.onap.vid.job.impl.JobDaoImpl; +import org.onap.vid.model.JobBulk; +import org.onap.vid.model.JobModel; +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; + +public class BulkInstantiationServiceImplTest { + + @Mock + private JobsBrokerService jobsBrokerService; + + @Mock + private JobAdapter jobAdapter; + + @InjectMocks + private BulkInstantiationServiceImpl testSubject; + + @BeforeSuite + public void before() { + initMocks(this); + } + + @BeforeMethod + public void resetMocks() { + reset(jobsBrokerService); + reset(jobAdapter); + } + + @Test + public void saveBulkTest() { + UUID uuid = UUID.randomUUID(); + Map<String, Object> bulkRequest = new HashMap<>(); + List<Job> jobList = new ArrayList<>(); + jobList.add(createJob(uuid)); + when(jobAdapter.createBulkOfJobs(bulkRequest)).thenReturn(jobList); + + JobBulk jobBulk = createJobBulk(jobList); + when(jobAdapter.toModelBulk(jobList)).thenReturn(jobBulk); + + JobBulk result = testSubject.saveBulk(bulkRequest); + + Assert.assertEquals(result.getJobs().size(), jobList.size()); + Assert.assertEquals(result.getJobs().get(0).getUuid(), uuid); + } + + @Test + public void getJobTest() { + UUID uuid = UUID.randomUUID(); + Job job = createJob(uuid); + doReturn(job).when(jobsBrokerService).peek(uuid); + JobModel jobModel = createJobModel(uuid); + when(jobAdapter.toModel(job)).thenReturn(jobModel); + + JobModel response = testSubject.getJob(uuid); + Assert.assertEquals(response.getUuid(), uuid); + } + + @Test(expectedExceptions = {NotFoundException.class}) + public void getJobTest_throwsExceptionOnEmptyUUID() { + UUID uuid = null; + Job job = createJob(uuid); + doReturn(job).when(jobsBrokerService).peek(uuid); + JobModel response = testSubject.getJob(uuid); + Assert.fail(); + } + + @Test(expectedExceptions = {NotFoundException.class}) + public void getJobTest_throwsExceptionCauseJobDoesNotExists() { + UUID uuid = UUID.randomUUID(); + doReturn(null).when(jobsBrokerService).peek(uuid); + JobModel response = testSubject.getJob(uuid); + Assert.fail(); + } + + private Job createJob(UUID uuid) { + Job job = new JobDaoImpl(); + job.setUuid(uuid); + return job; + } + + private JobModel createJobModel(UUID uuid) { + JobModel jobModel = new JobModel(); + jobModel.setUuid(uuid); + return jobModel; + } + + private JobBulk createJobBulk(List<Job> jobList) { + List<JobModel> jobBulkList = new ArrayList<>(); + jobList.stream().forEach(job -> { + JobModel jm = new JobModel(); + jm.setUuid(job.getUuid()); + jobBulkList.add(jm); + }); + return new JobBulk(jobBulkList); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java index 440a2a7bf..6ac7b5447 100644 --- a/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java @@ -1,80 +1,262 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ package org.onap.vid.services; -import org.junit.Test; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.MockitoAnnotations.initMocks; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import javax.ws.rs.ForbiddenException; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.onap.portalsdk.core.service.DataAccessService; import org.onap.vid.category.AddCategoryOptionResponse; import org.onap.vid.category.AddCategoryOptionsRequest; import org.onap.vid.category.CategoryParameterOptionRep; import org.onap.vid.category.CategoryParametersResponse; +import org.onap.vid.model.CategoryParameter; +import org.onap.vid.model.CategoryParameter.Family; import org.onap.vid.model.CategoryParameterOption; +import org.onap.vid.services.CategoryParameterServiceImpl.AlreadyExistOptionNameException; +import org.onap.vid.services.CategoryParameterServiceImpl.UnfoundedCategoryException; +import org.onap.vid.services.CategoryParameterServiceImpl.UnfoundedCategoryOptionException; +import org.testng.Assert; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; public class CategoryParameterServiceImplTest { - private CategoryParameterServiceImpl createTestSubject() { - return new CategoryParameterServiceImpl(); + private static final String CATEGORY_NAME = "SAMPLE_CATEGORY_NAME"; + private static final String OPTION_NAME = "SAMPLE_OPTION_NAME"; + private static final String UNIQUE_OPTION_NAME = "UNIQUE_OPTION_NAME"; + private static final String APP_ID_VID = "VID"; + private static final String APP_ID_SDC = "SDC"; + private static final String QUERY_STRING_FOR_CATEGORY_NAME = String.format(" where name = '%s' ", CATEGORY_NAME); + + + @Mock + private DataAccessService dataAccessService; + + @InjectMocks + private CategoryParameterServiceImpl testSubject; + + @BeforeSuite + public void before() { + initMocks(this); + } + + @BeforeMethod + public void resetMocks() { + reset(dataAccessService); } @Test - public void testCreateCategoryParameterOptions() throws Exception { - CategoryParameterServiceImpl testSubject; - String categoryName = ""; - AddCategoryOptionsRequest optionsRequest = null; - AddCategoryOptionResponse result; - - // default test - try { - testSubject = createTestSubject(); - result = testSubject.createCategoryParameterOptions(categoryName, optionsRequest); - } catch ( - - Exception e) { - } + public void createCategoryParameterOptions_happyPath() { + AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest(); + optionsRequest.options.add(UNIQUE_OPTION_NAME); + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest); + + Assert.assertTrue(result.getErrors().isEmpty());; + verify(dataAccessService, times(1)) + .saveDomainObject(anyObject(), anyObject()); } @Test - public void testDeleteCategoryOption() throws Exception { - CategoryParameterServiceImpl testSubject; - String categoryName = ""; + public void createCategoryParameterOptions_existingOptionsForCategory() { + AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest(); + optionsRequest.options.add(OPTION_NAME); + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true); + categoryParameter.getOptions().add(new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter)); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + String expectedError = String.format(CategoryParameterServiceImpl.OPTION_ALREADY_EXIST_FOR_CATEGORY + , OPTION_NAME, CATEGORY_NAME); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest); + + Assert.assertFalse(result.getErrors().isEmpty()); + Assert.assertEquals(result.getErrors().size(), 1); + Assert.assertTrue(result.getErrors().stream().allMatch(expectedError::equals)); + } + + private List<CategoryParameter> createCategoryParametersList(CategoryParameter categoryParameter) { + List<CategoryParameter> aList = new ArrayList<>(); + aList.add(categoryParameter); + return aList; + } + + @Test + public void createCategoryParameterOptions_nonExistingOptionsForCategory() { + AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest(); + + List<CategoryParameter> aList = createCategoryParametersList(new CategoryParameter()); + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest); + + Assert.assertTrue(result.getErrors().isEmpty()); + } + + @Test(expectedExceptions = { UnfoundedCategoryException.class }) + public void createCategoryParameterOptions_wrongNumberOfCategoryParameters() { + AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest(); + List<CategoryParameter> aList = Collections.emptyList(); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest); + + Assert.fail(); + } + + @Test(expectedExceptions = { UnfoundedCategoryException.class }) + public void deleteCategoryOption_wrongNumberOfParameters() { CategoryParameterOption option = null; + List<CategoryParameter> aList = Collections.emptyList(); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + testSubject.deleteCategoryOption(CATEGORY_NAME, option); - // default test - try { - testSubject = createTestSubject(); - testSubject.deleteCategoryOption(categoryName, option); - } catch ( + Assert.fail(); + } + + @Test + public void deleteCategoryOption_happyPath() { + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true); + CategoryParameterOption categoryParameterOption = + new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter); + categoryParameter.getOptions().add(categoryParameterOption); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + doReturn(aList).when(dataAccessService).getList(anyObject(), anyString(), anyString(), anyObject()); - Exception e) { - } + testSubject.deleteCategoryOption(CATEGORY_NAME, categoryParameterOption); + + verify(dataAccessService, times(1)) + .deleteDomainObject(anyObject(), anyObject()); } @Test - public void testGetCategoryParameters() throws Exception { - CategoryParameterServiceImpl testSubject; - CategoryParametersResponse result; - - // default test - try { - testSubject = createTestSubject(); - testSubject.getCategoryParameters(null); - } catch ( - - Exception e) { - } + public void getCategoryParametersTest() { + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true); + CategoryParameterOption categoryParameterOption = + new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter); + categoryParameter.getOptions().add(categoryParameterOption); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + doReturn(aList).when(dataAccessService).getList(anyObject(), anyString(), anyString(), anyObject()); + + CategoryParametersResponse response = testSubject.getCategoryParameters(Family.PARAMETER_STANDARDIZATION); + + Assert.assertFalse(response.getCategoryParameters().isEmpty()); + Assert.assertTrue(response.getCategoryParameters().containsKey(CATEGORY_NAME)); + + verify(dataAccessService, times(1)) + .getList(anyObject(), anyString(), anyString(), anyObject()); } @Test - public void testUpdateCategoryParameterOption() throws Exception { - CategoryParameterServiceImpl testSubject; - String categoryName = ""; - CategoryParameterOptionRep option = null; - AddCategoryOptionResponse result; - - // default test - try { - testSubject = createTestSubject(); - result = testSubject.updateCategoryParameterOption(categoryName, option); - } catch ( - - Exception e) { - } + public void updateCategoryParameterOption_domainObjectGetsSavedSuccessfully() { + CategoryParameterOptionRep optionRepExisting = new CategoryParameterOptionRep(APP_ID_VID, OPTION_NAME); + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true); + categoryParameter.getOptions().add( + new CategoryParameterOption(APP_ID_VID, UNIQUE_OPTION_NAME, categoryParameter)); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRepExisting); + + verify(dataAccessService, times(1)) + .saveDomainObject(anyObject(), anyObject()); + } + + @Test(expectedExceptions = { ForbiddenException.class }) + public void updateCategoryParameterOption_shouldFailUpdateForbidden() { + CategoryParameterOptionRep optionRep = new CategoryParameterOptionRep("1", CATEGORY_NAME); + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, false); + categoryParameter.getOptions().add(new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter)); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRep); + + Assert.fail(); + } + + @Test(expectedExceptions = { UnfoundedCategoryOptionException.class }) + public void updateCategoryParameterOption_CategoryNotFound() { + CategoryParameterOptionRep optionRep = new CategoryParameterOptionRep("SOME_UNRELATED_ID", CATEGORY_NAME); + + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true); + categoryParameter.getOptions().add(new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter)); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRep); + + Assert.fail(); + } + + @Test(expectedExceptions = { AlreadyExistOptionNameException.class }) + public void updateCategoryParameterOption_OptionNameExists() { + CategoryParameterOptionRep optionRepExisting = new CategoryParameterOptionRep(APP_ID_VID, OPTION_NAME); + + CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true); + CategoryParameter anotherCategoryParameter = createCategoryParameter(CATEGORY_NAME, true); + categoryParameter.getOptions().add( + new CategoryParameterOption(APP_ID_VID, UNIQUE_OPTION_NAME, anotherCategoryParameter)); + categoryParameter.getOptions().add( + new CategoryParameterOption(APP_ID_SDC, OPTION_NAME, anotherCategoryParameter)); + List<CategoryParameter> aList = createCategoryParametersList(categoryParameter); + + doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null); + + AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRepExisting); + + Assert.fail(); + } + + private CategoryParameter createCategoryParameter(String categoryName, boolean idSupported) { + CategoryParameter categoryParameter = new CategoryParameter(); + categoryParameter.setName(categoryName); + categoryParameter.setIdSupported(idSupported); + return categoryParameter; } }
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java new file mode 100644 index 000000000..d0eec2619 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java @@ -0,0 +1,40 @@ +package org.onap.vid.services; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.MockitoAnnotations.initMocks; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.onap.vid.aai.PombaClientInterface; +import org.onap.vid.model.PombaInstance.PombaRequest; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class PombaServiceImplTest { + + @Mock + private PombaClientInterface pombaClientInterface; + + @InjectMocks + private PombaServiceImpl testSubject; + + @BeforeClass + public void beforeClass() { + initMocks(this); + } + + @BeforeMethod + public void resetMocks() { + Mockito.reset(pombaClientInterface); + } + + @Test + public void testVerify() { + PombaRequest pombaRequest = new PombaRequest(); + testSubject.verify(pombaRequest); + verify(pombaClientInterface, times(1)) + .verify(pombaRequest); + } +}
\ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java index 544a799a0..d7db4955c 100644 --- a/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java +++ b/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java @@ -1,25 +1,139 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2018 Nokia. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ package org.onap.vid.services; -import static org.junit.Assert.*; -import java.util.*; -import org.junit.Assert; -import org.junit.Test; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.MockitoAnnotations.initMocks; + +import java.util.ArrayList; +import org.apache.commons.lang.StringUtils; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.onap.vid.aai.AaiClientInterface; +import org.onap.vid.aai.AaiResponse; +import org.onap.vid.aai.ServiceSubscription; +import org.onap.vid.aai.ServiceSubscriptions; +import org.onap.vid.aai.Services; +import org.onap.vid.model.Subscriber; +import org.onap.vid.model.SubscriberList; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; public class RoleGenaratorServiceImplTest { - private RoleGenaratorServiceImpl createTestSubject() { - return new RoleGenaratorServiceImpl(); + private static final String GLOBAL_CUSTOMER_ID = "997"; + private static final String SUBSCRIBER_NAME = "name"; + private static final String SUBSCRIBER_TYPE = "subscriber_type"; + private static final String RESOURCE_VERSION = "1"; + private static final String SERVICE_TYPE = "service_type"; + + @Mock + private AaiClientInterface aaiClientInterface; + + @InjectMocks + private RoleGenaratorServiceImpl testSubject; + + @BeforeClass + public void beforeClass() { + initMocks(this); + } + + @BeforeMethod + public void resetMocks() { + Mockito.reset(aaiClientInterface); + } + + @Test + public void tenerateRoleScript_firstRun() { + boolean firstRun = true; + + Subscriber subscriber = createSubscriber(); + AaiResponse<SubscriberList> subscribers = createSubscriberListAaiResponse(subscriber); + doReturn(subscribers).when(aaiClientInterface).getAllSubscribers(); + + ServiceSubscription serviceSubscription = createServiceSubscription(); + AaiResponse<Services> subscriberResponse = createServicesAaiResponse(serviceSubscription); + doReturn(subscriberResponse).when(aaiClientInterface).getSubscriberData(subscriber.globalCustomerId); + + String result = testSubject.generateRoleScript(firstRun); + Assert.assertTrue(StringUtils.isNotBlank(result)); } @Test - public void testGenerateRoleScript() throws Exception { - RoleGenaratorServiceImpl testSubject; - Boolean firstRun = null; - String result; - - // default test - testSubject = createTestSubject(); - result = testSubject.generateRoleScript(firstRun); + public void tenerateRoleScript_notAFirstRun() { + boolean firstRun = false; + + Subscriber subscriber = createSubscriber(); + AaiResponse<SubscriberList> subscribers = createSubscriberListAaiResponse(subscriber); + doReturn(subscribers).when(aaiClientInterface).getAllSubscribers(); + + ServiceSubscription serviceSubscription = createServiceSubscription(); + AaiResponse<Services> subscriberResponse = createServicesAaiResponse(serviceSubscription); + doReturn(subscriberResponse).when(aaiClientInterface).getSubscriberData(subscriber.globalCustomerId); + + String result = testSubject.generateRoleScript(firstRun); + Assert.assertTrue(StringUtils.isNotBlank(result)); + } + + @Test(expectedExceptions = { Exception.class }) + public void tenerateRoleScript_errorGettingDataFromAAIClient() { + boolean firstRun = false; + + doThrow(new Exception("This is expected.")).when(aaiClientInterface).getAllSubscribers(); + + String result = testSubject.generateRoleScript(firstRun); + Assert.fail(); + } + + private ServiceSubscription createServiceSubscription() { + ServiceSubscription serviceSubscription = new ServiceSubscription(); + serviceSubscription.serviceType = SERVICE_TYPE; + return serviceSubscription; + } + + private AaiResponse<SubscriberList> createSubscriberListAaiResponse(Subscriber subscriber) { + AaiResponse<SubscriberList> subscribers = new AaiResponse<>(new SubscriberList(new ArrayList<>()), "", 200); + subscribers.getT().customer.add(subscriber); + return subscribers; + } + + private AaiResponse<Services> createServicesAaiResponse(ServiceSubscription serviceSubscription) { + AaiResponse<Services> subscriberResponse = new AaiResponse<>(new Services(), "", 200); + subscriberResponse.getT().serviceSubscriptions = new ServiceSubscriptions(); + subscriberResponse.getT().serviceSubscriptions.serviceSubscription = new ArrayList<>(); + subscriberResponse.getT().serviceSubscriptions.serviceSubscription.add(serviceSubscription); + return subscriberResponse; + } + + private Subscriber createSubscriber() { + Subscriber subscriber = new Subscriber(); + subscriber.globalCustomerId = GLOBAL_CUSTOMER_ID; + subscriber.subscriberName = SUBSCRIBER_NAME; + subscriber.subscriberType = SUBSCRIBER_TYPE; + subscriber.resourceVersion = RESOURCE_VERSION; + return subscriber; } diff --git a/vid-app-common/src/test/resources/WEB-INF/conf/system.properties b/vid-app-common/src/test/resources/WEB-INF/conf/system.properties index 689f55e58..baf56d36c 100644 --- a/vid-app-common/src/test/resources/WEB-INF/conf/system.properties +++ b/vid-app-common/src/test/resources/WEB-INF/conf/system.properties @@ -73,18 +73,12 @@ element_map_icon_path = app/fusionapp/icons/ #aai related properties #dev server -#aai.server.url.base=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/ -#aai.server.url=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/v10/ -#aai.oldserver.url.base=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/servers/ -#aai.oldserver.url=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/servers/v3/ #ist servers -aai.server.url.base=https://aai-ext1.test.att.com:8443/aai/ -#aai.server.url=https://aai-ext1.test.att.com:8443/aai/v12/ +aai.server.url.base=http://localhost:8080/vidSimulator/aai/ aai.server.url=http://localhost:8080/vidSimulator/aai/v12/ #aai.server.url=http://localhost:1080/aai -#aai.server.url=https://aai-int2.test.att.com:8443/aai/v12/ -aai.vid.username=VID -aai.vid.passwd.x=OBF:1jm91i0v1jl9 +aai.vid.username=vid@vid.onap.org +aai.vid.passwd.x=OBF:1fia1ju61l871lfe18xp18xr18xt1lc41l531jrk1fek @@ -93,12 +87,10 @@ aai.vid.passwd.x=OBF:1jm91i0v1jl9 -aai.oldserver.url.base=https://aai-ext1.test.att.com:8443/aai/servers/ -aai.oldserver.url=https://aai-ext1.test.att.com:8443/aai/servers/v3/ aai.truststore.filename=tomcat_keystore -aai.truststore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o +aai.truststore.passwd.x=OBF:1ks51l8d1o3i1pcc1r2r1e211r391kls1pyj1z7u1njf1lx51go21hnj1y0k1mli1sop1k8o1j651vu91mxw1vun1mze1vv11j8x1k5i1sp11mjc1y161hlr1gm41m111nkj1z781pw31kku1r4p1e391r571pbm1o741l4x1ksp aai.keystore.filename=aai-client-cert.p12 -aai.keystore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o +aai.keystore.passwd.x=OBF:1ks51l8d1o3i1pcc1r2r1e211r391kls1pyj1z7u1njf1lx51go21hnj1y0k1mli1sop1k8o1j651vu91mxw1vun1mze1vv11j8x1k5i1sp11mjc1y161hlr1gm41m111nkj1z781pw31kku1r4p1e391r571pbm1o741l4x1ksp aai.use.client.cert=false aai.vnf.provstatus=PREPROV,NVTPROV,PROV,CAPPED @@ -151,10 +143,12 @@ mso.max.polls=10 mso.user.name=infraportal mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz mso.restapi.svc.instance=/serviceInstances/v5 +mso.restapi.svc.instance.deleteAndUnassign=/serviceInstantiation/v5/serviceInstances mso.restapi.vnf.instance=/serviceInstances/v5/<service_instance_id>/vnfs mso.restapi.vnf.changemanagement.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type> mso.restapi.network.instance=/serviceInstances/v5/<service_instance_id>/networks -mso.restapi.vf.module.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules +mso.restapi.vf.module.instance=/serviceInstances/v7/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules +mso.restapi.vf.module.scaleout=/serviceInstantiation/v7/serviceInstances/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut mso.restapi.volume.group.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups mso.restapi.get.orc.req=/orchestrationRequests/v5 mso.restapi.get.orc.reqs=/orchestrationRequests/v5? @@ -166,7 +160,7 @@ vid.truststore.filename=/opt/app/vid/etc/vid_keystore.jks mso.dme2.client.timeout=30000 mso.dme2.client.read.timeout=120000 -scheduler.server.url=http://mtanjv9sdlg10.aic.cip.att.com:8989/scheduler +scheduler.server.url= scheduler.create.new.vnf.change.instance=/v1/ChangeManagement/schedules/ scheduler.get.time.slots=/v1/ChangeManagement/schedules/ scheduler.get.schedules=/v1/ChangeManagement/schedules/scheduleDetails/ diff --git a/vid-app-common/src/test/resources/git.properties b/vid-app-common/src/test/resources/git.properties new file mode 100644 index 000000000..6db5795a5 --- /dev/null +++ b/vid-app-common/src/test/resources/git.properties @@ -0,0 +1,3 @@ +git.commit.id=123 +git.commit.message.short=Test short commit message +git.commit.time=1999-09-12T13\:48\:55+0200
\ No newline at end of file diff --git a/vid-app-common/src/test/resources/mso.properties b/vid-app-common/src/test/resources/mso.properties index fcd20bd7a..d021ffde1 100644 --- a/vid-app-common/src/test/resources/mso.properties +++ b/vid-app-common/src/test/resources/mso.properties @@ -6,7 +6,7 @@ mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz mso.restapi.svc.instance=/serviceInstances/v3 mso.restapi.vnf.instance=/serviceInstances/v3/<service_instance_id>/vnfs mso.restapi.network.instance=/serviceInstances/v3/<service_instance_id>/networks -mso.restapi.vf.module.instance=/serviceInstances/v3/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules +mso.restapi.vf.module.instance=/serviceInstantiation/v7/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut mso.restapi.volume.group.instance=/serviceInstances/v3/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups mso.restapi.configurations=/serviceInstances/v6/<service_instance_id>/configurations mso.restapi.get.orc.req=/orchestrationRequests/v3 diff --git a/vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json b/vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json new file mode 100644 index 000000000..d37f6af1f --- /dev/null +++ b/vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json @@ -0,0 +1,174 @@ +{ + "requestList": [ + { + "request": { + "requestId": "799d7380-60fe-4b64-9d99-82f6ab09163b", + "startTime": "Fri, 12 Oct 2018 08:53:07 GMT", + "requestScope": "vfModule", + "requestType": "scaleOut", + "requestDetails": { + "modelInfo": { + "modelCustomizationName": "WsSp..base_ws..module-0", + "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc", + "modelType": "vfModule", + "modelName": "WsSp..base_ws..module-0", + "modelVersion": "1", + "modelCustomizationUuid": "bfcc8f57-7b56-4be8-a8f1-e44262c83318", + "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0", + "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318", + "modelUuid": "53f52586-236b-4d52-a94c-990883e054f0", + "modelInvariantUuid": "763b1172-b5f5-4062-9d79-2459710fa0bc", + "modelInstanceName": "WsSp..base_ws..module-0" + }, + "requestInfo": { + "source": "VID", + "instanceName": "ws-test-0310-8_NaN", + "suppressRollback": false, + "requestorId": "demo" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "modelInfo": { + "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b", + "modelType": "service", + "modelName": "ws-service", + "modelVersion": "1.0", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelInvariantUuid": "c9817f08-07b2-458b-a02f-cd5407ee7a7b" + } + } + }, + { + "relatedInstance": { + "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "modelInfo": { + "modelCustomizationName": "ws-sp 0", + "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelType": "vnf", + "modelName": "ws-sp", + "modelVersion": "1.0", + "modelCustomizationUuid": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelInvariantUuid": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelInstanceName": "ws-sp 0" + } + } + } + ], + "cloudConfiguration": { + "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e", + "lcpCloudRegionId": "RegionOne" + }, + "requestParameters": {}, + "configurationParameters": [ + { + "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]", + "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]" + } + ] + }, + "instanceReferences": { + "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "vfModuleInstanceName": "ws-test-0310-8_NaN", + "requestorId": "demo" + }, + "requestStatus": { + "requestState": "FAILED", + "statusMessage": "No valid vfModuleCustomization is specified", + "percentProgress": 100, + "finishTime": "Fri, 12 Oct 2018 08:53:07 GMT" + } + } + }, + { + "request": { + "requestId": "44b534c7-57b5-42ec-85bb-219167021b34", + "startTime": "Fri, 12 Oct 2018 09:08:01 GMT", + "requestScope": "vfModule", + "requestType": "scaleOut", + "requestDetails": { + "modelInfo": { + "modelCustomizationName": "WsSp..base_ws..module-0", + "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc", + "modelType": "vfModule", + "modelName": "WsSp..base_ws..module-0", + "modelVersion": "1", + "modelCustomizationUuid": "bfcc8f57-7b56-4be8-a8f1-e44262c83318", + "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0", + "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318", + "modelUuid": "53f52586-236b-4d52-a94c-990883e054f0", + "modelInvariantUuid": "763b1172-b5f5-4062-9d79-2459710fa0bc", + "modelInstanceName": "WsSp..base_ws..module-0" + }, + "requestInfo": { + "source": "VID", + "instanceName": "ws-test-0310-8_NaN", + "suppressRollback": false, + "requestorId": "demo" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "modelInfo": { + "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b", + "modelType": "service", + "modelName": "ws-service", + "modelVersion": "1.0", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelInvariantUuid": "c9817f08-07b2-458b-a02f-cd5407ee7a7b" + } + } + }, + { + "relatedInstance": { + "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "modelInfo": { + "modelCustomizationName": "ws-sp 0", + "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelType": "vnf", + "modelName": "ws-sp", + "modelVersion": "1.0", + "modelCustomizationUuid": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelInvariantUuid": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelInstanceName": "ws-sp 0" + } + } + } + ], + "cloudConfiguration": { + "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e", + "lcpCloudRegionId": "RegionOne" + }, + "requestParameters": {}, + "configurationParameters": [ + { + "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]", + "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]" + } + ] + }, + "instanceReferences": { + "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "vfModuleInstanceId": "scaleOut", + "vfModuleInstanceName": "ws-test-0310-8_NaN", + "requestorId": "demo" + }, + "requestStatus": { + "requestState": "FAILED" + } + } + } + ] +}
\ No newline at end of file diff --git a/vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json b/vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json new file mode 100644 index 000000000..9dbdfb043 --- /dev/null +++ b/vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json @@ -0,0 +1,108 @@ +{ + "requestList": [ + { + "request": { + "requestId": "f8c813a2-b22b-4e3d-9be0-8e2d16b1add3", + "startTime": "Wed, 03 Oct 2018 13:13:04 GMT", + "requestScope": "vnf", + "requestType": "createInstance", + "requestDetails": { + "modelInfo": { + "modelCustomizationName": "ws-sp 0", + "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelType": "vnf", + "modelName": "ws-sp", + "modelVersion": "1.0", + "modelCustomizationUuid": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelInvariantUuid": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelInstanceName": "ws-sp 0" + }, + "requestInfo": { + "productFamilyId": "61cc3239-5c2e-4762-a281-7422a2e54d5a", + "source": "VID", + "instanceName": "ws-test-0310-8", + "suppressRollback": false, + "requestorId": "demo" + }, + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "modelInfo": { + "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b", + "modelType": "service", + "modelName": "ws-service", + "modelVersion": "1.0", + "modelVersionId": "cd3fbd06-6bc8-43a4-b803-933fc2e3cdf7", + "modelUuid": "cd3fbd06-6bc8-43a4-b803-933fc2e3cdf7", + "modelInvariantUuid": "c9817f08-07b2-458b-a02f-cd5407ee7a7b" + } + } + } + ], + "cloudConfiguration": { + "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e", + "lcpCloudRegionId": "RegionOne" + }, + "requestParameters": { + "testApi": "VNF_API" + }, + "platform": { + "platformName": "Demo" + }, + "lineOfBusiness": { + "lineOfBusinessName": "Demo" + } + }, + "instanceReferences": { + "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "vnfInstanceName": "ws-test-0310-8", + "requestorId": "demo" + }, + "requestStatus": { + "requestState": "COMPLETE", + "statusMessage": "Vnf has been created successfully.", + "percentProgress": 100, + "finishTime": "Wed, 03 Oct 2018 13:13:09 GMT" + } + } + }, + { + "request": { + "requestId": "3447ba35-015d-4d72-9345-d89b1e35b2d6", + "startTime": "Thu, 04 Oct 2018 10:35:17 GMT", + "requestScope": "vnf", + "requestType": "inPlaceSoftwareUpdate", + "requestDetails": { + "requestInfo": { + "source": "VID", + "suppressRollback": false, + "requestorId": "demo" + }, + "cloudConfiguration": { + "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e", + "lcpCloudRegionId": "RegionOne" + }, + "requestParameters": { + "payload": "{\"existing_software_version\":\"0.7\",\"new_software_version\":\"1.0\",\"operations_timeout\":\"10\"}" + } + }, + "instanceReferences": { + "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "requestorId": "demo" + }, + "requestStatus": { + "requestState": "FAILED", + "statusMessage": "Cloud Region with cloudRegionId RegionOne does not exist in A&AI", + "percentProgress": 100, + "finishTime": "Thu, 04 Oct 2018 10:35:21 GMT" + } + } + } + ] +}
\ No newline at end of file diff --git a/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json new file mode 100644 index 000000000..c509c6247 --- /dev/null +++ b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json @@ -0,0 +1,67 @@ +{ + "vnfName":"test", + "vnfInstanceId":"123", + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "modelInfo": { + "modelType": "service", + "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelName": "ws-service", + "modelVersion": "1.0", + "additionalProperties": {} + } + } + }, + { + "relatedInstance": { + "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "modelInfo": { + "modelType": "vnf", + "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelName": "ws-sp", + "modelVersion": "1.0", + "modelCustomizationName": "ws-sp 0", + "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "additionalProperties": {} + } + } + } + ], + "cloudConfiguration": { + "lcpCloudRegionId": "RegionOne", + "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e", + "additionalProperties": {} + }, + "modelInfo": { + "modelCustomizationName": "WsSp..base_ws..module-0", + "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318", + "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc", + "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0", + "modelName": "WsSp..base_ws..module-0", + "modelNameVersionId": null, + "modelType": "vfModule", + "modelVersion": "1", + "additionalProperties": {} + }, + "requestInfo": { + "instanceName": "ws-test-0310-8_NaN", + "source": "VID", + "suppressRollback": false, + "requestorId": "demo", + "additionalProperties": {} + }, + "requestParameters": { + "additionalProperties": {} + }, + "configurationParameters": [ + { + "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]", + "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]" + } + ] + } +}
\ No newline at end of file diff --git a/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json new file mode 100644 index 000000000..ddbebac95 --- /dev/null +++ b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json @@ -0,0 +1,66 @@ +{ + "requestDetails": { + "relatedInstanceList": [ + { + "relatedInstance": { + "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b", + "modelInfo": { + "modelType": "service", + "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelName": "ws-service", + "modelVersion": "1.0", + "additionalProperties": {} + } + } + }, + { + "relatedInstance": { + "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75", + "modelInfo": { + "modelType": "vnf", + "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687", + "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367", + "modelName": "ws-sp", + "modelVersion": "1.0", + "modelCustomizationName": "ws-sp 0", + "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986", + "additionalProperties": {} + } + } + } + ], + "cloudConfiguration": { + "lcpCloudRegionId": "RegionOne", + "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e", + "additionalProperties": {} + }, + "modelInfo": { + "modelCustomizationName": "WsSp..base_ws..module-0", + "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318", + "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc", + "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0", + "modelName": "WsSp..base_ws..module-0", + "modelNameVersionId": null, + "modelType": "vfModule", + "modelVersion": "1", + "additionalProperties": {} + }, + "requestInfo": { + "instanceName": "ws-test-0310-8_NaN", + "source": "VID", + "suppressRollback": false, + "requestorId": "demo", + "additionalProperties": {} + }, + "requestParameters": { + "additionalProperties": {} + }, + "configurationParameters": [ + { + "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]", + "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]" + } + ] + } +}
\ No newline at end of file diff --git a/vid-app-common/version.properties b/vid-app-common/version.properties index 02144f0fe..9723960f3 100755 --- a/vid-app-common/version.properties +++ b/vid-app-common/version.properties @@ -2,7 +2,7 @@ # Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
# because they are used in Jenkins, whose plug-in doesn't support
-major=3
+major=4
minor=0
patch=0
|