diff options
author | Benjamin, Max (mb388a) <mb388a@us.att.com> | 2018-07-30 15:56:09 -0400 |
---|---|---|
committer | Benjamin, Max (mb388a) <mb388a@us.att.com> | 2018-07-31 11:09:25 -0400 |
commit | 5a6a6de6f1a26a1897e4917a0df613e25a24eb70 (patch) | |
tree | 59a968f27b4b603aacc9d5e7b51fb598aeec5321 /common/src/main/java/org/onap | |
parent | b6dc38501f3b746426b42d9de4cc883d894149e8 (diff) |
Containerization feature of SO
Change-Id: I95381232eeefcd247a66a5cec370a8ce1c288e18
Issue-ID: SO-670
Signed-off-by: Benjamin, Max (mb388a) <mb388a@us.att.com>
Diffstat (limited to 'common/src/main/java/org/onap')
212 files changed, 17927 insertions, 0 deletions
diff --git a/common/src/main/java/org/onap/so/client/DefaultProperties.java b/common/src/main/java/org/onap/so/client/DefaultProperties.java new file mode 100644 index 0000000000..84509ead05 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/DefaultProperties.java @@ -0,0 +1,42 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client; + +import java.net.MalformedURLException; +import java.net.URL; + +public class DefaultProperties implements RestProperties { + + private final URL url; + public DefaultProperties(URL url) { + this.url = url; + } + @Override + public URL getEndpoint() throws MalformedURLException { + return this.url; + } + + @Override + public String getSystemName() { + return RestClient.ECOMP_COMPONENT_NAME; + } + +} diff --git a/common/src/main/java/org/onap/so/client/HttpClient.java b/common/src/main/java/org/onap/so/client/HttpClient.java new file mode 100644 index 0000000000..ad13745919 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/HttpClient.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import java.net.URL; +import java.util.Map; +import java.util.Optional; + +import org.onap.so.utils.TargetEntity; + +public class HttpClient extends RestClient { + + private TargetEntity targetEntity; + public HttpClient(URL host, String contentType, TargetEntity targetEntity) { + super(host, contentType); + this.targetEntity = targetEntity; + + } + + @Override + public TargetEntity getTargetEntity(){ + return targetEntity; + } + + @Override + protected void initializeHeaderMap(Map<String, String> headerMap) { + + } + + @Override + protected Optional<ResponseExceptionMapper> addResponseExceptionMapper() { + return Optional.empty(); + } + +} diff --git a/common/src/main/java/org/onap/so/client/PreconditionFailedException.java b/common/src/main/java/org/onap/so/client/PreconditionFailedException.java new file mode 100644 index 0000000000..4ff07a616d --- /dev/null +++ b/common/src/main/java/org/onap/so/client/PreconditionFailedException.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +public class PreconditionFailedException extends WebApplicationException { + /** + * + */ + private static final long serialVersionUID = 1L; + + public PreconditionFailedException(String message) { + super(message, Response.Status.PRECONDITION_FAILED); + } +} diff --git a/common/src/main/java/org/onap/so/client/ResponseExceptionMapper.java b/common/src/main/java/org/onap/so/client/ResponseExceptionMapper.java new file mode 100644 index 0000000000..31cdd50aee --- /dev/null +++ b/common/src/main/java/org/onap/so/client/ResponseExceptionMapper.java @@ -0,0 +1,101 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.util.Optional; + +import javax.ws.rs.BadRequestException; +import javax.ws.rs.ForbiddenException; +import javax.ws.rs.InternalServerErrorException; +import javax.ws.rs.NotAcceptableException; +import javax.ws.rs.NotAllowedException; +import javax.ws.rs.NotAuthorizedException; +import javax.ws.rs.NotFoundException; +import javax.ws.rs.NotSupportedException; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; + +import org.apache.commons.io.IOUtils; + +public abstract class ResponseExceptionMapper { + + public void map(Response response) { + + response.bufferEntity(); + if (response.getStatus() >= 300) { + String message = "empty message"; + if (response.hasEntity()) { + StringWriter writer = new StringWriter(); + try { + IOUtils.copy((InputStream)response.getEntity(), writer, "UTF-8"); + } catch (IOException e) { + writer.append("failed to read entity stream"); + } + Optional<String> result = this.extractMessage(writer.toString()); + if (result.isPresent()) { + message = result.get(); + } + } + Response.Status status = Response.Status.fromStatusCode(response.getStatus()); + WebApplicationException webAppException; + switch (status) { + case BAD_REQUEST: + webAppException = new BadRequestException(message); + break; + case UNAUTHORIZED: + webAppException = new NotAuthorizedException(message); + break; + case FORBIDDEN: + webAppException = new ForbiddenException(message); + break; + case NOT_FOUND: + webAppException = new NotFoundException(message); + break; + case METHOD_NOT_ALLOWED: + webAppException = new NotAllowedException(message); + break; + case NOT_ACCEPTABLE: + webAppException = new NotAcceptableException(message); + break; + case PRECONDITION_FAILED: + webAppException = new PreconditionFailedException(message); + break; + case UNSUPPORTED_MEDIA_TYPE: + webAppException = new NotSupportedException(message); + break; + case INTERNAL_SERVER_ERROR: + webAppException = new InternalServerErrorException(message); + break; + case SERVICE_UNAVAILABLE: + webAppException = new WebApplicationException(message); + break; + default: + webAppException = new WebApplicationException(message); + } + throw webAppException; + } + } + + public abstract Optional<String> extractMessage(String entity); +} diff --git a/common/src/main/java/org/onap/so/client/ResponseExceptionMapperImpl.java b/common/src/main/java/org/onap/so/client/ResponseExceptionMapperImpl.java new file mode 100644 index 0000000000..0392b49629 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/ResponseExceptionMapperImpl.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import java.util.Optional; + +import javax.annotation.Priority; +import javax.ws.rs.ext.Provider; + +@Provider +@Priority(Integer.MIN_VALUE) +public class ResponseExceptionMapperImpl extends ResponseExceptionMapper { + + @Override + public Optional<String> extractMessage(String entity) { + return Optional.of(entity); + } + + +} diff --git a/common/src/main/java/org/onap/so/client/RestClient.java b/common/src/main/java/org/onap/so/client/RestClient.java new file mode 100644 index 0000000000..79fd7df7ce --- /dev/null +++ b/common/src/main/java/org/onap/so/client/RestClient.java @@ -0,0 +1,320 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import java.net.ConnectException; +import java.net.MalformedURLException; +import java.net.SocketTimeoutException; +import java.net.URI; +import java.net.URL; +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Invocation.Builder; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.policy.CommonObjectMapperProvider; +import org.onap.so.client.policy.LoggingFilter; +import org.onap.so.logger.MsoLogger; +import org.onap.so.logging.jaxrs.filter.jersey.JaxRsClientLogging; +import org.onap.so.utils.CryptoUtils; +import org.onap.so.utils.TargetEntity; +import org.slf4j.MDC; + +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; + +import net.jodah.failsafe.Failsafe; +import net.jodah.failsafe.RetryPolicy; + + +public abstract class RestClient { + public static final String ECOMP_COMPONENT_NAME = "MSO"; + + private static final int MAX_PAYLOAD_SIZE = 1024 * 1024; + private WebTarget webTarget; + + protected final Map<String, String> headerMap; + protected final MsoLogger msoLogger; + protected URL host; + protected Optional<URI> path; + protected String accept; + protected String contentType; + protected String requestId; + protected JaxRsClientLogging jaxRsClientLogging; + protected RestProperties props; + + protected RestClient(RestProperties props, Optional<URI> path) { + + msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL, RestClient.class); + this.requestId = MDC.get(MsoLogger.REQUEST_ID); + if (requestId == null) { + requestId = ""; + } + headerMap = new HashMap<>(); + try { + host = props.getEndpoint(); + } catch (MalformedURLException e) { + + throw new RuntimeException(e); + } + this.props = props; + this.path = path; + } + + protected RestClient(RestProperties props, Optional<URI> path, String accept, String contentType) { + this(props, path); + this.accept = accept; + this.contentType = contentType; + this.requestId = MDC.get(MsoLogger.REQUEST_ID); + if (requestId == null) { + requestId = ""; + } + this.props = props; + } + + protected RestClient(URL host, String contentType) { + headerMap = new HashMap<>(); + + msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL, RestClient.class); + this.path = Optional.empty(); + this.host = host; + this.contentType = contentType; + this.requestId = MDC.get(MsoLogger.REQUEST_ID); + if (requestId == null) { + requestId = ""; + } + this.props = new DefaultProperties(host); + } + + /** + * Override method to return false to disable logging. + * + * @return true - to enable logging, false otherwise + */ + protected boolean enableLogging() { + return true; + } + + /** + * Override method to return custom value for max payload size. + * + * @return Default value for MAX_PAYLOAD_SIZE = 1024 * 1024 + */ + protected int getMaxPayloadSize() + { + return MAX_PAYLOAD_SIZE; + } + + protected Builder getBuilder() { + + if (webTarget == null) { + initializeClient(getClient()); + } + Builder builder = webTarget.request(); + initializeHeaderMap(headerMap); + + headerMap.put("X-ECOMP-RequestID", requestId); + for (Entry<String, String> entry : headerMap.entrySet()) { + builder.header(entry.getKey(), entry.getValue()); + } + return builder; + } + + protected abstract void initializeHeaderMap(Map<String, String> headerMap); + + protected Optional<ResponseExceptionMapper> addResponseExceptionMapper() { + return Optional.of(new ResponseExceptionMapperImpl()); + } + + protected CommonObjectMapperProvider getCommonObjectMapperProvider() { + return new CommonObjectMapperProvider(); + } + + /** + * Adds a basic authentication header to the request. + * @param auth the encrypted credentials + * @param key the key for decrypting the credentials + */ + protected void addBasicAuthHeader(String auth, String key) { + try { + byte[] decryptedAuth = CryptoUtils.decrypt(auth, key).getBytes(); + String authHeaderValue = "Basic " + Base64.getEncoder().encodeToString(decryptedAuth); + headerMap.put("Authorization", authHeaderValue); + } catch (GeneralSecurityException e) { + msoLogger.error(e.getMessage(), e); + } + } + + protected String getAccept() { + return accept; + } + + protected String getContentType() { + return contentType; + } + + protected String getMergeContentType() { + return "application/merge-patch+json"; + } + + protected Client getClient() { + return ClientBuilder.newBuilder().build(); + } + + protected abstract TargetEntity getTargetEntity(); + + protected void initializeClient(Client client) { + if (this.enableLogging()) { + client.register(new LoggingFilter(this.getMaxPayloadSize())); + } + CommonObjectMapperProvider provider = this.getCommonObjectMapperProvider(); + client.register(new JacksonJsonProvider(provider.getMapper())); + + jaxRsClientLogging = new JaxRsClientLogging(); + jaxRsClientLogging.setTargetService(getTargetEntity()); + client.register(jaxRsClientLogging); + + if (!path.isPresent()) { + webTarget = client.target(host.toString()); + } else { + webTarget = client.target(UriBuilder.fromUri(host + path.get().toString())); + } + if (getAccept() == null || getAccept().isEmpty()) { + this.accept = MediaType.APPLICATION_JSON; + } + if (getContentType() == null || getContentType().isEmpty()) { + this.contentType = MediaType.APPLICATION_JSON; + } + } + + protected List<Predicate<Throwable>> retryOn() { + + List<Predicate<Throwable>> result = new ArrayList<>(); + + result.add(e -> { + return e.getCause() instanceof SocketTimeoutException; + }); + result.add(e -> { + return e.getCause() instanceof ConnectException; + }); + return result; + } + + public Response get() { + return method("GET", null); + } + + public Response post(Object obj) { + return method("POST", obj); + } + + public Response patch(Object obj) { + return method("PATCH", obj); + } + + public Response put(Object obj) { + return method("PUT", obj); + } + + public Response delete() { + return method("DELETE", null); + } + + public Response delete(Object obj) { + return method("DELETE", obj); + } + + public <T> Optional<T> get(Class<T> resultClass) { + return format(method("GET", null), resultClass); + } + + public <T> Optional<T> get(GenericType<T> resultClass) { + return format(method("GET", null), resultClass); + } + + public <T> T post(Object obj, Class<T> resultClass) { + return format(method("POST", obj), resultClass).orElse(null); + } + + public <T> T patch(Object obj, Class<T> resultClass) { + return format(method("PATCH", obj), resultClass).orElse(null); + } + + public <T> T put(Object obj, Class<T> resultClass) { + return format(method("PUT", obj), resultClass).orElse(null); + } + + public <T> T delete(Class<T> resultClass) { + return format(method("DELETE", null), resultClass).orElse(null); + } + + public <T> T delete(Object obj, Class<T> resultClass) { + return format(method("DELETE", obj), resultClass).orElse(null); + } + + private Response method(String method, Object entity) { + RetryPolicy policy = new RetryPolicy(); + + List<Predicate<Throwable>> items = retryOn(); + + Predicate<Throwable> pred = items.stream().reduce(Predicate::or).orElse(x -> false); + + policy.retryOn(error -> pred.test(error)); + + policy.withDelay(this.props.getDelayBetweenRetries(), TimeUnit.MILLISECONDS) + .withMaxRetries(this.props.getRetries()); + + return Failsafe.with(policy).get(buildRequest(method, entity)); + } + + protected RestRequest buildRequest(String method, Object entity) { + return new RestRequest(this, method, entity); + } + private <T> Optional<T> format(Response response, Class<T> resultClass) { + if (this.props.mapNotFoundToEmpty() && response.getStatus() == Status.NOT_FOUND.getStatusCode()) { + return Optional.empty(); + } + return Optional.of(response.readEntity(resultClass)); + } + + private <T> Optional<T> format(Response response, GenericType<T> resultClass) { + if (this.props.mapNotFoundToEmpty() && response.getStatus() == Status.NOT_FOUND.getStatusCode()) { + return Optional.empty(); + } + return Optional.of(response.readEntity(resultClass)); + } +} diff --git a/common/src/main/java/org/onap/so/client/RestClientSSL.java b/common/src/main/java/org/onap/so/client/RestClientSSL.java new file mode 100644 index 0000000000..461bb5832c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/RestClientSSL.java @@ -0,0 +1,94 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import java.io.FileInputStream; +import java.net.URI; +import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.util.Optional; + +import javax.net.ssl.SSLContext; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; + +public abstract class RestClientSSL extends RestClient { + + public static final String SSL_KEY_STORE_KEY = "javax.net.ssl.keyStore"; + public static final String SSL_KEY_STORE_PASSWORD_KEY = "javax.net.ssl.keyStorePassword"; + public static final String MSO_LOAD_SSL_CLIENT_KEYSTORE_KEY = "mso.load.ssl.client.keystore"; + + + protected RestClientSSL(RestProperties props, Optional<URI> path) { + super(props, path); + } + + protected RestClientSSL(RestProperties props, Optional<URI> path, String accept, String contentType) { + super(props, path, accept, contentType); + } + + @Override + protected Client getClient() { + + Client client = null; + try { + String loadSSLKeyStore = System.getProperty(RestClientSSL.MSO_LOAD_SSL_CLIENT_KEYSTORE_KEY); + if(loadSSLKeyStore != null && loadSSLKeyStore.equalsIgnoreCase("true")) { + KeyStore ks = getKeyStore(); + if(ks != null) { + client = ClientBuilder.newBuilder().keyStore(ks, System.getProperty(RestClientSSL.SSL_KEY_STORE_PASSWORD_KEY)).build(); + this.msoLogger.debug("RestClientSSL not using default SSL context - setting keystore here."); + return client; + } + } + //Use default SSL context + client = ClientBuilder.newBuilder().sslContext(SSLContext.getDefault()).build(); + this.msoLogger.debug("RestClientSSL using default SSL context!"); + } catch (NoSuchAlgorithmException e) { + //this.logger.error(MessageEnum.APIH_GENERAL_EXCEPTION, "AAI", "Client init", MsoLogger.ErrorCode.UnknownError, "could not create SSL client", e); + throw new RuntimeException(e); + } + return client; + } + + private KeyStore getKeyStore() { + KeyStore ks = null; + char[] password = System.getProperty(RestClientSSL.SSL_KEY_STORE_PASSWORD_KEY).toCharArray(); + FileInputStream fis = null; + try { + ks = KeyStore.getInstance(KeyStore.getDefaultType()); + fis = new FileInputStream(System.getProperty(RestClientSSL.SSL_KEY_STORE_KEY)); + ks.load(fis, password); + } + catch(Exception e) { + return null; + } + finally { + if (fis != null) { + try { + fis.close(); + } + catch(Exception e) {} + } + } + return ks; + } +} diff --git a/common/src/main/java/org/onap/so/client/RestProperties.java b/common/src/main/java/org/onap/so/client/RestProperties.java new file mode 100644 index 0000000000..7043e89b1e --- /dev/null +++ b/common/src/main/java/org/onap/so/client/RestProperties.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import java.net.MalformedURLException; +import java.net.URL; + +public interface RestProperties { + + public URL getEndpoint() throws MalformedURLException; + public String getSystemName(); + public default Integer getRetries() { + return Integer.valueOf(2); + } + public default Long getDelayBetweenRetries() { + return Long.valueOf(500); + } + public default boolean mapNotFoundToEmpty() { + return false; + } +} diff --git a/common/src/main/java/org/onap/so/client/RestPropertiesLoader.java b/common/src/main/java/org/onap/so/client/RestPropertiesLoader.java new file mode 100644 index 0000000000..570b48ecb8 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/RestPropertiesLoader.java @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client; + +import java.util.Iterator; +import java.util.ServiceLoader; + +public class RestPropertiesLoader { + + /* required to make ServiceLoader thread safe */ + private static final ThreadLocal<ServiceLoader<RestProperties>> services = new ThreadLocal<ServiceLoader<RestProperties>>() { + @Override + protected ServiceLoader<RestProperties> initialValue() { + return ServiceLoader.load(RestProperties.class); + } + }; + private RestPropertiesLoader() { + } + + private static class Helper { + private static final RestPropertiesLoader INSTANCE = new RestPropertiesLoader(); + } + + public static RestPropertiesLoader getInstance() { + return Helper.INSTANCE; + } + + public <T> T getNewImpl(Class<? extends RestProperties> clazz) { + return this.getImpl(clazz, true); + } + public <T> T getImpl(Class<? extends RestProperties> clazz) { + return this.getImpl(clazz, false); + } + + private <T> T getImpl(Class<? extends RestProperties> clazz, boolean forceNewInstance) { + T result = null; + ServiceLoader<RestProperties> loader = this.services.get(); + Iterator<RestProperties> propertyImpls = loader.iterator(); + RestProperties item; + while (propertyImpls.hasNext()) { + item = propertyImpls.next(); + if (clazz.isAssignableFrom(item.getClass())) { + try { + if (forceNewInstance) { + result = (T)item.getClass().newInstance(); + } else { + result = (T)item; + } + } catch (InstantiationException | IllegalAccessException e) { + /* all spi implementations must provide a public + * no argument constructor + */ + + } + //break; + } + } + + return result; + } +} diff --git a/common/src/main/java/org/onap/so/client/RestRequest.java b/common/src/main/java/org/onap/so/client/RestRequest.java new file mode 100644 index 0000000000..25bf54b643 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/RestRequest.java @@ -0,0 +1,91 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client; + +import java.util.Optional; +import java.util.concurrent.Callable; + +import javax.ws.rs.NotFoundException; +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.onap.so.logger.MsoLogger; + +public class RestRequest implements Callable<Response> { + + private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL, RestRequest.class); + + private final RestClient client; + private final String method; + private final Object entity; + + public RestRequest(RestClient client, String method, Object entity) { + this.client = client; + this.method = method; + this.entity = entity; + } + @Override + public Response call() throws Exception { + final Response response; + if ("GET".equals(method)) { + response = this.client.getBuilder().accept(this.client.getAccept()).get(); + } else if ("POST".equals(method)) { + response = this.client.getBuilder().accept(this.client.getAccept()).post(Entity.entity(entity, this.client.getContentType())); + } else if ("PATCH".equals(method)) { + response = this.client.getBuilder().header("X-HTTP-Method-Override", "PATCH").accept(this.client.getAccept()) + .post(Entity.entity(entity, this.client.getMergeContentType())); + } else if ("DELETE".equals(method)) { + if (entity == null) { + response = this.client.getBuilder().accept(this.client.getAccept()).delete(); + + } else { + response = this.client.getBuilder().header("X-HTTP-Method-Override", "DELETE").accept(this.client.getAccept()) + .post(Entity.entity(entity, this.client.getContentType())); + } + } else if ("PUT".equals(method)) { + response = this.client.getBuilder().accept(this.client.getAccept()).put(Entity.entity(entity, this.client.getContentType())); + } else { + response = Response.serverError().entity(method + " not valid").build(); + } + + Optional<ResponseExceptionMapper> mapper = this.client.addResponseExceptionMapper(); + if (mapper.isPresent()) { + try { + mapper.get().map(response); + } catch (NotFoundException e) { + if (this.client.props.mapNotFoundToEmpty()) { + msoLogger.error(e); + return response; + } else { + throw e; + } + } + } else { + if (response.getStatus() == Status.NOT_FOUND.getStatusCode() && this.client.props.mapNotFoundToEmpty()) { + return response; + } + } + + return response; + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIClient.java b/common/src/main/java/org/onap/so/client/aai/AAIClient.java new file mode 100644 index 0000000000..39843b2263 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIClient.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.net.URI; + +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.RestClient; +import org.onap.so.client.graphinventory.GraphInventoryClient; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class AAIClient extends GraphInventoryClient { + + private static final String AAI_ROOT = "/aai"; + protected static Logger logger = LoggerFactory.getLogger(AAIClient.class); + protected AAIVersion version; + public AAIClient() { + super(AAIProperties.class); + } + + public AAIClient(AAIVersion version) { + super(AAIProperties.class); + } + @Override + protected URI constructPath(GraphInventoryUri uri) { + + return UriBuilder.fromUri(AAI_ROOT + "/" + this.getVersion().toString() + uri.build().toString()).build(); + } + @Override + protected RestClient createClient(GraphInventoryUri uri) { + return new AAIRestClient(getRestProperties(), constructPath(uri)); + } + + protected AAIVersion getVersion() { + if (version == null) { + return this.<AAIProperties>getRestProperties().getDefaultVersion(); + } else { + return this.version; + } + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIClientResponseExceptionMapper.java b/common/src/main/java/org/onap/so/client/aai/AAIClientResponseExceptionMapper.java new file mode 100644 index 0000000000..514eab6fc4 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIClientResponseExceptionMapper.java @@ -0,0 +1,63 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.io.IOException; +import java.util.Optional; + +import javax.annotation.Priority; +import javax.ws.rs.ext.Provider; + +import javax.annotation.Priority; +import javax.ws.rs.ext.Provider; + +import org.onap.so.client.ResponseExceptionMapper; +import org.onap.so.client.aai.entities.AAIError; +import org.onap.so.logger.MsoLogger; +import org.slf4j.MDC; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Provider +@Priority(Integer.MIN_VALUE) +public class AAIClientResponseExceptionMapper extends ResponseExceptionMapper { + + private final String requestId; + public AAIClientResponseExceptionMapper() { + this.requestId = MDC.get(MsoLogger.REQUEST_ID); + } + @Override + public Optional<String> extractMessage(String entity) { + + String errorString = "Error calling A&AI. Request-Id=" + this.getRequestId() + " "; + try { + AAIError error = new ObjectMapper().readValue(entity, AAIError.class); + AAIErrorFormatter formatter = new AAIErrorFormatter(error); + return Optional.of(errorString + formatter.getMessage()); + } catch (IOException e) { + return Optional.of(errorString + entity); + } + } + + protected String getRequestId() { + return this.requestId; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java new file mode 100644 index 0000000000..33c9769400 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperPatchProvider.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.aai; + +import com.fasterxml.jackson.databind.module.SimpleModule; + +public class AAICommonObjectMapperPatchProvider extends AAICommonObjectMapperProvider { + + + public AAICommonObjectMapperPatchProvider() { + super(); + EmptyStringToNullSerializer sp = new EmptyStringToNullSerializer(); + SimpleModule emptyStringModule = new SimpleModule(); + emptyStringModule.addSerializer(String.class, sp); + mapper.registerModule(emptyStringModule); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java new file mode 100644 index 0000000000..0e2071842f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAICommonObjectMapperProvider.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import org.onap.so.client.policy.CommonObjectMapperProvider; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.AnnotationIntrospector; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; +import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; + +public class AAICommonObjectMapperProvider extends CommonObjectMapperProvider { + + public AAICommonObjectMapperProvider() { + mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + mapper.enable(MapperFeature.USE_ANNOTATIONS); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); + mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); + AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector(); + // first Jaxb, second Jackson annotations + mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson)); + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIConfigurationClient.java b/common/src/main/java/org/onap/so/client/aai/AAIConfigurationClient.java new file mode 100644 index 0000000000..b29c8070c8 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIConfigurationClient.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import org.onap.so.client.aai.entities.Configuration; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.serviceinstancebeans.RequestDetails; + +public class AAIConfigurationClient { + + private AAIResourcesClient aaiClient; + + private static final String ORCHESTRATION_STATUS = "PreCreated"; + + public AAIConfigurationClient() { + aaiClient = new AAIResourcesClient(); + } + + public void createConfiguration(RequestDetails requestDetails, String configurationId, String configurationType, + String configurationSubType) { + + AAIResourceUri uri = getConfigurationURI(configurationId); + Configuration payload = configurePayload(requestDetails, configurationId, configurationType, configurationSubType); + + aaiClient.create(uri, payload); + } + + public Configuration configurePayload(RequestDetails requestDetails, String configurationId, String configurationType, + String configurationSubType) { + + Configuration payload = new Configuration(); + payload.setConfigurationId(configurationId); + payload.setConfigurationType(configurationType); + payload.setConfigurationSubType(configurationSubType); + payload.setModelInvariantId(requestDetails.getModelInfo().getModelInvariantId()); + payload.setModelVersionId(requestDetails.getModelInfo().getModelVersionId()); + payload.setOrchestrationStatus(ORCHESTRATION_STATUS); + payload.setOperationalStatus(""); + payload.setConfigurationSelflink(getConfigurationURI(configurationId).build().getPath()); + payload.setModelCustomizationId(requestDetails.getModelInfo().getModelCustomizationId()); + + return payload; + } + + public void deleteConfiguration(String uuid) { + aaiClient.delete(getConfigurationURI(uuid)); + } + + public void updateOrchestrationStatus(String uuid, String payload) { + aaiClient.update(getConfigurationURI(uuid), payload); + } + + public Configuration getConfiguration(String uuid) { + return aaiClient.get(Configuration.class, getConfigurationURI(uuid)).orElse(null); + } + + public boolean configurationExists(String uuid) { + return aaiClient.exists(getConfigurationURI(uuid)); + } + + public AAIResourceUri getConfigurationURI(String uuid) { + return AAIUriFactory.createResourceUri(AAIObjectType.CONFIGURATION, uuid); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIErrorFormatter.java b/common/src/main/java/org/onap/so/client/aai/AAIErrorFormatter.java new file mode 100644 index 0000000000..6b3bb545de --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIErrorFormatter.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.util.List; + +import org.onap.so.client.aai.entities.AAIError; +import org.onap.so.client.aai.entities.ServiceException; + +public class AAIErrorFormatter { + + private final AAIError error; + public AAIErrorFormatter(AAIError error) { + this.error = error; + } + + public String getMessage() { + if (error.getRequestError() != null && + error.getRequestError().getServiceException() != null) { + ServiceException serviceException = error.getRequestError().getServiceException(); + return this.fillInTemplate(serviceException.getText(), serviceException.getVariables()); + } + + return "no parsable error message found"; + } + + protected String fillInTemplate(String text, List<String> variables) { + for (int i = 0; i < variables.size(); i++) { + variables.set(i, this.format(variables.get(i), variables)); + } + + return format(text, variables); + } + + protected String format(String s, List<String> variables) { + return String.format(s.replaceAll("%(\\d+)", "%$1\\$s"), variables.toArray()); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAINamespaceConstants.java b/common/src/main/java/org/onap/so/client/aai/AAINamespaceConstants.java new file mode 100644 index 0000000000..242fd41b19 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAINamespaceConstants.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +public class AAINamespaceConstants { + + protected static final String CLOUD_INFRASTRUCTURE = "/cloud-infrastructure"; + protected static final String NETWORK = "/network"; + protected static final String BUSINESS = "/business"; + protected static final String SERVICE_DESIGN_AND_CREATION = "/service-design-and-creation"; + + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java new file mode 100644 index 0000000000..c50653a203 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectPlurals.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; + +import com.google.common.base.CaseFormat; + +public enum AAIObjectPlurals implements GraphInventoryObjectPlurals { + + GENERIC_VNF(AAINamespaceConstants.NETWORK, "/generic-vnfs"), + PSERVER(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/pservers"), + P_INTERFACE(AAIObjectType.PSERVER.uriTemplate(), "/p-interfaces"), + L3_NETWORK(AAINamespaceConstants.NETWORK, "/l3-networks"), + SERVICE_SUBSCRIPTION(AAIObjectType.CUSTOMER.uriTemplate(), "/service-subscriptions"), + SERVICE_INSTANCE(AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), "/service-instances"), + OWNING_ENTITIES(AAINamespaceConstants.BUSINESS, "/owning-entities"), + VOLUME_GROUP(AAIObjectType.CLOUD_REGION.uriTemplate(), "/volume-groups/"); + + + private final String uriTemplate; + private final String partialUri; + private AAIObjectPlurals(String parentUri, String partialUri) { + this.uriTemplate = parentUri + partialUri; + this.partialUri = partialUri; + } + + @Override + public String toString() { + return this.uriTemplate(); + } + + @Override + public String uriTemplate() { + return this.uriTemplate; + } + + @Override + public String partialUri() { + return this.partialUri; + } + + @Override + public String typeName() { + return this.typeName(CaseFormat.LOWER_HYPHEN); + } + @Override + public String typeName(CaseFormat format) { + return CaseFormat.UPPER_UNDERSCORE.to(format, this.name()); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java new file mode 100644 index 0000000000..ce75b1716a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIObjectType.java @@ -0,0 +1,104 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import org.onap.so.client.graphinventory.GraphInventoryObjectType; + +import com.google.common.base.CaseFormat; + +public enum AAIObjectType implements GraphInventoryObjectType { + + DEFAULT_CLOUD_REGION(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/cloud-regions/cloud-region/att-aic/{cloud-region-id}"), + CUSTOMER(AAINamespaceConstants.BUSINESS, "/customers/customer/{global-customer-id}"), + GENERIC_QUERY("/search", "/generic-query"), + BULK_PROCESS("/bulkprocess", ""), + GENERIC_VNF(AAINamespaceConstants.NETWORK, "/generic-vnfs/generic-vnf/{vnf-id}"), + VF_MODULE(AAIObjectType.GENERIC_VNF.uriTemplate(), "/vf-modules/vf-module/{vf-module-id}"), + L3_NETWORK(AAINamespaceConstants.NETWORK, "/l3-networks/l3-network/{network-id}"), + NETWORK_POLICY(AAINamespaceConstants.NETWORK, "/network-policies/network-policy/{network-policy-id}"), + NODES_QUERY("/search", "/nodes-query"), + CUSTOM_QUERY("/query", ""), + ROUTE_TABLE_REFERENCE(AAINamespaceConstants.NETWORK, "/route-table-references/route-table-reference/{route-table-reference-id}"), + DEFAULT_TENANT(AAINamespaceConstants.CLOUD_INFRASTRUCTURE + "/cloud-regions/cloud-region/att-aic/AAIAIC25", "/tenants/tenant/{tenant-id}"), + VCE(AAINamespaceConstants.NETWORK, "/vces/vce/{vnf-id}"), + VPN_BINDING(AAINamespaceConstants.NETWORK, "/vpn-bindings/vpn-binding/{vpn-id}"), + VPN_BINDINGS(AAINamespaceConstants.NETWORK, "/vpn-bindings"), + CONFIGURATION(AAINamespaceConstants.NETWORK, "/configurations/configuration/{configuration-id}"), + PSERVER(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/pservers/pserver/{hostname}"), + SERVICE_SUBSCRIPTION(AAIObjectType.CUSTOMER.uriTemplate(), "/service-subscriptions/service-subscription/{service-type}"), + SERVICE_INSTANCE(AAIObjectType.SERVICE_SUBSCRIPTION.uriTemplate(), "/service-instances/service-instance/{service-instance-id}"), + PROJECT(AAINamespaceConstants.BUSINESS, "/projects/project/{id}"), + LINE_OF_BUSINESS(AAINamespaceConstants.BUSINESS, "/lines-of-business/line-of-business/{id}"), + PLATFORM(AAINamespaceConstants.BUSINESS, "/platforms/platform/{id}"), + OWNING_ENTITY(AAINamespaceConstants.BUSINESS, "/owning-entities/owning-entity/{id}"), + ALLOTTED_RESOURCE(AAIObjectType.SERVICE_INSTANCE.uriTemplate(), "/allotted-resources/allotted-resource/{id}"), + PNF(AAINamespaceConstants.NETWORK, "/pnfs/pnf/{pnf-name}"), + OPERATIONAL_ENVIRONMENT(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/operational-environments/operational-environment/{operational-environment-id}"), + CLOUD_REGION(AAINamespaceConstants.CLOUD_INFRASTRUCTURE, "/cloud-regions/cloud-region/{cloud-owner-id}/{cloud-region-id}"), + TENANT(AAIObjectType.CLOUD_REGION.uriTemplate(), "/tenants/tenant/{tenant-id}"), + VOLUME_GROUP(AAIObjectType.CLOUD_REGION.uriTemplate(), "/volume-groups/volume-group/{volume-group-id}"), + VSERVER(AAIObjectType.TENANT.uriTemplate(), "/vservers/vserver/{vserver-id}"), + MODEL_VER(AAINamespaceConstants.SERVICE_DESIGN_AND_CREATION + "/models/model/{model-invariant-id}", "/model-vers/model-ver/{model-version-id}"), + TUNNEL_XCONNECT(AAIObjectType.ALLOTTED_RESOURCE.uriTemplate(), "/tunnel-xconnects/tunnel-xconnect/{tunnel-id}"), + P_INTERFACE(AAIObjectType.PSERVER.uriTemplate(), "/p-interfaces/p-interface/{interface-name}"), + PHYSICAL_LINK(AAINamespaceConstants.NETWORK, "/physical-links/physical-link/{link-name}"), + INSTANCE_GROUP(AAINamespaceConstants.NETWORK, "/instance-groups/instance-group/{id}"), + COLLECTION(AAINamespaceConstants.NETWORK, "/collections/collection/{collection-id}"), + UNKNOWN("", ""); + + private final String uriTemplate; + private final String parentUri; + private final String partialUri; + private AAIObjectType(String parentUri, String partialUri) { + this.parentUri = parentUri; + this.partialUri = partialUri; + this.uriTemplate = parentUri + partialUri; + } + + @Override + public String toString() { + return this.uriTemplate(); + } + + @Override + public String typeName() { + return this.typeName(CaseFormat.LOWER_HYPHEN); + } + @Override + public String typeName(CaseFormat format) { + String enumName = this.name(); + if (this.equals(AAIObjectType.DEFAULT_CLOUD_REGION) || this.equals(AAIObjectType.DEFAULT_TENANT)) { + enumName = enumName.replace("DEFAULT_", ""); + } + + return CaseFormat.UPPER_UNDERSCORE.to(format, enumName); + } + + @Override + public String uriTemplate() { + return this.uriTemplate; + } + + @Override + public String partialUri() { + return this.partialUri; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIProperties.java b/common/src/main/java/org/onap/so/client/aai/AAIProperties.java new file mode 100644 index 0000000000..9f6708200c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIProperties.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import org.onap.so.client.RestProperties; + +public interface AAIProperties extends RestProperties { + + public AAIVersion getDefaultVersion(); + public String getAuth(); + public String getKey(); + @Override + public default boolean mapNotFoundToEmpty() { + return true; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java b/common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java new file mode 100644 index 0000000000..184b4e5251 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIQueryClient.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.util.Optional; + +import org.onap.so.client.RestClient; +import org.onap.so.client.aai.entities.CustomQuery; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; + +public class AAIQueryClient extends AAIClient { + + private Optional<String> depth = Optional.empty(); + private boolean nodesOnly = false; + private Optional<AAISubgraphType> subgraph = Optional.empty(); + + public AAIQueryClient() { + super(); + } + + public AAIQueryClient(AAIVersion version) { + super(); + this.version = version; + } + + public String query(Format format, CustomQuery query) { + return this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.CUSTOM_QUERY).queryParam("format", format.toString())) + .put(query, String.class); + } + + public AAIQueryClient depth (String depth) { + this.depth = Optional.of(depth); + return this; + } + public AAIQueryClient nodesOnly() { + this.nodesOnly = true; + return this; + } + public AAIQueryClient subgraph(AAISubgraphType type){ + + subgraph = Optional.of(type); + + return this; + } + + protected GraphInventoryUri setupQueryParams(GraphInventoryUri uri) { + GraphInventoryUri clone = uri.clone(); + if (this.depth.isPresent()) { + clone.queryParam("depth", depth.get()); + } + if (this.nodesOnly) { + clone.queryParam("nodesOnly", ""); + } + if (this.subgraph.isPresent()) { + clone.queryParam("subgraph", this.subgraph.get().toString()); + } + return clone; + } + @Override + protected RestClient createClient(GraphInventoryUri uri) { + return super.createClient(setupQueryParams(uri)); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIQueryObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/aai/AAIQueryObjectMapperProvider.java new file mode 100644 index 0000000000..d5eeb83041 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIQueryObjectMapperProvider.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import com.fasterxml.jackson.databind.AnnotationIntrospector; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; +import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector; + +public class AAIQueryObjectMapperProvider extends AAICommonObjectMapperProvider { + + public AAIQueryObjectMapperProvider() { + super(); + AnnotationIntrospector aiJaxb = new JaxbAnnotationIntrospector(TypeFactory.defaultInstance()); + AnnotationIntrospector aiJackson = new JacksonAnnotationIntrospector(); + // first Jaxb, second Jackson annotations + mapper.setAnnotationIntrospector(AnnotationIntrospector.pair(aiJaxb, aiJackson)); + + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java b/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java new file mode 100644 index 0000000000..04757c6fc2 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIResourcesClient.java @@ -0,0 +1,254 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.lang.reflect.InvocationTargetException; +import java.util.Map; +import java.util.Optional; + +import javax.ws.rs.NotFoundException; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.onap.aai.domain.yang.Relationship; +import org.onap.so.client.RestClient; +import org.onap.so.client.RestProperties; +import org.onap.so.client.aai.entities.AAIResultWrapper; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUri; +import org.onap.so.client.graphinventory.entities.uri.Depth; + +public class AAIResourcesClient extends AAIClient { + + public AAIResourcesClient() { + super(); + } + + public AAIResourcesClient(AAIVersion version) { + super(); + this.version = version; + } + + /** + * creates a new object in A&AI + * + * @param obj - can be any object which will marshal into a valid A&AI payload + * @param uri + * @return + */ + public void create(AAIResourceUri uri, Object obj) { + RestClient aaiRC = this.createClient(uri); + aaiRC.put(obj); + return; + } + + /** + * creates a new object in A&AI with no payload body + * + * @param uri + * @return + */ + public void createEmpty(AAIResourceUri uri) { + RestClient aaiRC = this.createClient(uri); + aaiRC.put(""); + return; + } + + /** + * returns false if the object does not exist in A&AI + * + * @param uri + * @return + */ + public boolean exists(AAIResourceUri uri) { + AAIUri forceMinimal = this.addParams(Optional.of(Depth.ZERO), true, uri); + RestClient aaiRC = this.createClient(forceMinimal); + + return aaiRC.get().getStatus() == Status.OK.getStatusCode(); + } + + /** + * Adds a relationship between two objects in A&AI + * @param uriA + * @param uriB + * @return + */ + public void connect(AAIResourceUri uriA, AAIResourceUri uriB) { + AAIResourceUri uriAClone = uriA.clone(); + RestClient aaiRC = this.createClient(uriAClone.relationshipAPI()); + aaiRC.put(this.buildRelationship(uriB)); + return; + } + + /** + * Removes relationship from two objects in A&AI + * + * @param uriA + * @param uriB + * @return + */ + public void disconnect(AAIResourceUri uriA, AAIResourceUri uriB) { + AAIResourceUri uriAClone = uriA.clone(); + RestClient aaiRC = this.createClient(uriAClone.relationshipAPI()); + aaiRC.delete(this.buildRelationship(uriB)); + return; + } + + /** + * Deletes object from A&AI. Automatically handles resource-version. + * + * @param uri + * @return + */ + public void delete(AAIResourceUri uri) { + AAIResourceUri clone = uri.clone(); + RestClient aaiRC = this.createClient(clone); + Map<String, Object> result = aaiRC.get(new GenericType<Map<String, Object>>(){}) + .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI")); + String resourceVersion = (String) result.get("resource-version"); + aaiRC = this.createClient(clone.resourceVersion(resourceVersion)); + aaiRC.delete(); + return; + } + + /** + * @param obj - can be any object which will marshal into a valid A&AI payload + * @param uri + * @return + */ + public void update(AAIResourceUri uri, Object obj) { + RestClient aaiRC = this.createClient(uri); + aaiRC.patch(obj); + return; + } + + /** + * Retrieves an object from A&AI and unmarshalls it into the Class specified + * @param clazz + * @param uri + * @return + */ + public <T> Optional<T> get(Class<T> clazz, AAIResourceUri uri) { + return this.createClient(uri).get(clazz); + } + + /** + * Retrieves an object from A&AI and returns complete response + * @param uri + * @return + */ + public Response getFullResponse(AAIResourceUri uri) { + return this.createClient(uri).get(); + } + + /** + * Retrieves an object from A&AI and automatically unmarshalls it into a Map or List + * @param resultClass + * @param uri + * @return + */ + public <T> Optional<T> get(GenericType<T> resultClass, AAIResourceUri uri) { + return this.createClient(uri).get(resultClass); + } + + /** + * Retrieves an object from A&AI wrapped in a helper class which offer additional features + * + * @param uri + * @return + */ + public AAIResultWrapper get(AAIResourceUri uri) { + String json = this.createClient(uri).get(String.class).orElse(null); + return new AAIResultWrapper(json); + } + + /** + * Retrieves an object from A&AI wrapped in a helper class which offer additional features + * If the object cannot be found in A&AI the method will throw the runtime exception + * included as an argument + * @param uri + * @return + */ + public AAIResultWrapper get(AAIResourceUri uri, Class<? extends RuntimeException> c) { + + RuntimeException e; + try { + e = c.getConstructor(String.class).newInstance(uri.build() + " not found in A&AI"); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException + | NoSuchMethodException | SecurityException e1) { + throw new IllegalArgumentException("could not create instance for " + c.getName()); + } + String json = this.createClient(uri).get(String.class) + .orElseThrow(() -> e); + return new AAIResultWrapper(json); + } + + private Relationship buildRelationship(AAIResourceUri uri) { + final Relationship result = new Relationship(); + result.setRelatedLink(uri.build().toString()); + return result; + } + + /** + * Will automatically create the object if it does not exist + * + * @param obj - Optional object which serializes to a valid A&AI payload + * @param uri + * @return + */ + public AAIResourcesClient createIfNotExists(AAIResourceUri uri, Optional<Object> obj) { + if(!this.exists(uri)){ + if (obj.isPresent()) { + this.create(uri, obj.get()); + } else { + this.createEmpty(uri); + } + + } + return this; + } + + /** + * Starts a transaction which encloses multiple A&AI mutations + * + * @return + */ + public AAITransactionalClient beginTransaction() { + return new AAITransactionalClient(this.getVersion()); + } + + private AAIUri addParams(Optional<Depth> depth, boolean nodesOnly, AAIUri uri) { + AAIUri clone = uri.clone(); + if (depth.isPresent()) { + clone.depth(depth.get()); + } + if (nodesOnly) { + clone.nodesOnly(nodesOnly); + } + + return clone; + } + @Override + protected <T extends RestProperties> T getRestProperties() { + return super.getRestProperties(); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIResourcesObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/aai/AAIResourcesObjectMapperProvider.java new file mode 100644 index 0000000000..15f2ed2fa2 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIResourcesObjectMapperProvider.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +public class AAIResourcesObjectMapperProvider extends AAICommonObjectMapperProvider { + + public AAIResourcesObjectMapperProvider() { + super(); + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIRestClient.java b/common/src/main/java/org/onap/so/client/aai/AAIRestClient.java new file mode 100644 index 0000000000..2bd5f118c0 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIRestClient.java @@ -0,0 +1,131 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.net.URI; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.regex.Pattern; + +import javax.ws.rs.core.Response; + +import org.onap.so.client.ResponseExceptionMapper; +import org.onap.so.client.RestClientSSL; +import org.onap.so.client.graphinventory.exceptions.GraphInventoryPatchDepthExceededException; +import org.onap.so.client.policy.CommonObjectMapperProvider; +import org.onap.so.jsonpath.JsonPathUtil; +import org.onap.so.utils.TargetEntity; + +import com.fasterxml.jackson.core.JsonProcessingException; + +public class AAIRestClient extends RestClientSSL { + + private final AAIProperties aaiProperties; + private static final AAICommonObjectMapperProvider standardProvider = new AAICommonObjectMapperProvider(); + private static final AAICommonObjectMapperPatchProvider patchProvider = new AAICommonObjectMapperPatchProvider(); + private static final Pattern LOCATE_COMPLEX_OBJECT = Pattern.compile("^((?!relationship-list).)+?\\['[^\\[\\]]+?'\\]$"); + + protected AAIRestClient(AAIProperties props, URI uri) { + super(props, Optional.of(uri)); + this.aaiProperties = props; + } + + @Override + public TargetEntity getTargetEntity(){ + return TargetEntity.AAI; + } + + @Override + protected void initializeHeaderMap(Map<String, String> headerMap) { + headerMap.put("X-FromAppId", "MSO"); + headerMap.put("X-TransactionId", requestId); + String auth = aaiProperties.getAuth(); + String key = aaiProperties.getKey(); + + if (auth != null && !auth.isEmpty() && key != null && !key.isEmpty()) { + addBasicAuthHeader(auth, key); + } + } + + @Override + protected Optional<ResponseExceptionMapper> addResponseExceptionMapper() { + + return Optional.of(new AAIClientResponseExceptionMapper()); + } + + @Override + protected CommonObjectMapperProvider getCommonObjectMapperProvider() { + return standardProvider; + } + + @Override + public Response patch(Object obj) { + String value = convertObjectToPatchFormat(obj); + validatePatchObject(value); + return super.patch(value); + } + + @Override + public <T> T patch(Object obj, Class<T> resultClass) { + String value = convertObjectToPatchFormat(obj); + validatePatchObject(value); + return super.patch(value, resultClass); + } + + protected String convertObjectToPatchFormat(Object obj) { + Object value = obj; + try { + if (!(obj instanceof Map || obj instanceof String)) { + value = patchProvider.getMapper().writeValueAsString(obj); + } else if (obj instanceof Map) { + value = standardProvider.getMapper().writeValueAsString(obj); + } + } catch (JsonProcessingException e) { + value = "{}"; + } + + return (String)value; + } + + + protected void validatePatchObject(String payload) { + if (hasComplexObject(payload)) { + throw new GraphInventoryPatchDepthExceededException(payload); + } + } + + /** validates client side that json does not include any complex objects + * relationship-list is omitted from this validation + */ + protected boolean hasComplexObject(String json) { + if (json.isEmpty()) { + return false; + } + String complex = "$.*.*"; + String array = "$.*.*.*"; + List<String> result = JsonPathUtil.getInstance().getPathList(json, complex); + List<String> result2 = JsonPathUtil.getInstance().getPathList(json, array); + + result.addAll(result2); + return result.stream().anyMatch(item -> LOCATE_COMPLEX_OBJECT.matcher(item).find()); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIRestClientI.java b/common/src/main/java/org/onap/so/client/aai/AAIRestClientI.java new file mode 100644 index 0000000000..b56a6779cc --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIRestClientI.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.Optional; + +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.aai.domain.yang.Pnf; +import org.onap.aai.domain.yang.Pserver; +import org.onap.aai.domain.yang.Pservers; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; + +public interface AAIRestClientI { + + Pservers getPhysicalServers(String hostName, String uuid); + + List<Pserver> getPhysicalServerByVnfId(String vnfId, String transactionLoggingUuid) throws UnsupportedEncodingException, JsonParseException, JsonMappingException, IOException; + + void updateMaintenceFlag(String vnfId,boolean inMaint, String transactionLoggingUuid) throws Exception; + + void updateMaintenceFlagVnfId(String vnfId, boolean inMaint, String transactionLoggingUuid) throws Exception; + + GenericVnf getVnfByName(String vnfId, String transactionLoggingUuid) throws Exception; + + Optional<Pnf> getPnfByName(String pnfId, String transactionLoggingUuid) throws Exception; + + void createPnf(String pnfId, String transactionLoggingUuid, Pnf pnf) throws IOException; +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIRestClientImpl.java b/common/src/main/java/org/onap/so/client/aai/AAIRestClientImpl.java new file mode 100644 index 0000000000..b471a1e53d --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIRestClientImpl.java @@ -0,0 +1,197 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import javax.ws.rs.core.Response; +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.aai.domain.yang.GenericVnfs; +import org.onap.aai.domain.yang.Pnf; +import org.onap.aai.domain.yang.Pserver; +import org.onap.aai.domain.yang.Pservers; +import org.onap.so.client.aai.entities.CustomQuery; +import org.onap.so.client.aai.entities.Results; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.graphinventory.Format; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + + + +public class AAIRestClientImpl implements AAIRestClientI { + + private static Logger logger = LoggerFactory.getLogger(AAIClient.class); + private static final AAIVersion ENDPOINT_VERSION = AAIVersion.V10; + private static final String ENDPOINT_GET_ALL = ENDPOINT_VERSION + "/cloud-infrastructure/pservers"; + private static final String ENDPOINT_GET_ALL_VNFS = ENDPOINT_VERSION + "/network/generic-vnfs"; + private static final String ENDPOINT_CUSTOM_QUERY = ENDPOINT_VERSION + "/query"; + private static final String PSERVER_VNF_QUERY = "pservers-fromVnf"; + private static final String GENERIC_VNF_PATH = ENDPOINT_VERSION + "/network/generic-vnfs/generic-vnf"; + private static final String SERVICE_TOPOLOGY_BY_SERVICE_INSTANCE_ID = + "store(‘x’).union(__.in(‘subscribesTo’).has(‘aai-node-type’,’customer’).store(‘x’),__.out(‘uses’).has(‘aai-node-type’,’allotted-resource’).store(‘x’),__.in(‘hasInstance’).has(‘aai-node-type’,’generic-vnf’).store(‘x’).union(" + + ".out(‘has’).has(‘aai-node-type’,’vf-module’).store(‘x’),out(‘uses’).has(‘aai-node-type’,’volume-group’).store(‘x’)," + + ".out(‘hasLInterface’).has(‘aai-node-type’,’l-interface’).union(" + + ".out(‘hasIpAddress’).has(‘aai-node-type’,’l3-interface-ipv4-address’).store(‘x’).out(‘isMemberOf’).has(‘aai-node-type’,’l3-network’).store(‘x’)," + + ".out(‘hasIpAddress’).has(‘aai-node-type’,’l3-interface-ipv6-address’).store(‘x’).out(‘isMemberOf’).has(‘aai-node-type’,’l3-network’).store(‘x’)" + + ")," + ".out(‘runsOnVserver’).has(‘aai-node-type’,’vserver’).store(‘x’).union(" + + ".in(‘owns’).has(‘aai-node-type’,’tenant’).store(‘x’).in(‘has’).has(‘aai-node-type’,’cloud-region’).store(‘x’)," + + ".out(‘runsOnPserver’).has(‘aai-node-type’,’pserver’).store(‘x’)," + + ".out(‘hasLInterface’).has(‘aai-node-type’,’l-interface’).union(" + + ".out(‘hasIpAddress’).has(‘aai-node-type’,’l3-interface-ipv4-address’).store(‘x’).out(‘isMemberOf’).has(‘aai-node-type’,’l3-network’).store(‘x’)," + + ".out(‘hasIpAddress’).has(‘aai-node-type’,’l3-interface-ipv6-address’).store(‘x’).out(‘isMemberOf’).has(‘aai-node-type’,’l3-network’).store(‘x’)" + + ")" + ")" + ")" + ").cap(‘x’).unfold().dedup()"; + + public AAIRestClientImpl() { + } + + @Override + public Pservers getPhysicalServers(String hostName, String uuid) { + UUID requestId; + try { + requestId = UUID.fromString(uuid); + } catch (IllegalArgumentException e) { + logger.warn("could not parse uuid: " + uuid + " creating valid uuid automatically"); + requestId = UUID.randomUUID(); + } + return new AAIResourcesClient(ENDPOINT_VERSION) + .get(Pservers.class, AAIUriFactory.createResourceUri(AAIObjectPlurals.PSERVER)).orElse(null); + } + + @Override + public List<Pserver> getPhysicalServerByVnfId(String vnfId, String transactionLoggingUuid) throws IOException { + UUID requestId; + try { + requestId = UUID.fromString(transactionLoggingUuid); + } catch (IllegalArgumentException e) { + logger.warn("could not parse uuid: " + transactionLoggingUuid + " creating valid uuid automatically"); + requestId = UUID.randomUUID(); + } + List<AAIResourceUri> startNodes = new ArrayList<>(); + startNodes.add(AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)); + String jsonInput = new AAIQueryClient(ENDPOINT_VERSION) + .query(Format.RESOURCE, new CustomQuery(startNodes, PSERVER_VNF_QUERY)); + + return this.getListOfPservers(jsonInput); + + } + + protected List<Pserver> getListOfPservers(String jsonInput) throws IOException { + ObjectMapper mapper = new AAICommonObjectMapperProvider().getMapper(); + Results<Map<String, Pserver>> resultsFromJson = mapper.readValue(jsonInput, + new TypeReference<Results<Map<String, Pserver>>>() { + }); + List<Pserver> results = new ArrayList<>(); + for (Map<String, Pserver> m : resultsFromJson.getResult()) { + results.add(m.get("pserver")); + } + return results; + } + + @Override + public void updateMaintenceFlag(String vnfName, boolean inMaint, String transactionLoggingUuid) throws IOException { + UUID requestId; + try { + requestId = UUID.fromString(transactionLoggingUuid); + } catch (IllegalArgumentException e) { + logger.warn("could not parse uuid: " + transactionLoggingUuid + " creating valid uuid automatically"); + requestId = UUID.randomUUID(); + } + GenericVnfs genericVnfs = new AAIResourcesClient(ENDPOINT_VERSION).get(GenericVnfs.class, + AAIUriFactory.createResourceUri(AAIObjectPlurals.GENERIC_VNF).queryParam("vnf-name", vnfName)).orElse(null); + if (genericVnfs.getGenericVnf().size() > 1) { + throw new IndexOutOfBoundsException("Multiple Generic Vnfs Returned"); + } + + GenericVnf genericVnf = genericVnfs.getGenericVnf().get(0); + updateMaintenceFlagVnfId(genericVnf.getVnfId(), inMaint, transactionLoggingUuid); + } + + @Override + public void updateMaintenceFlagVnfId(String vnfId, boolean inMaint, String transactionLoggingUuid) + throws IOException { + UUID requestId; + try { + requestId = UUID.fromString(transactionLoggingUuid); + } catch (IllegalArgumentException e) { + logger.warn("could not parse uuid: " + transactionLoggingUuid + " creating valid uuid automatically"); + requestId = UUID.randomUUID(); + } + GenericVnf genericVnf = new GenericVnf(); + genericVnf.setInMaint(inMaint); + new AAIResourcesClient(ENDPOINT_VERSION) + .update(AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId), genericVnf); + + } + + @Override + public GenericVnf getVnfByName(String vnfId, String transactionLoggingUuid) throws IOException { + UUID requestId; + try { + requestId = UUID.fromString(transactionLoggingUuid); + } catch (IllegalArgumentException e) { + logger.warn("could not parse uuid: " + transactionLoggingUuid + " creating valid uuid automatically"); + requestId = UUID.randomUUID(); + } + return new AAIResourcesClient(ENDPOINT_VERSION) + .get(GenericVnf.class, AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId)).orElse(null); + } + + @Override + public Optional<Pnf> getPnfByName(String pnfId, String transactionLoggingUuid) throws IOException { + UUID requestId; + try { + requestId = UUID.fromString(transactionLoggingUuid); + } catch (IllegalArgumentException e) { + logger.warn("could not parse uuid: " + transactionLoggingUuid + " creating valid uuid automatically", e); + requestId = UUID.randomUUID(); + } + Response response = new AAIResourcesClient(ENDPOINT_VERSION) + .getFullResponse(AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnfId)); + if (response.getStatus() != 200) { + return Optional.empty(); + } else { + return Optional.of(response.readEntity(Pnf.class)); + } + } + + @Override + public void createPnf(String pnfId, String transactionLoggingUuid, Pnf pnf) throws IOException { + UUID requestId; + try { + requestId = UUID.fromString(transactionLoggingUuid); + } catch (IllegalArgumentException e) { + logger.warn("could not parse uuid: " + transactionLoggingUuid + " creating valid uuid automatically", e); + requestId = UUID.randomUUID(); + } + new AAIResourcesClient(ENDPOINT_VERSION) + .createIfNotExists(AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnfId), Optional.of(pnf)); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAISubgraphType.java b/common/src/main/java/org/onap/so/client/aai/AAISubgraphType.java new file mode 100644 index 0000000000..e9beb143fd --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAISubgraphType.java @@ -0,0 +1,38 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + + +public enum AAISubgraphType { + STAR("star"), + PRUNE("prune"); + + private final String name; + + private AAISubgraphType(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java b/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java new file mode 100644 index 0000000000..884d2aaec6 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAITransactionalClient.java @@ -0,0 +1,264 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; + +import javax.ws.rs.NotFoundException; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.Response; + +import org.onap.aai.domain.yang.Relationship; +import org.onap.so.client.RestClient; +import org.onap.so.client.aai.entities.AAIError; +import org.onap.so.client.aai.entities.bulkprocess.OperationBody; +import org.onap.so.client.aai.entities.bulkprocess.Transaction; +import org.onap.so.client.aai.entities.bulkprocess.Transactions; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.graphinventory.exceptions.BulkProcessFailed; +import org.onap.so.jsonpath.JsonPathUtil; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Joiner; + +public class AAITransactionalClient extends AAIClient { + + private final Transactions transactions; + private Transaction currentTransaction; + private final AAIVersion version; + private int actionCount = 0; + protected AAITransactionalClient(AAIVersion version) { + super(); + this.version = version; + this.transactions = new Transactions(); + startTransaction(); + } + + private void startTransaction() { + Transaction transaction = new Transaction(); + transactions.getTransactions().add(transaction); + currentTransaction = transaction; + } + + /** + * adds an additional transaction and closes the previous transaction + * + * @return AAITransactionalClient + */ + public AAITransactionalClient beginNewTransaction() { + startTransaction(); + return this; + } + + /** + * creates a new object in A&AI + * + * @param obj - can be any object which will marshal into a valid A&AI payload + * @param uri + * @return + */ + public AAITransactionalClient create(AAIResourceUri uri, Object obj) { + currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(obj)); + incrementActionAmount(); + return this; + } + + /** + * creates a new object in A&AI with no payload body + * + * @param uri + * @return + */ + public AAITransactionalClient createEmpty(AAIResourceUri uri) { + currentTransaction.getPut().add(new OperationBody().withUri(uri.build().toString()).withBody(new HashMap<String, String>())); + incrementActionAmount(); + return this; + } + + /** + * Adds a relationship between two objects in A&AI + * @param uriA + * @param uriB + * @return + */ + public AAITransactionalClient connect(AAIResourceUri uriA, AAIResourceUri uriB) { + AAIResourceUri uriAClone = uriA.clone(); + currentTransaction.getPut().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB))); + incrementActionAmount(); + return this; + } + + /** + * relationship between multiple objects in A&AI - connects A to all objects specified in list + * + * @param uriA + * @param uris + * @return + */ + public AAITransactionalClient connect(AAIResourceUri uriA, List<AAIResourceUri> uris) { + for (AAIResourceUri uri : uris) { + this.connect(uriA, uri); + } + return this; + } + + /** + * Removes relationship from two objects in A&AI + * + * @param uriA + * @param uriB + * @return + */ + public AAITransactionalClient disconnect(AAIResourceUri uriA, AAIResourceUri uriB) { + AAIResourceUri uriAClone = uriA.clone(); + currentTransaction.getDelete().add(new OperationBody().withUri(uriAClone.relationshipAPI().build().toString()).withBody(this.buildRelationship(uriB))); + incrementActionAmount(); + return this; + } + + /** + * Removes relationship from multiple objects - disconnects A from all objects specified in list + * @param uriA + * @param uris + * @return + */ + public AAITransactionalClient disconnect(AAIResourceUri uriA, List<AAIResourceUri> uris) { + for (AAIResourceUri uri : uris) { + this.disconnect(uriA, uri); + } + return this; + } + /** + * Deletes object from A&AI. Automatically handles resource-version. + * + * @param uri + * @return + */ + public AAITransactionalClient delete(AAIResourceUri uri) { + AAIResourcesClient client = new AAIResourcesClient(); + AAIResourceUri clone = uri.clone(); + Map<String, Object> result = client.get(new GenericType<Map<String, Object>>(){}, clone) + .orElseThrow(() -> new NotFoundException(clone.build() + " does not exist in A&AI")); + String resourceVersion = (String) result.get("resource-version"); + currentTransaction.getDelete().add(new OperationBody().withUri(clone.resourceVersion(resourceVersion).build().toString()).withBody("")); + incrementActionAmount(); + return this; + } + + /** + * @param obj - can be any object which will marshal into a valid A&AI payload + * @param uri + * @return + */ + public AAITransactionalClient update(AAIResourceUri uri, Object obj) { + currentTransaction.getPatch().add(new OperationBody().withUri(uri.build().toString()).withBody(obj)); + incrementActionAmount(); + return this; + } + + private void incrementActionAmount() { + actionCount++; + } + /** + * Executes all created transactions in A&AI + * @throws BulkProcessFailed + */ + public void execute() throws BulkProcessFailed { + RestClient client = this.createClient(AAIUriFactory.createResourceUri(AAIObjectType.BULK_PROCESS)); + try { + Response response = client.put(this.transactions); + if (response.hasEntity()) { + final Optional<String> errorMessage = this.locateErrorMessages(response.readEntity(String.class)); + if (errorMessage.isPresent()) { + throw new BulkProcessFailed("One or more transactions failed in A&AI. Check logs for payloads.\nMessages:\n" + errorMessage.get()); + } + } else { + throw new BulkProcessFailed("Transactions acccepted by A&AI, but there was no response. Unsure of result."); + } + } finally { + this.transactions.getTransactions().clear(); + this.currentTransaction = null; + this.actionCount = 0; + } + } + + protected Optional<String> locateErrorMessages(String response) { + final List<String> errorMessages = new ArrayList<>(); + final List<String> results = JsonPathUtil.getInstance().locateResultList(response, "$..body"); + final ObjectMapper mapper = new ObjectMapper(); + if (!results.isEmpty()) { + List<Map<String, Object>> parsed = new ArrayList<>(); + try { + for (String result : results) { + parsed.add(mapper.readValue(result, new TypeReference<Map<String, Object>>(){})); + } + } catch (IOException e) { + logger.error("could not map json", e); + } + for (Map<String, Object> map : parsed) { + for (Entry<String, Object> entry : map.entrySet()) { + if (!entry.getKey().matches("2\\d\\d")) { + AAIError error; + try { + error = mapper.readValue(entry.getValue().toString(), AAIError.class); + } catch (IOException e) { + logger.error("could not parse error object from A&AI", e); + error = new AAIError(); + } + AAIErrorFormatter formatter = new AAIErrorFormatter(error); + String outputMessage = formatter.getMessage(); + logger.error("part of a bulk action failed in A&AI: " + entry.getValue()); + errorMessages.add(outputMessage); + } + } + } + } + + if (!errorMessages.isEmpty()) { + return Optional.of(Joiner.on("\n").join(errorMessages)); + } else { + return Optional.empty(); + } + } + private Relationship buildRelationship(AAIUri uri) { + final Relationship result = new Relationship(); + result.setRelatedLink(uri.build().toString()); + return result; + } + + @Override + protected AAIVersion getVersion() { + return this.version; + } + + protected Transactions getTransactions() { + return this.transactions; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIUpdator.java b/common/src/main/java/org/onap/so/client/aai/AAIUpdator.java new file mode 100644 index 0000000000..8921e4bbbe --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIUpdator.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.io.IOException; + +public interface AAIUpdator { + + void updateVnfToLocked(String vnfName, String uuid) throws IOException, Exception; + + void updateVnfToUnLocked(String vnfName, String uuid) throws IOException, Exception; + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIUpdatorImpl.java b/common/src/main/java/org/onap/so/client/aai/AAIUpdatorImpl.java new file mode 100644 index 0000000000..a971fded0e --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIUpdatorImpl.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +public class AAIUpdatorImpl implements AAIUpdator { + + @Autowired + protected AAIRestClientI client; + + public AAIRestClientI getClient() { + return client; + } + + + public void setClient(AAIRestClientI client) { + this.client = client; + } + + @Override + public void updateVnfToLocked(String vnfId, String uuid) throws Exception { + client.updateMaintenceFlagVnfId(vnfId, true, uuid); + } + + @Override + public void updateVnfToUnLocked(String vnfId, String uuid) throws Exception { + client.updateMaintenceFlagVnfId(vnfId, false, uuid); + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIValidator.java b/common/src/main/java/org/onap/so/client/aai/AAIValidator.java new file mode 100644 index 0000000000..bf6485a631 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIValidator.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.io.IOException; + +public interface AAIValidator { + + boolean isPhysicalServerLocked(String hostName, String transactionLoggingUuid) throws IOException; + + boolean isVNFLocked(String vnfId, String transactionLoggingUuid) throws IOException, Exception; + + +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/client/aai/AAIValidatorImpl.java b/common/src/main/java/org/onap/so/client/aai/AAIValidatorImpl.java new file mode 100644 index 0000000000..fb6d122630 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIValidatorImpl.java @@ -0,0 +1,71 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import java.io.IOException; +import java.util.List; + +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.aai.domain.yang.Pserver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + + + +public class AAIValidatorImpl implements AAIValidator { + + + @Autowired + protected AAIRestClientI client; + + public AAIRestClientI getClient() { + return client; + } + + + public void setClient(AAIRestClientI client) { + this.client = client; + } + + @Override + public boolean isPhysicalServerLocked(String vnfId, String transactionLoggingUuid) throws IOException { + List<Pserver> pservers; + boolean isLocked = false; + pservers = client.getPhysicalServerByVnfId(vnfId, transactionLoggingUuid); + for (Pserver pserver : pservers) + if (pserver.isInMaint()) + isLocked = true; + + return isLocked; + } + + @Override + public boolean isVNFLocked(String vnfId, String transactionLoggingUuid) throws Exception { + boolean isLocked = false; + GenericVnf genericVnf = client.getVnfByName(vnfId, transactionLoggingUuid); + if (genericVnf.isInMaint()) + isLocked = true; + + return isLocked; + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/AAIVersion.java b/common/src/main/java/org/onap/so/client/aai/AAIVersion.java new file mode 100644 index 0000000000..20ee5becca --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/AAIVersion.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai; + +import org.onap.so.client.graphinventory.GraphInventoryVersion; + +public enum AAIVersion implements GraphInventoryVersion { + V8("v8"), + V9("v9"), + V10("v10"), + V11("v11"), + V12("v12"), + V13("v13"); + + public final static AAIVersion LATEST = AAIVersion.values()[AAIVersion.values().length - 1]; + private final String value; + private AAIVersion(String value){ + this.value = value; + } + @Override + public String toString(){ + return this.value; + } +} + + diff --git a/common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java b/common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java new file mode 100644 index 0000000000..1120ebe0b9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/EmptyStringToNullSerializer.java @@ -0,0 +1,52 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.aai; + +import java.io.IOException; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +public class EmptyStringToNullSerializer extends StdSerializer<String> { + + private static final long serialVersionUID = 5367385969270400106L; + + public EmptyStringToNullSerializer() { + this(null); + } + public EmptyStringToNullSerializer(Class<String> t) { + super(t); + } + + @Override + public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) + throws IOException, JsonProcessingException { + + if("".equals(value)) { + gen.writeNull(); + } else { + gen.writeString(value); + } + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/AAIEntity.java b/common/src/main/java/org/onap/so/client/aai/entities/AAIEntity.java new file mode 100644 index 0000000000..c2aceeeeba --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/AAIEntity.java @@ -0,0 +1,25 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +public class AAIEntity{ + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/AAIEntityObject.java b/common/src/main/java/org/onap/so/client/aai/entities/AAIEntityObject.java new file mode 100644 index 0000000000..dc91c8a034 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/AAIEntityObject.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import org.onap.so.client.aai.entities.uri.AAIResourceUri; + +public interface AAIEntityObject { + + public AAIResourceUri getUri(); + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/AAIError.java b/common/src/main/java/org/onap/so/client/aai/entities/AAIError.java new file mode 100644 index 0000000000..4261f4f3c0 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/AAIError.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "requestError" +}) +public class AAIError { + + @JsonProperty("requestError") + private RequestError requestError; + + @JsonProperty("requestError") + public RequestError getRequestError() { + return requestError; + } + + @JsonProperty("requestError") + public void setRequestError(RequestError requestError) { + this.requestError = requestError; + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java b/common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java new file mode 100644 index 0000000000..9087995f97 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/AAIResultWrapper.java @@ -0,0 +1,92 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import java.io.IOException; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import org.onap.so.client.aai.AAICommonObjectMapperProvider; +import org.onap.so.jsonpath.JsonPathUtil; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class AAIResultWrapper implements Serializable { + + private static final long serialVersionUID = 5895841925807816737L; + private final Optional<String> jsonBody; + private final ObjectMapper mapper; + public AAIResultWrapper(String json) { + this.jsonBody = Optional.ofNullable(json); + this.mapper = new AAICommonObjectMapperProvider().getMapper(); + } + + public Optional<Relationships> getRelationships() { + final String path = "$.relationship-list"; + if (!jsonBody.isPresent()) { + return Optional.empty(); + } + Optional<String> result = JsonPathUtil.getInstance().locateResult(jsonBody.get(), path); + if (result.isPresent()) { + return Optional.of(new Relationships(result.get())); + } else { + return Optional.empty(); + } + } + + public String getJson() { + return jsonBody.orElse("{}"); + } + + public Map<String, Object> asMap() { + if (!this.jsonBody.isPresent()) { + return new HashMap<>(); + } + try { + return mapper.readValue(this.jsonBody.get(), new TypeReference<Map<String, Object>>(){}); + } catch (IOException e) { + return new HashMap<>(); + } + } + + public <T> Optional<T> asBean(Class<T> clazz) { + if (!this.jsonBody.isPresent()) { + return Optional.empty(); + } + try { + return Optional.of(mapper.readValue(this.jsonBody.get(), clazz)); + } catch (IOException e) { + return Optional.empty(); + } + } + + public boolean isEmpty() { + return !this.jsonBody.isPresent(); + } + @Override + public String toString() { + return this.getJson(); + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/Configuration.java b/common/src/main/java/org/onap/so/client/aai/entities/Configuration.java new file mode 100644 index 0000000000..e1ce3a8adc --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/Configuration.java @@ -0,0 +1,161 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "configuration-id", + "configuration-type", + "configuration-sub-type", + "model-invariant-id", + "model-version-id", + "orchestration-status", + "operational-status", + "configuration-selflink", + "model-customization-id" +}) +public class Configuration { + + @JsonProperty("configuration-id") + private String configurationId; + @JsonProperty("configuration-name") + private String configurationName; + @JsonProperty("configuration-type") + private String configurationType; + @JsonProperty("configuration-sub-type") + private String configurationSubType; + @JsonProperty("model-invariant-id") + private String modelInvariantId; + @JsonProperty("model-version-id") + private String modelVersionId; + @JsonProperty("orchestration-status") + private String orchestrationStatus; + @JsonProperty("operational-status") + private String operationalStatus; + @JsonProperty("configuration-selflink") + private String configurationSelflink; + @JsonProperty("model-customization-id") + private String modelCustomizationId; + + @JsonProperty("configuration-id") + public String getConfigurationId() { + return configurationId; + } + + @JsonProperty("configuration-id") + public void setConfigurationId(String configurationId) { + this.configurationId = configurationId; + } + + @JsonProperty("configuration-name") + public String getConfigurationName() { + return configurationName; + } + + @JsonProperty("configuration-name") + public void setConfigurationName(String configurationName) { + this.configurationName = configurationName; + } + + @JsonProperty("configuration-type") + public String getConfigurationType() { + return configurationType; + } + + @JsonProperty("configuration-type") + public void setConfigurationType(String configurationType) { + this.configurationType = configurationType; + } + + @JsonProperty("configuration-sub-type") + public String getConfigurationSubType() { + return configurationSubType; + } + + @JsonProperty("configuration-sub-type") + public void setConfigurationSubType(String configurationSubType) { + this.configurationSubType = configurationSubType; + } + + @JsonProperty("model-invariant-id") + public String getModelInvariantId() { + return modelInvariantId; + } + + @JsonProperty("model-invariant-id") + public void setModelInvariantId(String modelInvariantId) { + this.modelInvariantId = modelInvariantId; + } + + @JsonProperty("model-version-id") + public String getModelVersionId() { + return modelVersionId; + } + + @JsonProperty("model-version-id") + public void setModelVersionId(String modelVersionId) { + this.modelVersionId = modelVersionId; + } + + @JsonProperty("orchestration-status") + public String getOrchestrationStatus() { + return orchestrationStatus; + } + + @JsonProperty("orchestration-status") + public void setOrchestrationStatus(String orchestrationStatus) { + this.orchestrationStatus = orchestrationStatus; + } + + @JsonProperty("operational-status") + public String getOperationalStatus() { + return operationalStatus; + } + + @JsonProperty("operational-status") + public void setOperationalStatus(String operationalStatus) { + this.operationalStatus = operationalStatus; + } + + @JsonProperty("model-customization-id") + public String getModelCustomizationId() { + return modelCustomizationId; + } + + @JsonProperty("model-customization-id") + public void setModelCustomizationId(String modelCustomizationId) { + this.modelCustomizationId = modelCustomizationId; + } + + @JsonProperty("configuration-selflink") + public String getConfigurationSelflink() { + return configurationSelflink; + } + + @JsonProperty("configuration-selflink") + public void setConfigurationSelflink(String configurationSelflink) { + this.configurationSelflink = configurationSelflink; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/CustomQuery.java b/common/src/main/java/org/onap/so/client/aai/entities/CustomQuery.java new file mode 100644 index 0000000000..8203476c82 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/CustomQuery.java @@ -0,0 +1,82 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +import org.onap.so.client.aai.entities.uri.AAIResourceUri; + +import com.fasterxml.jackson.annotation.JsonInclude; + + +@JsonInclude(JsonInclude.Include.NON_NULL) +public class CustomQuery { + + private List<String> start; + private String query; + private String gremlin; + + public String getGremlin() { + return gremlin; + } + + public void setGremlin(String gremlin) { + this.gremlin = gremlin; + } + + + public CustomQuery(List<AAIResourceUri> start){ + this.setStart(start); + } + + public CustomQuery(List<AAIResourceUri> start, String query){ + this.setStart(start); + this.query= "query/" + query; + } + + public CustomQuery(String gremlin) throws UnsupportedEncodingException{ + this.gremlin=gremlin; + } + + public List<String> getStart() { + return start; + } + + public void setStart(List<AAIResourceUri> start) { + this.start = this.mapUris(start); + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } + + private List<String> mapUris(List<AAIResourceUri> uris) { + final List<String> result = new ArrayList<>(); + uris.stream().map(item -> item.build().toString()).forEach(result::add); + return result; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/Relationships.java b/common/src/main/java/org/onap/so/client/aai/entities/Relationships.java new file mode 100644 index 0000000000..bab145b3fd --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/Relationships.java @@ -0,0 +1,140 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Predicate; + +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.aai.AAICommonObjectMapperProvider; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.AAIResourcesClient; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.graphinventory.GraphInventoryObjectName; +import org.onap.so.jsonpath.JsonPathUtil; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.CaseFormat; + +public class Relationships { + + private final ObjectMapper mapper; + private Map<String, Object> map; + private final String jsonBody; + public Relationships(String json) { + this.jsonBody = json; + this.mapper = new AAICommonObjectMapperProvider().getMapper(); + try { + this.map = mapper.readValue(json, new TypeReference<Map<String, Object>>() {}); + } catch (IOException e) { + this.map = new HashMap<>(); + } + } + + public List<AAIResultWrapper> getByType(GraphInventoryObjectName type) { + + return this.getAll(Optional.of(type)); + } + + public List<AAIResultWrapper> getAll() { + + return this.getAll(Optional.empty()); + } + + + public List<String> getRelatedLinks() { + return this.getRelatedLinks(Optional.empty()); + } + + public List<String> getRelatedLinks(GraphInventoryObjectName type) { + return this.getRelatedLinks(Optional.of(type)); + } + + public List<AAIResourceUri> getRelatedAAIUris() { + return this.getRelatedAAIUris(x -> true); + } + + public List<AAIResourceUri> getRelatedAAIUris(GraphInventoryObjectName type) { + return this.getRelatedAAIUris(x -> type.typeName().equals(x)); + } + protected List<AAIResourceUri> getRelatedAAIUris(Predicate<String> p) { + List<AAIResourceUri> result = new ArrayList<>(); + if (map.containsKey("relationship")) { + List<Map<String, Object>> relationships = (List<Map<String, Object>>)map.get("relationship"); + for (Map<String, Object> relationship : relationships) { + final String relatedTo = (String)relationship.get("related-to"); + if (p.test(relatedTo)) { + AAIObjectType type; + try { + type = AAIObjectType.valueOf(CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_UNDERSCORE, relatedTo)); + } catch (IllegalArgumentException e) { + type = AAIObjectType.UNKNOWN; + } + final String relatedLink = (String)relationship.get("related-link"); + + result.add(AAIUriFactory.createResourceFromExistingURI(type, UriBuilder.fromPath(relatedLink).build())); + } + } + } + return result; + } + + + + protected List<AAIResultWrapper> getAll(final Optional<GraphInventoryObjectName> type) { + List<AAIResourceUri> relatedLinks; + if (type.isPresent()) { + relatedLinks = this.getRelatedAAIUris(type.get()); + } else { + relatedLinks = this.getRelatedAAIUris(); + } + ArrayList<AAIResultWrapper> result = new ArrayList<>(); + for (AAIResourceUri link : relatedLinks) { + result.add(this.get(link)); + } + return result; + } + + protected AAIResultWrapper get(AAIResourceUri uri) { + return new AAIResourcesClient().get(uri); + + } + + protected List<String> getRelatedLinks(Optional<GraphInventoryObjectName> type) { + String matcher = ""; + if (type.isPresent()) { + matcher = "[?(@.related-to=='" + type.get() + "')]"; + } + return JsonPathUtil.getInstance().locateResultList(this.jsonBody, String.format("$.relationship%s.related-link", matcher)); + } + + public String getJson() { + return this.jsonBody; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/RequestError.java b/common/src/main/java/org/onap/so/client/aai/entities/RequestError.java new file mode 100644 index 0000000000..bc8c283e34 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/RequestError.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "serviceException" +}) +public class RequestError { + + @JsonProperty("serviceException") + private ServiceException serviceException; + + @JsonProperty("serviceException") + public ServiceException getServiceException() { + return serviceException; + } + + @JsonProperty("serviceException") + public void setServiceException(ServiceException serviceException) { + this.serviceException = serviceException; + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/Results.java b/common/src/main/java/org/onap/so/client/aai/entities/Results.java new file mode 100644 index 0000000000..c3f0ad1fa1 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/Results.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + + + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"results" +}) +public class Results<T> { + @JsonProperty("results") + protected List<T> results; + + @JsonProperty("results") + public List<T> getResult() { + if (results == null) { + results = new ArrayList<>(); + } + return this.results; + } + @JsonProperty("results") + public void setResult(List<T> results) { + this.results=results; + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/ServiceException.java b/common/src/main/java/org/onap/so/client/aai/entities/ServiceException.java new file mode 100644 index 0000000000..9d9723c514 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/ServiceException.java @@ -0,0 +1,75 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "messageId", + "text", + "variables" +}) +public class ServiceException { + + @JsonProperty("messageId") + private String messageId; + @JsonProperty("text") + private String text; + @JsonProperty("variables") + private List<String> variables = new ArrayList<>(); + + @JsonProperty("messageId") + public String getMessageId() { + return messageId; + } + + @JsonProperty("messageId") + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + @JsonProperty("text") + public String getText() { + return text; + } + + @JsonProperty("text") + public void setText(String text) { + this.text = text; + } + + @JsonProperty("variables") + public List<String> getVariables() { + return variables; + } + + @JsonProperty("variables") + public void setVariables(List<String> variables) { + this.variables = variables; + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/OperationBody.java b/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/OperationBody.java new file mode 100644 index 0000000000..1803440edd --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/OperationBody.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.bulkprocess; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"uri", +"body" +}) +public class OperationBody { + +@JsonProperty("uri") +private String uri; +@JsonProperty("body") +private Object body; + +@JsonProperty("uri") +public String getUri() { +return uri; +} + +@JsonProperty("uri") +public void setUri(String uri) { +this.uri = uri; +} + +public OperationBody withUri(String uri) { +this.uri = uri; +return this; +} + +@JsonProperty("body") +public Object getBody() { +return body; +} + +@JsonProperty("body") +public void setBody(Object body) { +this.body = body; +} + +public OperationBody withBody(Object body) { +this.body = body; +return this; +} + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/Transaction.java b/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/Transaction.java new file mode 100644 index 0000000000..1c405753c3 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/Transaction.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.bulkprocess; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"patch", +"patch", +"delete" +}) +public class Transaction { + +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonProperty("put") +private List<OperationBody> put = new ArrayList<>(); + +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonProperty("patch") +private List<OperationBody> patch = new ArrayList<>(); + +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonProperty("delete") +private List<OperationBody> delete = new ArrayList<>(); + +@JsonProperty("put") +public List<OperationBody> getPut() { +return put; +} + +@JsonProperty("put") +public void setPut(List<OperationBody> put) { +this.put = put; +} + +public Transaction withPut(List<OperationBody> put) { +this.put = put; +return this; +} + +@JsonProperty("patch") +public List<OperationBody> getPatch() { +return patch; +} + +@JsonProperty("patch") +public void setPatch(List<OperationBody> patch) { +this.patch = patch; +} + +public Transaction withPatch(List<OperationBody> patch) { +this.patch = patch; +return this; +} + +@JsonProperty("delete") +public List<OperationBody> getDelete() { +return delete; +} + +@JsonProperty("delete") +public void setDelete(List<OperationBody> delete) { +this.delete = delete; +} + +public Transaction withDelete(List<OperationBody> delete) { +this.delete = delete; +return this; +} + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/Transactions.java b/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/Transactions.java new file mode 100644 index 0000000000..51d56d371a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/bulkprocess/Transactions.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.bulkprocess; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"transactions" +}) +public class Transactions { + +@JsonProperty("transactions") +private List<Transaction> transactions = new ArrayList<>(); + +@JsonProperty("transactions") +public List<Transaction> getTransactions() { +return transactions; +} + +@JsonProperty("transactions") +public void setTransactions(List<Transaction> transactions) { +this.transactions = transactions; +} + +public Transactions withTransactions(List<Transaction> transactions) { +this.transactions = transactions; +return this; +} + +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIResourceUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIResourceUri.java new file mode 100644 index 0000000000..42fa1ad02a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIResourceUri.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.uri; + +import org.onap.so.client.aai.AAIObjectPlurals; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryResourceUri; + +public interface AAIResourceUri extends AAIUri, GraphInventoryResourceUri { + + public AAIResourceUri relationshipAPI(); + public AAIResourceUri relatedTo(AAIObjectPlurals plural); + public AAIResourceUri relatedTo(AAIObjectType type, String... values); + public AAIResourceUri resourceVersion(String version); + public AAIResourceUri format(Format format); + @Override + public AAIResourceUri depth(Depth depth); + @Override + public AAIResourceUri nodesOnly(boolean nodesOnly); + @Override + public AAIResourceUri queryParam(String name, String... values); + @Override + public AAIResourceUri replaceQueryParam(String name, String... values); + @Override + public AAIResourceUri clone(); +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java new file mode 100644 index 0000000000..14671b2f85 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAISimpleUri.java @@ -0,0 +1,111 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.aai.entities.uri; + +import java.net.URI; + +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.aai.AAIObjectPlurals; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.graphinventory.entities.uri.SimpleUri; + +public class AAISimpleUri extends SimpleUri implements AAIResourceUri { + + protected AAISimpleUri(AAIObjectType type, Object... values) { + super(type, values); + + } + protected AAISimpleUri(AAIObjectType type, URI uri) { + super(type, uri); + } + protected AAISimpleUri(AAIObjectType type, UriBuilder builder, Object... values) { + super(type, builder, values); + } + protected AAISimpleUri(AAIObjectPlurals type, UriBuilder builder, Object... values) { + super(type, builder, values); + } + protected AAISimpleUri(AAIObjectPlurals type) { + super(type); + } + protected AAISimpleUri(AAIObjectPlurals type, Object... values) { + super(type, values); + } + + @Override + public AAISimpleUri relationshipAPI() { + return (AAISimpleUri) super.relationshipAPI(); + } + + @Override + public AAISimpleUri relatedTo(AAIObjectPlurals plural) { + return (AAISimpleUri) super.relatedTo(plural); + } + @Override + public AAISimpleUri relatedTo(AAIObjectType type, String... values) { + return (AAISimpleUri) super.relatedTo(type, values); + } + + @Override + public AAISimpleUri resourceVersion(String version) { + return (AAISimpleUri) super.resourceVersion(version); + } + + @Override + public AAISimpleUri queryParam(String name, String... values) { + return (AAISimpleUri) super.queryParam(name, values); + } + + @Override + public AAISimpleUri replaceQueryParam(String name, String... values) { + return (AAISimpleUri) super.replaceQueryParam(name, values); + } + + @Override + public AAISimpleUri clone() { + if (this.type != null) { + return new AAISimpleUri((AAIObjectType)this.type, this.internalURI.clone(), values); + } else { + return new AAISimpleUri((AAIObjectPlurals)this.pluralType, this.internalURI.clone(), values); + } + } + + @Override + public AAIObjectType getObjectType() { + return (AAIObjectType)this.type; + } + + @Override + public AAISimpleUri depth(Depth depth) { + return (AAISimpleUri) super.depth(depth); + } + @Override + public AAISimpleUri nodesOnly(boolean nodesOnly) { + return (AAISimpleUri)super.nodesOnly(nodesOnly); + } + + @Override + public AAISimpleUri format(Format format) { + return (AAISimpleUri)super.format(format); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUri.java new file mode 100644 index 0000000000..eb336d9219 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUri.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.uri; + +import java.net.URI; +import java.util.Map; + +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.graphinventory.GraphInventoryObjectType; +import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; + +public interface AAIUri extends GraphInventoryUri { + + /** + * By default A&AI enforces a depth of 1. Some objects can be told to retrieve objects + * nested beneath them by increasing this number. + * + * You can use 0 to restrict the returned information to only the object you requested + * You can use all to retrieve all nested objects (this should only be used if you really need a massive amount of information and are caching the retrieval) + * @param depth + * @return + */ + @Override + public AAIUri depth(Depth depth); + /** + * Makes client only return object fields, no relationships + * + * @return + */ + @Override + public AAIUri nodesOnly(boolean nodesOnly); + @Override + public AAIUri queryParam(String name, String... values); + @Override + public AAIUri replaceQueryParam(String name, String... values); + @Override + public AAIUri clone(); + + @Override + public AAIObjectType getObjectType(); +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java new file mode 100644 index 0000000000..2a7c8ee78c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/AAIUriFactory.java @@ -0,0 +1,86 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.uri; + +import java.net.URI; + +import org.onap.so.client.aai.AAIObjectPlurals; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.graphinventory.entities.uri.SimpleUri; + + +public class AAIUriFactory { + + /** + * values are filled into the URI template specified in {@link AAIObjectType} in order + * + * @param type + * @param values + * @return + */ + public static AAIResourceUri createResourceUri(AAIObjectType type, Object... values) { + if (AAIObjectType.SERVICE_INSTANCE.equals(type)) { + return new ServiceInstanceUri(values); + } else { + return new AAISimpleUri(type, values); + } + } + + public static AAIResourceUri createNodesUri(AAIObjectType type, Object... values) { + return new NodesUri(type, values); + + } + + /** + * This method should only be used to wrap a URI retrieved from A&AI contained within an object response + * + * @param type + * @param uri + * @return + */ + public static AAIResourceUri createResourceFromExistingURI(AAIObjectType type, URI uri) { + return new AAISimpleUri(type, uri); + } + + /** + * Creates a uri for a plural type e.g. /cloud-infrastructure/pservers + * + * @param type + * @return + */ + public static AAIResourceUri createResourceUri(AAIObjectPlurals type) { + + return new AAISimpleUri(type); + + } + + /** + * Creates a uri for a plural type with values e.g. /cloud-infrastructure/pservers + * + * @param type + * @return + */ + public static AAIResourceUri createResourceUri(AAIObjectPlurals type, Object... values) { + + return new AAISimpleUri(type, values); + + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesUri.java new file mode 100644 index 0000000000..ccae0b44b7 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/NodesUri.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.uri; + +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; +import org.onap.so.client.graphinventory.GraphInventoryObjectType; + +public class NodesUri extends AAISimpleUri { + + protected NodesUri(AAIObjectType type, Object... values) { + super(type, values); + } + + + @Override + protected String getTemplate(GraphInventoryObjectType type) { + return "/nodes" + type.partialUri(); + } + + @Override + protected String getTemplate(GraphInventoryObjectPlurals type) { + return "/nodes" + type.partialUri(); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUri.java b/common/src/main/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUri.java new file mode 100644 index 0000000000..093918d49b --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/entities/uri/ServiceInstanceUri.java @@ -0,0 +1,126 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.entities.uri; + +import java.io.IOException; +import java.net.URI; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +import javax.ws.rs.BadRequestException; +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.AAIQueryClient; +import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.aai.entities.CustomQuery; +import org.onap.so.client.aai.entities.Results; +import org.onap.so.client.graphinventory.entities.uri.SimpleUri; +import org.onap.so.client.graphinventory.exceptions.GraphInventoryPayloadException; +import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriComputationException; +import org.onap.so.client.graphinventory.exceptions.GraphInventoryUriNotFoundException; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class ServiceInstanceUri extends AAISimpleUri { + + private Optional<String> cachedValue = Optional.empty(); + + protected ServiceInstanceUri(Object... values) { + super(AAIObjectType.SERVICE_INSTANCE, values); + } + protected ServiceInstanceUri(UriBuilder builder, Optional<String> cachedValue, Object... values) { + super(AAIObjectType.SERVICE_INSTANCE, builder, values); + this.cachedValue = cachedValue; + } + protected String getSerivceInstance(Object id) throws GraphInventoryUriNotFoundException, GraphInventoryPayloadException { + if (!this.getCachedValue().isPresent()) { + AAIResourceUri serviceInstanceUri = AAIUriFactory.createNodesUri(AAIObjectType.SERVICE_INSTANCE, id); + CustomQuery query = new CustomQuery(Collections.singletonList(serviceInstanceUri)); + String resultJson; + try { + resultJson = this.getQueryClient().query(Format.PATHED, query); + } catch (BadRequestException e) { + throw new GraphInventoryUriNotFoundException("Service instance " + id + " not found at: " + serviceInstanceUri.build()); + + } + try { + cachedValue = extractRelatedLink(resultJson); + if (!cachedValue.isPresent()) { + throw new GraphInventoryUriNotFoundException("Service instance " + id + " not found at: " + serviceInstanceUri.build()); + } + } catch (IOException e) { + throw new GraphInventoryPayloadException("could not map payload: " + resultJson, e); + } + } + Optional<String> cachedValueOpt = this.getCachedValue(); + return cachedValueOpt.isPresent() ? cachedValueOpt.get() : ""; + } + + protected Optional<String> extractRelatedLink(String jsonString) throws IOException { + Optional<String> result; + ObjectMapper mapper = new ObjectMapper(); + + Results<Map<String, String>> results = mapper.readValue(jsonString, new TypeReference<Results<Map<String, String>>>(){}); + if (results.getResult().size() == 1) { + String uriString = results.getResult().get(0).get("resource-link"); + URI uri = UriBuilder.fromUri(uriString).build(); + String rawPath = uri.getRawPath(); + result = Optional.of(rawPath.replaceAll("/aai/v\\d+", "")); + } else if (results.getResult().isEmpty()) { + result = Optional.empty(); + } else { + throw new IllegalStateException("more than one result returned"); + } + + return result; + } + + protected Optional<String> getCachedValue() { + return this.cachedValue; + } + + @Override + public URI build() { + try { + if (this.values.length == 1) { + String uri = getSerivceInstance(this.values[0]); + Map<String, String> map = getURIKeys(uri); + return super.build(map.values().toArray(values)); + } + } catch (GraphInventoryUriNotFoundException | GraphInventoryPayloadException e) { + throw new GraphInventoryUriComputationException(e); + } + return super.build(); + } + + @Override + public ServiceInstanceUri clone() { + return new ServiceInstanceUri(this.internalURI.clone(), this.getCachedValue(), values); + } + + protected AAIQueryClient getQueryClient() { + AAIResourceUri uri = AAIUriFactory.createNodesUri(AAIObjectType.ALLOTTED_RESOURCE, "").clone(); + return new AAIQueryClient(); + } +} diff --git a/common/src/main/java/org/onap/so/client/aai/objects/AAIOperationalEnvironment.java b/common/src/main/java/org/onap/so/client/aai/objects/AAIOperationalEnvironment.java new file mode 100644 index 0000000000..02d8d56867 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/objects/AAIOperationalEnvironment.java @@ -0,0 +1,159 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.objects; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"operational-environment-id", +"operational-environment-name", +"operational-environment-type", +"operational-environment-status", +"tenant-context", +"workload-context", +"resource-version" +}) +public class AAIOperationalEnvironment { + +@JsonProperty("operational-environment-id") +private String operationalEnvironmentId; +@JsonProperty("operational-environment-name") +private String operationalEnvironmentName; +@JsonProperty("operational-environment-type") +private String operationalEnvironmentType; +@JsonProperty("operational-environment-status") +private String operationalEnvironmentStatus; +@JsonProperty("tenant-context") +private String tenantContext; +@JsonProperty("workload-context") +private String workloadContext; +@JsonProperty("resource-version") +private String resourceVersion; + +@JsonProperty("operational-environment-id") +public String getOperationalEnvironmentId() { +return operationalEnvironmentId; + } + +@JsonProperty("operational-environment-id") +public void setOperationalEnvironmentId(String operationalEnvironmentId) { +this.operationalEnvironmentId = operationalEnvironmentId; + } + +public AAIOperationalEnvironment withOperationalEnvironmentId(String operationalEnvironmentId) { +this.operationalEnvironmentId = operationalEnvironmentId; +return this; + } + +@JsonProperty("operational-environment-name") +public String getOperationalEnvironmentName() { +return operationalEnvironmentName; + } + +@JsonProperty("operational-environment-name") +public void setOperationalEnvironmentName(String operationalEnvironmentName) { +this.operationalEnvironmentName = operationalEnvironmentName; + } + +public AAIOperationalEnvironment withOperationalEnvironmentName(String operationalEnvironmentName) { +this.operationalEnvironmentName = operationalEnvironmentName; +return this; + } + +@JsonProperty("operational-environment-type") +public String getOperationalEnvironmentType() { +return operationalEnvironmentType; + } + +@JsonProperty("operational-environment-type") +public void setOperationalEnvironmentType(String operationalEnvironmentType) { +this.operationalEnvironmentType = operationalEnvironmentType; + } + +public AAIOperationalEnvironment withOperationalEnvironmentType(String operationalEnvironmentType) { +this.operationalEnvironmentType = operationalEnvironmentType; +return this; + } + +@JsonProperty("operational-environment-status") +public String getOperationalEnvironmentStatus() { +return operationalEnvironmentStatus; + } + +@JsonProperty("operational-environment-status") +public void setOperationalEnvironmentStatus(String operationalEnvironmentStatus) { +this.operationalEnvironmentStatus = operationalEnvironmentStatus; + } + +public AAIOperationalEnvironment withOperationalEnvironmentStatus(String operationalEnvironmentStatus) { +this.operationalEnvironmentStatus = operationalEnvironmentStatus; +return this; + } + +@JsonProperty("tenant-context") +public String getTenantContext() { +return tenantContext; + } + +@JsonProperty("tenant-context") +public void setTenantContext(String tenantContext) { +this.tenantContext = tenantContext; + } + +public AAIOperationalEnvironment withTenantContext(String tenantContext) { +this.tenantContext = tenantContext; +return this; + } + +@JsonProperty("workload-context") +public String getWorkloadContext() { +return workloadContext; + } + +@JsonProperty("workload-context") +public void setWorkloadContext(String workloadContext) { +this.workloadContext = workloadContext; + } + +public AAIOperationalEnvironment withWorkloadContext(String workloadContext) { +this.workloadContext = workloadContext; +return this; + } + +@JsonProperty("resource-version") +public String getResourceVersion() { +return resourceVersion; + } + +@JsonProperty("resource-version") +public void setResourceVersion(String resourceVersion) { +this.resourceVersion = resourceVersion; + } + +public AAIOperationalEnvironment withResourceVersion(String resourceVersion) { +this.resourceVersion = resourceVersion; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/aai/objects/AAIServiceInstance.java b/common/src/main/java/org/onap/so/client/aai/objects/AAIServiceInstance.java new file mode 100644 index 0000000000..af21949277 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/aai/objects/AAIServiceInstance.java @@ -0,0 +1,141 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.aai.objects; + +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.entities.AAIEntityObject; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class AAIServiceInstance implements AAIEntityObject { + + @JsonProperty("service-instance-id") + private String serviceInstanceId; + @JsonProperty("service-instance-name") + private String serviceInstanceName; + @JsonProperty("service-type") + private String serviceType; + @JsonProperty("service-role") + private String serviceRole; + @JsonProperty("orchestration-status") + private String oStatus; + @JsonProperty("model-invariant-id") + private String modelInvariantUuid; + @JsonProperty("model-version-id") + private String modelUuid; + @JsonProperty("environment-context") + private String environmentContext; + @JsonProperty("workload-context") + private String workloadContext; + + public String getServiceInstanceName() { + return serviceInstanceName; + } + + public void setServiceInstanceName(String serviceInstanceName) { + this.serviceInstanceName = serviceInstanceName; + } + + public String getServiceType() { + return serviceType; + } + + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + public String getServiceRole() { + return serviceRole; + } + + public void setServiceRole(String serviceRole) { + this.serviceRole = serviceRole; + } + + public String getoStatus() { + return oStatus; + } + + public void setoStatus(String oStatus) { + this.oStatus = oStatus; + } + + public String getModelInvariantUuid() { + return modelInvariantUuid; + } + + public void setModelInvariantUuid(String modelInvariantUuid) { + this.modelInvariantUuid = modelInvariantUuid; + } + + public String getModelUuid() { + return modelUuid; + } + + public void setModelUuid(String modelUuid) { + this.modelUuid = modelUuid; + } + + public String getEnvironmentContext() { + return environmentContext; + } + + public void setEnvironmentContext(String environmentContext) { + this.environmentContext = environmentContext; + } + + public String getWorkloadContext() { + return workloadContext; + } + + public void setWorkloadContext(String workloadContext) { + this.workloadContext = workloadContext; + } + + public String getServiceInstanceId() { + return serviceInstanceId; + } + + public void setServiceInstanceId(String serviceInstanceId) { + this.serviceInstanceId = serviceInstanceId; + } + + public AAIServiceInstance withServiceInstance(String serviceInstanceId) { + this.setServiceInstanceId(serviceInstanceId); + return this; + } + + @Override + public AAIResourceUri getUri() { + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, this.serviceInstanceId); + return uri; + } + @Override + public String toString() { + return "AAIServiceInstance [serviceInstanceId=" + serviceInstanceId + ", serviceInstanceName=" + + serviceInstanceName + ", serviceType=" + serviceType + ", serviceRole=" + serviceRole + ", oStatus=" + + oStatus + ", modelInvariantUuid=" + modelInvariantUuid + ", modelUuid=" + modelUuid + + ", environmentContext=" + environmentContext + ", workloadContext=" + workloadContext + "]"; + } + +} diff --git a/common/src/main/java/org/onap/so/client/adapter/rest/AdapterRestClient.java b/common/src/main/java/org/onap/so/client/adapter/rest/AdapterRestClient.java new file mode 100644 index 0000000000..2329a5acb9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/adapter/rest/AdapterRestClient.java @@ -0,0 +1,79 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.adapter.rest; + +import java.net.URI; +import java.security.GeneralSecurityException; +import java.util.Map; +import java.util.Optional; + +import org.apache.commons.codec.binary.Base64; +import org.onap.so.client.RestClient; +import org.onap.so.client.policy.CommonObjectMapperProvider; +import org.onap.so.client.policy.JettisonStyleMapperProvider; +import org.onap.so.utils.CryptoUtils; +import org.onap.so.utils.TargetEntity; + +public class AdapterRestClient extends RestClient { + + private final AdapterRestProperties adapterRestProperties; + public AdapterRestClient(AdapterRestProperties props, URI uri) { + super(props, Optional.of(uri)); + this.adapterRestProperties = props; + } + + public AdapterRestClient(AdapterRestProperties props, URI uri, String accept, String contentType) { + super(props, Optional.of(uri), accept, contentType); + this.adapterRestProperties = props; + } + + @Override + public TargetEntity getTargetEntity(){ + return TargetEntity.OPENSTACK_ADAPTER; + } + + @Override + protected void initializeHeaderMap(Map<String, String> headerMap) { + headerMap.put("Authorization", + this.getBasicAuth(adapterRestProperties.getAuth(), adapterRestProperties.getKey())); + } + + @Override + protected CommonObjectMapperProvider getCommonObjectMapperProvider() { + return new JettisonStyleMapperProvider(); + } + + private String getBasicAuth(String encryptedAuth, String msoKey) { + if ((encryptedAuth == null || encryptedAuth.isEmpty()) || (msoKey == null || msoKey.isEmpty())) { + return null; + } + try { + String auth = CryptoUtils.decrypt(encryptedAuth, msoKey); + byte[] encoded = Base64.encodeBase64(auth.getBytes()); + String encodedString = new String(encoded); + encodedString = "Basic " + encodedString; + return encodedString; + } catch (GeneralSecurityException e) { + this.msoLogger.debug(e.getMessage()); + return null; + } + } +} diff --git a/common/src/main/java/org/onap/so/client/adapter/rest/AdapterRestProperties.java b/common/src/main/java/org/onap/so/client/adapter/rest/AdapterRestProperties.java new file mode 100644 index 0000000000..18e0bd8996 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/adapter/rest/AdapterRestProperties.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.adapter.rest; + +import org.onap.so.client.RestProperties; + +public interface AdapterRestProperties extends RestProperties { + + public String getAuth(); + public String getKey(); +} diff --git a/common/src/main/java/org/onap/so/client/defaultproperties/DefaultDmaapPropertiesImpl.java b/common/src/main/java/org/onap/so/client/defaultproperties/DefaultDmaapPropertiesImpl.java new file mode 100644 index 0000000000..ffebe77620 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/defaultproperties/DefaultDmaapPropertiesImpl.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.defaultproperties; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.onap.so.client.dmaap.DmaapProperties; + +public class DefaultDmaapPropertiesImpl implements DmaapProperties { + + private final Map<String, String> properties; + public DefaultDmaapPropertiesImpl() throws IOException { + File initialFile = new File("src/test/resources/dmaap.properties"); + InputStream targetStream = new FileInputStream(initialFile); + Properties properties = new Properties(); + properties.load(targetStream); + this.properties = new HashMap<>(); + properties.forEach((key, value) -> this.properties.put((String)key, (String)value)); + } + @Override + public Map<String, String> getProperties() { + return this.properties; + } + +} diff --git a/common/src/main/java/org/onap/so/client/defaultproperties/PolicyRestPropertiesImpl.java b/common/src/main/java/org/onap/so/client/defaultproperties/PolicyRestPropertiesImpl.java new file mode 100644 index 0000000000..9e4574df4c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/defaultproperties/PolicyRestPropertiesImpl.java @@ -0,0 +1,81 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.defaultproperties; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.onap.so.client.policy.PolicyRestProperties; + +public class PolicyRestPropertiesImpl implements PolicyRestProperties { + + + final Map<Object, Object> props; + public PolicyRestPropertiesImpl() { + File initialFile = new File("src/test/resources/policy.properties"); + Map<Object, Object> temp; + try (InputStream targetStream = new FileInputStream(initialFile)) { + Properties properties = new Properties(); + properties.load(targetStream); + temp = properties; + } catch (IOException e) { + temp = new HashMap<>(); + } + this.props = temp; + + } + @Override + public URL getEndpoint() { + try { + return new URL((String)props.getOrDefault("policy.endpoint", "")); + } catch (MalformedURLException e) { + return null; + } + } + + @Override + public String getSystemName() { + return "MSO"; + } + + @Override + public String getClientAuth() { + return (String)props.get("policy.client.auth"); + } + + @Override + public String getAuth() { + return (String)props.get("policy.auth"); + } + + @Override + public String getEnvironment() { + return (String)props.get("policy.environment"); + } + +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/Consumer.java b/common/src/main/java/org/onap/so/client/dmaap/Consumer.java new file mode 100644 index 0000000000..7b1310f252 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/Consumer.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap; + +public interface Consumer { + + public Iterable<String> fetch(); +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/DmaapClient.java b/common/src/main/java/org/onap/so/client/dmaap/DmaapClient.java new file mode 100644 index 0000000000..dde0b31c90 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/DmaapClient.java @@ -0,0 +1,74 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap; + +import java.io.IOException; +import java.util.Base64; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; + +import org.onap.so.client.defaultproperties.DefaultDmaapPropertiesImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + + +public abstract class DmaapClient { + + protected static Logger logger = LoggerFactory.getLogger(DmaapClient.class); + protected final Map<String, String> msoProperties; + protected final Properties properties; + public DmaapClient(String filepath) throws IOException { + Resource resource = new ClassPathResource(filepath); + DmaapProperties dmaapProperties = DmaapPropertiesLoader.getInstance().getNewImpl(); + if (dmaapProperties == null) { + logger.error("No RestProperty implementation found on classpath, loading default"); + dmaapProperties = new DefaultDmaapPropertiesImpl(); + } + this.msoProperties = dmaapProperties.getProperties(); + this.properties = new Properties(); + this.properties.load(resource.getInputStream()); + this.properties.put("password", this.deobfuscatePassword(this.getPassword())); + this.properties.put("username", this.getUserName()); + this.properties.put("topic", this.getTopic()); + Optional<String> host = this.getHost(); + if (host.isPresent()) { + this.properties.put("host", host.get()); + } + } + protected String deobfuscatePassword(String password) { + + try { + return new String(Base64.getDecoder().decode(password.getBytes())); + } catch(IllegalArgumentException iae) { + logger.error("llegal Arguments",iae); + return password; + } + } + + + public abstract String getUserName(); + public abstract String getPassword(); + public abstract String getTopic(); + public abstract Optional<String> getHost(); +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/DmaapConsumer.java b/common/src/main/java/org/onap/so/client/dmaap/DmaapConsumer.java new file mode 100644 index 0000000000..c9acdd7e89 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/DmaapConsumer.java @@ -0,0 +1,126 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap; + +import com.google.common.base.Stopwatch; +import java.io.IOException; +import java.util.concurrent.TimeUnit; +import org.onap.so.client.dmaap.exceptions.DMaaPConsumerFailure; +import org.onap.so.client.dmaap.exceptions.ExceededMaximumPollingTime; +import org.onap.so.client.dmaap.rest.RestConsumer; + +public abstract class DmaapConsumer extends DmaapClient { + + public DmaapConsumer() throws IOException { + super("dmaap/default-consumer.properties"); + } + + public Consumer getConsumer() { + return new RestConsumer(this.properties); + } + + public boolean consume() throws Exception { + Consumer mrConsumer = this.getConsumer(); + boolean accepted = false; + Stopwatch stopwatch = Stopwatch.createUnstarted(); + try { + while (this.continuePolling()) { + if (stopwatch.elapsed(TimeUnit.MILLISECONDS) >= this.getMaximumElapsedTime()) { + final String message = "exceeded maximum retries on " + this.getRequestId() + " on " + this.getTopic(); + logger.error(message); + throw new ExceededMaximumPollingTime(message); + } + stopwatch.start(); + Iterable<String> itr = mrConsumer.fetch(); + stopwatch.stop(); + for (String message : itr) { + if (!accepted && this.isAccepted(message)) { + logger.info("accepted message found for " + this.getRequestId() + " on " + this.getTopic()); + accepted = true; + } + if (accepted) { + logger.info("received dmaap message: " + message); + if (this.isFailure(message)) { + this.stopProcessingMessages(); + final String errorMsg = "failure received from dmaap topic " + this.getTopic(); + logger.error(errorMsg); + throw new DMaaPConsumerFailure(errorMsg); + } else { + this.processMessage(message); + } + } + } + } + return true; + } finally { + if (stopwatch.isRunning()) { + stopwatch.stop(); + } + } + } + + /** + * Should this consumer continue to consume messages from the topic? + * @return + */ + public abstract boolean continuePolling(); + /** + * Process a message from a DMaaP topic + * + * @param message + * @throws Exception + */ + public abstract void processMessage(String message) throws Exception; + /** + * Has the request been accepted by the receiving system? + * Should the consumer move to processing messages? + * + * @param message + * @return + */ + public abstract boolean isAccepted(String message); + /** + * has the request failed? + * + * @param message + * @return + */ + public abstract boolean isFailure(String message); + /** + * The request id to filter messages on + * @return + */ + public abstract String getRequestId(); + /** + * Logic that defines when the consumer should stop processing messages + */ + public abstract void stopProcessingMessages(); + + /** + * time in milliseconds + */ + public int getMaximumElapsedTime() { + return 180000; + } + + + +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/DmaapProperties.java b/common/src/main/java/org/onap/so/client/dmaap/DmaapProperties.java new file mode 100644 index 0000000000..161608dc77 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/DmaapProperties.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap; + +import java.util.Map; + +public interface DmaapProperties { + + /** + * A map of strings which contains the properties for a dmaap client + * @return + */ + public Map<String, String> getProperties(); +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/DmaapPropertiesLoader.java b/common/src/main/java/org/onap/so/client/dmaap/DmaapPropertiesLoader.java new file mode 100644 index 0000000000..3064f6142f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/DmaapPropertiesLoader.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap; + +import java.util.ServiceLoader; + +public class DmaapPropertiesLoader { + /* required to make ServiceLoader thread safe */ + private static final ThreadLocal<ServiceLoader<DmaapProperties>> services = new ThreadLocal<ServiceLoader<DmaapProperties>>() { + @Override + protected ServiceLoader<DmaapProperties> initialValue() { + return ServiceLoader.load(DmaapProperties.class); + } + }; + + private DmaapPropertiesLoader() { + } + + private static class Helper { + private static final DmaapPropertiesLoader INSTANCE = new DmaapPropertiesLoader(); + } + + public static DmaapPropertiesLoader getInstance() { + return Helper.INSTANCE; + } + public DmaapProperties getImpl() { + return this.getImpl(false); + } + public DmaapProperties getNewImpl() { + return this.getImpl(true); + } + private DmaapProperties getImpl(boolean forceNewInstance) { + + ServiceLoader<DmaapProperties> loader = this.services.get(); + for (DmaapProperties service : loader) { + if (forceNewInstance) { + try { + return service.getClass().newInstance(); + } catch (InstantiationException | IllegalAccessException e) { + /* all spi implementations must provide a public + * no argument constructor + */ + } + } else { + return service; + } + } + + return null; + } +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/DmaapPublisher.java b/common/src/main/java/org/onap/so/client/dmaap/DmaapPublisher.java new file mode 100644 index 0000000000..48691dcd84 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/DmaapPublisher.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import org.onap.so.client.dmaap.rest.RestPublisher; + +public abstract class DmaapPublisher extends DmaapClient { + + private long seconds; + private final Publisher publisher; + public DmaapPublisher() throws FileNotFoundException, IOException { + super("dmaap/default-consumer.properties"); + this.publisher = new RestPublisher(properties); + this.seconds = 20; + + } + + public DmaapPublisher(long seconds) throws FileNotFoundException, IOException { + this(); + this.seconds = seconds; + } + + public void send(String json){ + logger.info("publishing message to dmaap topic " + this.getTopic() + ": " + json); + publisher.send(json); + //publisher.close(seconds, TimeUnit.SECONDS); + } + + +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/Publisher.java b/common/src/main/java/org/onap/so/client/dmaap/Publisher.java new file mode 100644 index 0000000000..ba6ce16418 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/Publisher.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap; + +public interface Publisher { + + public void send(String json); +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/exceptions/DMaaPConsumerFailure.java b/common/src/main/java/org/onap/so/client/dmaap/exceptions/DMaaPConsumerFailure.java new file mode 100644 index 0000000000..f845f7e6ef --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/exceptions/DMaaPConsumerFailure.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap.exceptions; + +public class DMaaPConsumerFailure extends Exception { + + private static final long serialVersionUID = 2499229901897110362L; + + public DMaaPConsumerFailure() { + super(); + } + + public DMaaPConsumerFailure(String message) { + super(message); + } +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/exceptions/ExceededMaximumPollingTime.java b/common/src/main/java/org/onap/so/client/dmaap/exceptions/ExceededMaximumPollingTime.java new file mode 100644 index 0000000000..0002f878d8 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/exceptions/ExceededMaximumPollingTime.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap.exceptions; + +public class ExceededMaximumPollingTime extends RuntimeException { + + private static final long serialVersionUID = 2331207691092906423L; + + public ExceededMaximumPollingTime() { + super(); + } + + public ExceededMaximumPollingTime(String message) { + super(message); + } +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/rest/DMaaPRestClient.java b/common/src/main/java/org/onap/so/client/dmaap/rest/DMaaPRestClient.java new file mode 100644 index 0000000000..0438ff237a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/rest/DMaaPRestClient.java @@ -0,0 +1,50 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap.rest; + +import java.net.URL; +import java.util.Base64; +import java.util.Map; + +import org.onap.so.client.RestClient; +import org.onap.so.utils.TargetEntity; + +public class DMaaPRestClient extends RestClient { + + private final String username; + private final String password; + public DMaaPRestClient(URL url, String contentType, String username, String password) { + super(url, contentType); + this.username = username; + this.password = password; + } + + @Override + public TargetEntity getTargetEntity(){ + return TargetEntity.DMAAP; + } + + @Override + protected void initializeHeaderMap(Map<String, String> headerMap) { + headerMap.put("Authorization", "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes())); + } + +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/rest/PropertiesBean.java b/common/src/main/java/org/onap/so/client/dmaap/rest/PropertiesBean.java new file mode 100644 index 0000000000..f43c65808a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/rest/PropertiesBean.java @@ -0,0 +1,131 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap.rest; + +import java.util.Properties; + +public class PropertiesBean { + + private String username; + private String password; + private String environment; + private String partition; + private String contentType; + private String host; + private String topic; + private String timeout; + + + public PropertiesBean(Properties properties) { + this.withUsername(properties.getProperty("username")) + .withPassword(properties.getProperty("password")) + .withTopic(properties.getProperty("topic")) + .withEnvironment(properties.getProperty("environment")) + .withHost(properties.getProperty("host")) + .withTimeout(properties.getProperty("timeout", "20000")) + .withPartition(properties.getProperty("partition")) + .withContentType(properties.getProperty("contentType", "application/json")); + } + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + public PropertiesBean withUsername(String username) { + this.username = username; + return this; + } + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + public PropertiesBean withPassword(String password) { + this.password = password; + return this; + } + public String getEnvironment() { + return environment; + } + public void setEnvironment(String environment) { + this.environment = environment; + } + public PropertiesBean withEnvironment(String environment) { + this.environment = environment; + return this; + } + public String getPartition() { + return partition; + } + public void setPartition(String partition) { + this.partition = partition; + } + public PropertiesBean withPartition(String partition) { + this.partition = partition; + return this; + } + public String getContentType() { + return contentType; + } + public void setContentType(String contentType) { + this.contentType = contentType; + } + public PropertiesBean withContentType(String contentType) { + this.contentType = contentType; + return this; + } + public String getHost() { + return host; + } + public void setHost(String host) { + this.host = host; + } + public PropertiesBean withHost(String host) { + this.host = host; + return this; + } + public String getTopic() { + return topic; + } + public void setTopic(String topic) { + this.topic = topic; + } + public PropertiesBean withTopic(String topic) { + this.topic = topic; + return this; + } + public String getTimeout() { + return timeout; + } + public void setTimeout(String timeout) { + this.timeout = timeout; + } + public PropertiesBean withTimeout(String timeout) { + this.timeout = timeout; + return this; + } + + + + +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/rest/RestConsumer.java b/common/src/main/java/org/onap/so/client/dmaap/rest/RestConsumer.java new file mode 100644 index 0000000000..39af15635a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/rest/RestConsumer.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap.rest; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.RestClient; +import org.onap.so.client.dmaap.Consumer; + +public class RestConsumer implements Consumer { + + private final RestClient client; + public RestConsumer(Properties properties) { + PropertiesBean bean = new PropertiesBean(properties); + client = new DMaaPRestClient(this.createURL(bean), bean.getContentType(), bean.getUsername(), bean.getPassword()); + } + + private URL createURL(PropertiesBean properties) { + try { + return UriBuilder.fromUri(properties.getHost()) + .path("events").path(properties.getTopic()) + .path(properties.getPartition()) + .path("consumer1") + .queryParam("timeout", properties.getTimeout()).build().toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + @Override + public Iterable<String> fetch() { + + return client.get(new GenericType<List<String>>() {}).orElse(new ArrayList<>()); + } + +} diff --git a/common/src/main/java/org/onap/so/client/dmaap/rest/RestPublisher.java b/common/src/main/java/org/onap/so/client/dmaap/rest/RestPublisher.java new file mode 100644 index 0000000000..090e50543b --- /dev/null +++ b/common/src/main/java/org/onap/so/client/dmaap/rest/RestPublisher.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.dmaap.rest; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Properties; + +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.RestClient; +import org.onap.so.client.dmaap.Publisher; + +public class RestPublisher implements Publisher { + + private final RestClient client; + + public RestPublisher(Properties properties) { + PropertiesBean bean = new PropertiesBean(properties); + client = new DMaaPRestClient(this.createURL(bean), bean.getContentType(), bean.getUsername(), bean.getPassword()); + } + + private URL createURL(PropertiesBean properties) { + try { + return UriBuilder.fromUri(properties.getHost()) + .path("events").path(properties.getTopic()) + .queryParam("timeout", properties.getTimeout()).build().toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + @Override + public void send(String json) { + client.post(json); + } +} diff --git a/common/src/main/java/org/onap/so/client/exceptions/SDNOException.java b/common/src/main/java/org/onap/so/client/exceptions/SDNOException.java new file mode 100644 index 0000000000..1e14308ad5 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/exceptions/SDNOException.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.exceptions; + + +public class SDNOException extends Exception { + + private static final long serialVersionUID = 6189163383568887383L; + + public SDNOException() { + super(); + } + + public SDNOException(String string) { + super("SDN-O exception: " + string); + } + + public SDNOException(Exception e) { + super(e); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/Format.java b/common/src/main/java/org/onap/so/client/graphinventory/Format.java new file mode 100644 index 0000000000..5cbf1320c1 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/Format.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory; + +public enum Format { + + RESOURCE("resource"), + SIMPLE("simple"), + RAW("raw"), + CONSOLE("console"), + PATHED("pathed"), + GRAPHSON("graphson"), + ID("id"); + + private final String name; + + private Format(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java new file mode 100644 index 0000000000..0d10c21886 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryClient.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory; + +import java.net.URI; + +import org.onap.so.client.RestClient; +import org.onap.so.client.RestProperties; +import org.onap.so.client.RestPropertiesLoader; +import org.onap.so.client.graphinventory.entities.uri.GraphInventoryUri; + +public abstract class GraphInventoryClient { + + private RestProperties props; + protected GraphInventoryClient(Class<? extends RestProperties> propertiesClass) { + + RestProperties props = RestPropertiesLoader.getInstance().getNewImpl(propertiesClass); + this.props = props; + } + protected abstract URI constructPath(GraphInventoryUri uri); + + protected abstract RestClient createClient(GraphInventoryUri uri); + + protected <T extends RestProperties> T getRestProperties() { + if (props == null) { + throw new IllegalStateException("No RestProperty implementation found on classpath"); + } + return (T)props; + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectName.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectName.java new file mode 100644 index 0000000000..4543d8523b --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectName.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory; + +import com.google.common.base.CaseFormat; + +public interface GraphInventoryObjectName { + + public String typeName(); + public String typeName(CaseFormat format); +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectPlurals.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectPlurals.java new file mode 100644 index 0000000000..ba48eb279f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectPlurals.java @@ -0,0 +1,25 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory; + +public interface GraphInventoryObjectPlurals extends GraphInventoryObjectName, GraphInventoryObjectUriTemplate, GraphInventoryObjectUriPartial { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectType.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectType.java new file mode 100644 index 0000000000..453becb75a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectType.java @@ -0,0 +1,25 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory; + +public interface GraphInventoryObjectType extends GraphInventoryObjectName, GraphInventoryObjectUriTemplate, GraphInventoryObjectUriPartial { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectUriPartial.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectUriPartial.java new file mode 100644 index 0000000000..0987221b0d --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectUriPartial.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory; + +public interface GraphInventoryObjectUriPartial { + + public String partialUri(); +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectUriTemplate.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectUriTemplate.java new file mode 100644 index 0000000000..e231ddb811 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryObjectUriTemplate.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory; + +public interface GraphInventoryObjectUriTemplate { + + public String uriTemplate(); +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryVersion.java b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryVersion.java new file mode 100644 index 0000000000..3b7dba70f8 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/GraphInventoryVersion.java @@ -0,0 +1,25 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory; + +public interface GraphInventoryVersion { + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/Depth.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/Depth.java new file mode 100644 index 0000000000..1205511d11 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/Depth.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory.entities.uri; + +public enum Depth { + ZERO("0"), + ONE("1"), + TWO("2"), + THREE("3"), + FOUR("4"), + FIVE("5"), + SIX("6"), + ALL("all"); + + private final String depth; + private Depth(String s) { + + this.depth = s; + } + + + @Override + public String toString() { + return this.depth; + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryResourceUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryResourceUri.java new file mode 100644 index 0000000000..08e7304978 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryResourceUri.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory.entities.uri; + +import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; +import org.onap.so.client.graphinventory.GraphInventoryObjectType; + +public interface GraphInventoryResourceUri extends GraphInventoryUri { + public GraphInventoryResourceUri relationshipAPI(); + public GraphInventoryResourceUri relatedTo(GraphInventoryObjectPlurals plural); + public GraphInventoryResourceUri relatedTo(GraphInventoryObjectType type, String... values); + public GraphInventoryResourceUri resourceVersion(String version); + public GraphInventoryResourceUri format(Format format); + @Override + public GraphInventoryResourceUri depth(Depth depth); + @Override + public GraphInventoryResourceUri nodesOnly(boolean nodesOnly); + @Override + public GraphInventoryResourceUri queryParam(String name, String... values); + @Override + public GraphInventoryResourceUri replaceQueryParam(String name, String... values); + @Override + public GraphInventoryResourceUri clone(); +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryUri.java new file mode 100644 index 0000000000..8a25c23895 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/GraphInventoryUri.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory.entities.uri; + +import java.net.URI; +import java.util.Map; + +import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.graphinventory.GraphInventoryObjectType; + +public interface GraphInventoryUri { + + public URI build(); + /** + * By default GraphInventory enforces a depth of 1. Some objects can be told to retrieve objects + * nested beneath them by increasing this number. + * + * You can use 0 to restrict the returned information to only the object you requested + * You can use all to retrieve all nested objects (this should only be used if you really need a massive amount of information and are caching the retrieval) + * @param depth + * @return + */ + public GraphInventoryUri depth(Depth depth); + /** + * Makes client only return object fields, no relationships + * + * @return + */ + public GraphInventoryUri nodesOnly(boolean nodesOnly); + public GraphInventoryUri queryParam(String name, String... values); + public GraphInventoryUri replaceQueryParam(String name, String... values); + public GraphInventoryUri clone(); + + /** + * returns all key values of the URI as a map. Key names can be found in {@link GraphInventoryObjectType} + * @return + */ + public Map<String, String> getURIKeys(); + public GraphInventoryObjectType getObjectType(); + public boolean equals(Object o); + public int hashCode(); +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java new file mode 100644 index 0000000000..9c86ec6348 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/SimpleUri.java @@ -0,0 +1,216 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory.entities.uri; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.core.UriBuilder; + +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.onap.so.client.graphinventory.Format; +import org.onap.so.client.aai.entities.uri.AAIUri; +import org.onap.so.client.graphinventory.entities.uri.Depth; +import org.onap.so.client.graphinventory.entities.uri.parsers.UriParser; +import org.onap.so.client.graphinventory.entities.uri.parsers.UriParserSpringImpl; +import org.onap.so.client.graphinventory.GraphInventoryObjectPlurals; +import org.onap.so.client.graphinventory.GraphInventoryObjectType; +import org.springframework.web.util.UriUtils; + +public class SimpleUri implements GraphInventoryResourceUri { + + protected UriBuilder internalURI; + protected final static String relationshipAPI = "/relationship-list/relationship"; + protected final static String relatedTo = "/related-to"; + protected final Object[] values; + protected final GraphInventoryObjectType type; + protected final GraphInventoryObjectPlurals pluralType; + protected SimpleUri(GraphInventoryObjectType type, Object... values) { + this.type = type; + this.pluralType = null; + this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); + this.values = values; + } + protected SimpleUri(GraphInventoryObjectType type, URI uri) { + this.type = type; + this.pluralType = null; + this.internalURI = UriBuilder.fromPath(uri.getRawPath().replaceAll("/aai/v\\d+", "")); + this.values = new Object[0]; + } + protected SimpleUri(GraphInventoryObjectType type, UriBuilder builder, Object... values) { + this.internalURI = builder; + this.values = values; + this.type = type; + this.pluralType = null; + } + protected SimpleUri(GraphInventoryObjectPlurals type, UriBuilder builder, Object... values) { + this.internalURI = builder; + this.values = values; + this.type = null; + this.pluralType = type; + } + protected SimpleUri(GraphInventoryObjectPlurals type) { + this.type = null; + this.pluralType = type; + this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); + this.values = new Object[0]; + } + protected SimpleUri(GraphInventoryObjectPlurals type, Object... values) { + this.type = null; + this.pluralType = type; + this.internalURI = UriBuilder.fromPath(this.getTemplate(type)); + this.values = values; + } + + @Override + public SimpleUri relationshipAPI() { + this.internalURI = internalURI.path(relationshipAPI); + return this; + } + + @Override + public SimpleUri relatedTo(GraphInventoryObjectPlurals plural) { + + this.internalURI = internalURI.path(relatedTo).path(plural.partialUri()); + return this; + } + @Override + public SimpleUri relatedTo(GraphInventoryObjectType type, String... values) { + this.internalURI = internalURI.path(relatedTo).path(UriBuilder.fromPath(type.partialUri()).build(values).toString()); + return this; + } + + @Override + public SimpleUri resourceVersion(String version) { + this.internalURI = internalURI.replaceQueryParam("resource-version", version); + return this; + } + + @Override + public SimpleUri queryParam(String name, String... values) { + this.internalURI = internalURI.queryParam(name, values); + return this; + } + + @Override + public SimpleUri replaceQueryParam(String name, String... values) { + this.internalURI = internalURI.replaceQueryParam(name, values); + return this; + } + + @Override + public URI build() { + return build(this.values); + } + + protected URI build(Object... values) { + //This is a workaround because resteasy does not encode URIs correctly + final String[] encoded = new String[values.length]; + for (int i = 0; i < values.length; i++) { + try { + encoded[i] = UriUtils.encode(values[i].toString(), StandardCharsets.UTF_8.toString()); + } catch (UnsupportedEncodingException e) { + encoded[i] = values[i].toString(); + } + } + return internalURI.buildFromEncoded(encoded); + } + + @Override + public Map<String, String> getURIKeys() { + return this.getURIKeys(this.build().toString()); + } + + protected Map<String, String> getURIKeys(String uri) { + UriParser parser; + if (this.type != null) { + if (!("".equals(this.getTemplate(type)))) { + parser = new UriParserSpringImpl(this.getTemplate(type)); + } else { + return new HashMap<>(); + } + } else { + parser = new UriParserSpringImpl(this.getTemplate(pluralType)); + } + + + return parser.parse(uri); + } + + @Override + public SimpleUri clone() { + if (this.type != null) { + return new SimpleUri(this.type, this.internalURI.clone(), values); + } else { + return new SimpleUri(this.pluralType, this.internalURI.clone(), values); + } + } + + @Override + public GraphInventoryObjectType getObjectType() { + return this.type; + } + + @Override + public boolean equals(Object o) { + if (o instanceof AAIUri) { + return this.build().equals(((AAIUri)o).build()); + } + return false; + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(this.build()).toHashCode(); + } + + + @Override + public SimpleUri depth(Depth depth) { + this.internalURI.replaceQueryParam("depth", depth.toString()); + return this; + } + @Override + public SimpleUri nodesOnly(boolean nodesOnly) { + if (nodesOnly) { + this.internalURI.replaceQueryParam("nodes-only", ""); + } + return this; + } + + @Override + public SimpleUri format(Format format) { + this.internalURI.replaceQueryParam("format", format); + return this; + } + + protected String getTemplate(GraphInventoryObjectType type) { + return type.uriTemplate(); + } + + protected String getTemplate(GraphInventoryObjectPlurals type) { + return type.uriTemplate(); + } + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/parsers/UriParser.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/parsers/UriParser.java new file mode 100644 index 0000000000..03d83ebfb6 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/parsers/UriParser.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory.entities.uri.parsers; + +import java.util.Map; +import java.util.Set; + +public interface UriParser { + public Set<String> getVariables(); + public Map<String, String> parse(final String uri); +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/parsers/UriParserSpringImpl.java b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/parsers/UriParserSpringImpl.java new file mode 100644 index 0000000000..aeaa923d1b --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/entities/uri/parsers/UriParserSpringImpl.java @@ -0,0 +1,68 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory.entities.uri.parsers; +import java.io.UnsupportedEncodingException; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.springframework.web.util.UriTemplate; +import org.springframework.web.util.UriUtils; + +public class UriParserSpringImpl implements UriParser { + + private final UriTemplate uriTemplate; + + public UriParserSpringImpl(final String template) { + this.uriTemplate = new UriTemplate(template); + } + + @Override + public Map<String, String> parse(final String uri) { + final boolean match = this.uriTemplate.matches(uri); + if (!match) { + return new LinkedHashMap<>(); + } + return Collections.unmodifiableMap(decodeParams(this.uriTemplate.match(uri))); + } + + @Override + public Set<String> getVariables() { + return Collections.unmodifiableSet(new LinkedHashSet<String>(this.uriTemplate.getVariableNames())); + } + + protected Map<String, String> decodeParams(Map<String, String> map) { + final Map<String, String> result = new LinkedHashMap<>(); + + for (Entry<String, String> entry : map.entrySet()) { + try { + result.put(entry.getKey(), UriUtils.decode(entry.getValue(), "UTF-8")); + } catch (UnsupportedEncodingException e) { + result.put(entry.getKey(), ""); + } + } + + return result; + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/BulkProcessFailed.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/BulkProcessFailed.java new file mode 100644 index 0000000000..0c973a8457 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/BulkProcessFailed.java @@ -0,0 +1,28 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory.exceptions; + +public class BulkProcessFailed extends Exception { + + public BulkProcessFailed(String message) { + super(message); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryPatchDepthExceededException.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryPatchDepthExceededException.java new file mode 100644 index 0000000000..07af13049c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryPatchDepthExceededException.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.client.graphinventory.exceptions; + +public class GraphInventoryPatchDepthExceededException extends RuntimeException { + + private static final long serialVersionUID = -3740429832086738907L; + + + public GraphInventoryPatchDepthExceededException(String payload) { + super("Object exceeds allowed depth for update action: " + payload); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryPayloadException.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryPayloadException.java new file mode 100644 index 0000000000..24a6e5ccf9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryPayloadException.java @@ -0,0 +1,40 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory.exceptions; + +public class GraphInventoryPayloadException extends Exception { + + private static final long serialVersionUID = -5712783905947711065L; + + public GraphInventoryPayloadException(Throwable t) { + super(t); + } + + public GraphInventoryPayloadException(String s, Throwable t) { + super(s, t); + } + + public GraphInventoryPayloadException(String s) { + super(s); + } + + +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryUriComputationException.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryUriComputationException.java new file mode 100644 index 0000000000..51747d495a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryUriComputationException.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory.exceptions; + +public class GraphInventoryUriComputationException extends RuntimeException { + + private static final long serialVersionUID = 5187931752227522034L; + + public GraphInventoryUriComputationException(String s) { + super(s); + } + + public GraphInventoryUriComputationException(Throwable t) { + super(t); + } +} diff --git a/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryUriNotFoundException.java b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryUriNotFoundException.java new file mode 100644 index 0000000000..d2f47a5b00 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/graphinventory/exceptions/GraphInventoryUriNotFoundException.java @@ -0,0 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.graphinventory.exceptions; + +public class GraphInventoryUriNotFoundException extends Exception { + private static final long serialVersionUID = 2789643165122257833L; + + public GraphInventoryUriNotFoundException(String message) { + super(message); + } +} diff --git a/common/src/main/java/org/onap/so/client/grm/GRMAction.java b/common/src/main/java/org/onap/so/client/grm/GRMAction.java new file mode 100644 index 0000000000..376c736037 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/GRMAction.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm; + +public enum GRMAction { + + FIND_RUNNING("findRunning"), + ADD("add"); + + private final String action; + + GRMAction(String action) { + this.action = action; + } + + public String getAction() { + return action; + } +} diff --git a/common/src/main/java/org/onap/so/client/grm/GRMClient.java b/common/src/main/java/org/onap/so/client/grm/GRMClient.java new file mode 100644 index 0000000000..84e25b9ce4 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/GRMClient.java @@ -0,0 +1,83 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm; + +import org.onap.so.client.grm.beans.ServiceEndPointList; +import org.onap.so.client.grm.beans.ServiceEndPointLookup; +import org.onap.so.client.grm.beans.ServiceEndPointLookupRequest; +import org.onap.so.client.grm.beans.ServiceEndPointRequest; +import org.onap.so.client.grm.beans.VersionLookup; +import org.onap.so.client.grm.exceptions.GRMClientCallFailed; + +public class GRMClient { + + public String findRunningServicesAsString(String name, int majorVersion, String env) throws Exception { + + ServiceEndPointLookupRequest request = buildServiceEndPointlookupRequest(name, majorVersion, env); + try { + GRMRestInvoker invoker = this.getInvoker(GRMAction.FIND_RUNNING); + return invoker.post(request, String.class); + } + catch(Exception e) { + throw new GRMClientCallFailed("Call to GRM findRunning failed: " + e.getMessage(), e); + } + } + + public ServiceEndPointList findRunningServices(String name, int majorVersion, String env) throws Exception { + + ServiceEndPointLookupRequest request = buildServiceEndPointlookupRequest(name, majorVersion, env); + try { + GRMRestInvoker invoker = this.getInvoker(GRMAction.FIND_RUNNING); + return invoker.post(request, ServiceEndPointList.class); + } + catch(Exception e) { + throw new GRMClientCallFailed("Call to GRM findRunning failed: " + e.getMessage(), e); + } + } + + protected ServiceEndPointLookupRequest buildServiceEndPointlookupRequest(String name, int majorVersion, String env) { + VersionLookup version = new VersionLookup(); + version.setMajor(majorVersion); + + ServiceEndPointLookup endpoint = new ServiceEndPointLookup(); + endpoint.setName(name); + endpoint.setVersion(version); + + ServiceEndPointLookupRequest request = new ServiceEndPointLookupRequest(); + request.setServiceEndPoint(endpoint); + request.setEnv(env); + return request; + } + + public void addServiceEndPoint(ServiceEndPointRequest request) throws Exception { + try { + GRMRestInvoker invoker = this.getInvoker(GRMAction.ADD); + invoker.post(request); + } + catch(Exception e) { + throw new GRMClientCallFailed("Call to GRM addServiceEndPoint failed: " + e.getMessage(), e); + } + } + + protected GRMRestInvoker getInvoker(GRMAction action) { + return new GRMRestInvoker(action); + } +} diff --git a/common/src/main/java/org/onap/so/client/grm/GRMDefaultPropertiesImpl.java b/common/src/main/java/org/onap/so/client/grm/GRMDefaultPropertiesImpl.java new file mode 100644 index 0000000000..b38072e769 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/GRMDefaultPropertiesImpl.java @@ -0,0 +1,63 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm; + +import java.net.MalformedURLException; +import java.net.URL; + +import javax.ws.rs.core.MediaType; + +public class GRMDefaultPropertiesImpl implements GRMProperties { + + public GRMDefaultPropertiesImpl() { + } + + @Override + public URL getEndpoint() throws MalformedURLException { + return new URL("http://localhost:47389"); + } + + @Override + public String getSystemName() { + return "MSO"; + } + + @Override + public String getDefaultVersion() { + return "v1"; + } + + @Override + public String getUsername() { + return "gmruser"; + } + + @Override + public String getPassword() { + return "cGFzc3dvcmQ="; + } + + @Override + public String getContentType() { + return MediaType.APPLICATION_JSON; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/GRMProperties.java b/common/src/main/java/org/onap/so/client/grm/GRMProperties.java new file mode 100644 index 0000000000..da9f215aac --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/GRMProperties.java @@ -0,0 +1,30 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm; + +import org.onap.so.client.RestProperties; + +public interface GRMProperties extends RestProperties { + public String getDefaultVersion(); + public String getUsername(); + public String getPassword(); + public String getContentType(); +} diff --git a/common/src/main/java/org/onap/so/client/grm/GRMPropertiesLoader.java b/common/src/main/java/org/onap/so/client/grm/GRMPropertiesLoader.java new file mode 100644 index 0000000000..485b9b0d15 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/GRMPropertiesLoader.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm; + +import java.util.Iterator; +import java.util.ServiceLoader; + +public class GRMPropertiesLoader { + + private final ServiceLoader<GRMProperties> services; + private GRMPropertiesLoader() { + services = ServiceLoader.load(GRMProperties.class); + } + + private static class Helper { + private static final GRMPropertiesLoader INSTANCE = new GRMPropertiesLoader(); + } + + public static GRMPropertiesLoader getInstance() { + return Helper.INSTANCE; + } + + public GRMProperties getImpl() { + Iterator<GRMProperties> propertyImpls = services.iterator(); + while (propertyImpls.hasNext()) { + return propertyImpls.next(); + } + return null; + } +} diff --git a/common/src/main/java/org/onap/so/client/grm/GRMRestClient.java b/common/src/main/java/org/onap/so/client/grm/GRMRestClient.java new file mode 100644 index 0000000000..ce16ccaaaa --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/GRMRestClient.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm; + + +import java.net.URI; +import java.util.Base64; +import java.util.Map; +import java.util.Optional; + +import org.onap.so.client.RestClient; +import org.onap.so.client.RestProperties; +import org.onap.so.utils.TargetEntity; + +public class GRMRestClient extends RestClient { + + private final String username; + private final String password; + + public GRMRestClient(RestProperties props, URI path, String username, String password) { + super(props, Optional.of(path)); + this.username = username; + this.password = password; + } + + @Override + public TargetEntity getTargetEntity(){ + return TargetEntity.GRM; + } + + @Override + protected void initializeHeaderMap(Map<String, String> headerMap) { + headerMap.put("Authorization", "Basic " + Base64.getEncoder().encodeToString(new String(username + ":" + password).getBytes())); + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/GRMRestInvoker.java b/common/src/main/java/org/onap/so/client/grm/GRMRestInvoker.java new file mode 100644 index 0000000000..3045cb35f4 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/GRMRestInvoker.java @@ -0,0 +1,73 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm; + +import java.net.URI; +import java.util.Base64; + +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.RestClient; + +public class GRMRestInvoker { + + private final RestClient client; + private final GRMProperties properties; + + public GRMRestInvoker(GRMAction action) { + GRMProperties props = GRMPropertiesLoader.getInstance().getImpl(); + if (props == null) { + props = new GRMDefaultPropertiesImpl(); + } + this.properties = props; + this.client = new GRMRestClient(this.properties, this.createURI(action), this.properties.getUsername(), this.decode(this.properties.getPassword())); + } + + private URI createURI(GRMAction action) { + return UriBuilder.fromUri("/GRMLWPService") + .path(this.properties.getDefaultVersion()) + .path("serviceEndPoint") + .path(action.getAction()) + .build(); + } + + private String decode(String cred) { + try { + return new String(Base64.getDecoder().decode(cred.getBytes())); + } + catch(IllegalArgumentException iae) { + return cred; + } + } + + private RestClient getClient() { + return this.client; + } + + public void post(Object obj) { + getClient().post(obj); + } + + public <T> T post(Object obj, Class<T> resultClass) { + return getClient().post(obj, resultClass); + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/OperationalInfo.java b/common/src/main/java/org/onap/so/client/grm/beans/OperationalInfo.java new file mode 100644 index 0000000000..85e15f597c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/OperationalInfo.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "createdBy", "updatedBy", "createdTimestamp", "updatedTimestamp" }) +public class OperationalInfo implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = -7213334079745439793L; + @JsonProperty("createdBy") + private String createdBy; + @JsonProperty("updatedBy") + private String updatedBy; + @JsonProperty("createdTimestamp") + private String createdTimestamp; + @JsonProperty("updatedTimestamp") + private String updatedTimestamp; + + @JsonProperty("createdBy") + public String getCreatedBy() { + return createdBy; + } + + @JsonProperty("createdBy") + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + @JsonProperty("updatedBy") + public String getUpdatedBy() { + return updatedBy; + } + + @JsonProperty("updatedBy") + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + @JsonProperty("createdTimestamp") + public String getCreatedTimestamp() { + return createdTimestamp; + } + + @JsonProperty("createdTimestamp") + public void setCreatedTimestamp(String createdTimestamp) { + this.createdTimestamp = createdTimestamp; + } + + @JsonProperty("updatedTimestamp") + public String getUpdatedTimestamp() { + return updatedTimestamp; + } + + @JsonProperty("updatedTimestamp") + public void setUpdatedTimestamp(String updatedTimestamp) { + this.updatedTimestamp = updatedTimestamp; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/Property.java b/common/src/main/java/org/onap/so/client/grm/beans/Property.java new file mode 100644 index 0000000000..705db95222 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/Property.java @@ -0,0 +1,64 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "name", "value" }) +public class Property implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = -6060749559638446881L; + @JsonProperty("name") + private String name; + @JsonProperty("value") + private String value; + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + @JsonProperty("value") + public String getValue() { + return value; + } + + @JsonProperty("value") + public void setValue(String value) { + this.value = value; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPoint.java b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPoint.java new file mode 100644 index 0000000000..e739f00c9a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPoint.java @@ -0,0 +1,247 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.io.Serializable; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "serviceEndPoint") +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "name", "version", "hostAddress", "listenPort", "latitude", "longitude", "registrationTime", + "expirationTime", "contextPath", "routeOffer", "statusInfo", "eventStatusInfo", "validatorStatusInfo", + "operationalInfo", "protocol", "properties", "disableType" }) +public class ServiceEndPoint implements Serializable { + + private static final long serialVersionUID = -1594441352549128491L; + + @JsonProperty("name") + private String name; + @JsonProperty("version") + private Version version; + @JsonProperty("hostAddress") + private String hostAddress; + @JsonProperty("listenPort") + private String listenPort; + @JsonProperty("latitude") + private String latitude; + @JsonProperty("longitude") + private String longitude; + @JsonProperty("registrationTime") + private String registrationTime; + @JsonProperty("expirationTime") + private String expirationTime; + @JsonProperty("contextPath") + private String contextPath; + @JsonProperty("routeOffer") + private String routeOffer; + @JsonProperty("statusInfo") + private Status statusInfo; + @JsonProperty("eventStatusInfo") + private Status eventStatusInfo; + @JsonProperty("validatorStatusInfo") + private Status validatorStatusInfo; + @JsonProperty("operationalInfo") + private OperationalInfo operationalInfo; + @JsonProperty("protocol") + private String protocol; + @JsonProperty("properties") + private List<Property> properties = null; + @JsonProperty("disableType") + private List<Object> disableType = null; + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + @JsonProperty("version") + public Version getVersion() { + return version; + } + + @JsonProperty("version") + public void setVersion(Version version) { + this.version = version; + } + + @JsonProperty("hostAddress") + public String getHostAddress() { + return hostAddress; + } + + @JsonProperty("hostAddress") + public void setHostAddress(String hostAddress) { + this.hostAddress = hostAddress; + } + + @JsonProperty("listenPort") + public String getListenPort() { + return listenPort; + } + + @JsonProperty("listenPort") + public void setListenPort(String listenPort) { + this.listenPort = listenPort; + } + + @JsonProperty("latitude") + public String getLatitude() { + return latitude; + } + + @JsonProperty("latitude") + public void setLatitude(String latitude) { + this.latitude = latitude; + } + + @JsonProperty("longitude") + public String getLongitude() { + return longitude; + } + + @JsonProperty("longitude") + public void setLongitude(String longitude) { + this.longitude = longitude; + } + + @JsonProperty("registrationTime") + public String getRegistrationTime() { + return registrationTime; + } + + @JsonProperty("registrationTime") + public void setRegistrationTime(String registrationTime) { + this.registrationTime = registrationTime; + } + + @JsonProperty("expirationTime") + public String getExpirationTime() { + return expirationTime; + } + + @JsonProperty("expirationTime") + public void setExpirationTime(String expirationTime) { + this.expirationTime = expirationTime; + } + + @JsonProperty("contextPath") + public String getContextPath() { + return contextPath; + } + + @JsonProperty("contextPath") + public void setContextPath(String contextPath) { + this.contextPath = contextPath; + } + + @JsonProperty("routeOffer") + public String getRouteOffer() { + return routeOffer; + } + + @JsonProperty("routeOffer") + public void setRouteOffer(String routeOffer) { + this.routeOffer = routeOffer; + } + + @JsonProperty("statusInfo") + public Status getStatusInfo() { + return statusInfo; + } + + @JsonProperty("statusInfo") + public void setStatusInfo(Status statusInfo) { + this.statusInfo = statusInfo; + } + + @JsonProperty("eventStatusInfo") + public Status getEventStatusInfo() { + return eventStatusInfo; + } + + @JsonProperty("eventStatusInfo") + public void setEventStatusInfo(Status eventStatusInfo) { + this.eventStatusInfo = eventStatusInfo; + } + + @JsonProperty("validatorStatusInfo") + public Status getValidatorStatusInfo() { + return validatorStatusInfo; + } + + @JsonProperty("validatorStatusInfo") + public void setValidatorStatusInfo(Status validatorStatusInfo) { + this.validatorStatusInfo = validatorStatusInfo; + } + + @JsonProperty("operationalInfo") + public OperationalInfo getOperationalInfo() { + return operationalInfo; + } + + @JsonProperty("operationalInfo") + public void setOperationalInfo(OperationalInfo operationalInfo) { + this.operationalInfo = operationalInfo; + } + + @JsonProperty("protocol") + public String getProtocol() { + return protocol; + } + + @JsonProperty("protocol") + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + @JsonProperty("properties") + public List<Property> getProperties() { + return properties; + } + + @JsonProperty("properties") + public void setProperties(List<Property> properties) { + this.properties = properties; + } + + @JsonProperty("disableType") + public List<Object> getDisableType() { + return disableType; + } + + @JsonProperty("disableType") + public void setDisableType(List<Object> disableType) { + this.disableType = disableType; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointList.java b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointList.java new file mode 100644 index 0000000000..19bbe69cf2 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointList.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "serviceEndPointList" }) +public class ServiceEndPointList { + + @JsonProperty("serviceEndPointList") + private List<ServiceEndPoint> serviceEndPointList = null; + + @JsonProperty("serviceEndPointList") + public List<ServiceEndPoint> getServiceEndPointList() { + return serviceEndPointList; + } + + @JsonProperty("serviceEndPointList") + public void setServiceEndPointList(List<ServiceEndPoint> serviceEndPointList) { + this.serviceEndPointList = serviceEndPointList; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointLookup.java b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointLookup.java new file mode 100644 index 0000000000..cab10e64f4 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointLookup.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "serviceEndPoint") +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ "name", "version"}) +public class ServiceEndPointLookup implements Serializable { + + private static final long serialVersionUID = 8867758152519088615L; + + @JsonProperty("name") + private String name; + @JsonProperty("version") + private VersionLookup version; + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + @JsonProperty("version") + public VersionLookup getVersion() { + return version; + } + + @JsonProperty("version") + public void setVersion(VersionLookup version) { + this.version = version; + } +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointLookupRequest.java b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointLookupRequest.java new file mode 100644 index 0000000000..5e886300dd --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointLookupRequest.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "serviceEndPoint", "env" }) +public class ServiceEndPointLookupRequest { + + @JsonProperty("serviceEndPoint") + private ServiceEndPointLookup serviceEndPoint; + @JsonProperty("env") + private String env; + + @JsonProperty("serviceEndPoint") + public ServiceEndPointLookup getServiceEndPoint() { + return serviceEndPoint; + } + + @JsonProperty("serviceEndPoint") + public void setServiceEndPoint(ServiceEndPointLookup serviceEndPoint) { + this.serviceEndPoint = serviceEndPoint; + } + + @JsonProperty("env") + public String getEnv() { + return env; + } + + @JsonProperty("env") + public void setEnv(String env) { + this.env = env; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointRequest.java b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointRequest.java new file mode 100644 index 0000000000..f7ea352f21 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/ServiceEndPointRequest.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "serviceEndPoint", "env" }) +public class ServiceEndPointRequest { + + @JsonProperty("serviceEndPoint") + private ServiceEndPoint serviceEndPoint; + @JsonProperty("env") + private String env; + + @JsonProperty("serviceEndPoint") + public ServiceEndPoint getServiceEndPoint() { + return serviceEndPoint; + } + + @JsonProperty("serviceEndPoint") + public void setServiceEndPoint(ServiceEndPoint serviceEndPoint) { + this.serviceEndPoint = serviceEndPoint; + } + + @JsonProperty("env") + public String getEnv() { + return env; + } + + @JsonProperty("env") + public void setEnv(String env) { + this.env = env; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/Status.java b/common/src/main/java/org/onap/so/client/grm/beans/Status.java new file mode 100644 index 0000000000..8794139b67 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/Status.java @@ -0,0 +1,88 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "status", "statusReasonCode", "statusReasonDescription", "statusCheckTime" }) +public class Status implements Serializable { + + /** + * + */ + private static final long serialVersionUID = -3555636617671062648L; + @JsonProperty("status") + private String status; + @JsonProperty("statusReasonCode") + private String statusReasonCode; + @JsonProperty("statusReasonDescription") + private String statusReasonDescription; + @JsonProperty("statusCheckTime") + private String statusCheckTime; + + @JsonProperty("status") + public String getStatus() { + return status; + } + + @JsonProperty("status") + public void setStatus(String status) { + this.status = status; + } + + @JsonProperty("statusReasonCode") + public String getStatusReasonCode() { + return statusReasonCode; + } + + @JsonProperty("statusReasonCode") + public void setStatusReasonCode(String statusReasonCode) { + this.statusReasonCode = statusReasonCode; + } + + @JsonProperty("statusReasonDescription") + public String getStatusReasonDescription() { + return statusReasonDescription; + } + + @JsonProperty("statusReasonDescription") + public void setStatusReasonDescription(String statusReasonDescription) { + this.statusReasonDescription = statusReasonDescription; + } + + @JsonProperty("statusCheckTime") + public String getStatusCheckTime() { + return statusCheckTime; + } + + @JsonProperty("statusCheckTime") + public void setStatusCheckTime(String statusCheckTime) { + this.statusCheckTime = statusCheckTime; + } + +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/Version.java b/common/src/main/java/org/onap/so/client/grm/beans/Version.java new file mode 100644 index 0000000000..fd1e5803ab --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/Version.java @@ -0,0 +1,75 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "major", "minor", "patch" }) +public class Version implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = 7509573030831487410L; + @JsonProperty("major") + private Integer major; + @JsonProperty("minor") + private Integer minor; + @JsonProperty("patch") + private String patch; + + @JsonProperty("major") + public Integer getMajor() { + return major; + } + + @JsonProperty("major") + public void setMajor(Integer major) { + this.major = major; + } + + @JsonProperty("minor") + public Integer getMinor() { + return minor; + } + + @JsonProperty("minor") + public void setMinor(Integer minor) { + this.minor = minor; + } + + @JsonProperty("patch") + public String getPatch() { + return patch; + } + + @JsonProperty("patch") + public void setPatch(String patch) { + this.patch = patch; + } +} diff --git a/common/src/main/java/org/onap/so/client/grm/beans/VersionLookup.java b/common/src/main/java/org/onap/so/client/grm/beans/VersionLookup.java new file mode 100644 index 0000000000..0dc86b04d6 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/beans/VersionLookup.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.beans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ "major" }) +public class VersionLookup implements Serializable { + + private static final long serialVersionUID = 3802602253627725770L; + + @JsonProperty("major") + private Integer major; + + @JsonProperty("major") + public Integer getMajor() { + return major; + } + + @JsonProperty("major") + public void setMajor(Integer major) { + this.major = major; + } +} diff --git a/common/src/main/java/org/onap/so/client/grm/exceptions/GRMClientCallFailed.java b/common/src/main/java/org/onap/so/client/grm/exceptions/GRMClientCallFailed.java new file mode 100644 index 0000000000..7107d4027f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/grm/exceptions/GRMClientCallFailed.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.grm.exceptions; + +public class GRMClientCallFailed extends Exception { + + private static final long serialVersionUID = -8714110346844078779L; + + public GRMClientCallFailed(String message, Throwable cause) { + super(message, cause); + } + + +} diff --git a/common/src/main/java/org/onap/so/client/policy/CommonObjectMapperProvider.java b/common/src/main/java/org/onap/so/client/policy/CommonObjectMapperProvider.java new file mode 100644 index 0000000000..f2f6f0362f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/CommonObjectMapperProvider.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +public class CommonObjectMapperProvider { + + protected ObjectMapper mapper; + + public CommonObjectMapperProvider() { + + mapper = new ObjectMapper(); + mapper.setSerializationInclusion(Include.NON_NULL); + mapper.enable(MapperFeature.USE_ANNOTATIONS); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); + mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, false); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + } + + public ObjectMapper getMapper() { + return mapper; + } +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/client/policy/DecisionAttributes.java b/common/src/main/java/org/onap/so/client/policy/DecisionAttributes.java new file mode 100644 index 0000000000..951372db42 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/DecisionAttributes.java @@ -0,0 +1,93 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + + + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ "ServiceType", "VNFType", "BB_ID", "WorkStep", "ErrorCode" }) +public class DecisionAttributes { + + @JsonProperty("ServiceType") + private String serviceType; + @JsonProperty("VNFType") + private String vNFType; + @JsonProperty("BB_ID") + private String bbID; + @JsonProperty("WorkStep") + private String workStep; + @JsonProperty("ErrorCode") + private String errorCode; + + @JsonProperty("ServiceType") + public String getServiceType() { + return serviceType; + } + + @JsonProperty("ServiceType") + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + @JsonProperty("VNFType") + public String getVNFType() { + return vNFType; + } + + @JsonProperty("VNFType") + public void setVNFType(String vNFType) { + this.vNFType = vNFType; + } + + @JsonProperty("BB_ID") + public String getBBID() { + return bbID; + } + + @JsonProperty("BB_ID") + public void setBBID(String bBID) { + this.bbID = bBID; + } + + @JsonProperty("WorkStep") + public String getWorkStep() { + return workStep; + } + + @JsonProperty("WorkStep") + public void setWorkStep(String workStep) { + this.workStep = workStep; + } + + @JsonProperty("ErrorCode") + public String getErrorCode() { + return errorCode; + } + + @JsonProperty("ErrorCode") + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } +} diff --git a/common/src/main/java/org/onap/so/client/policy/JettisonStyleMapperProvider.java b/common/src/main/java/org/onap/so/client/policy/JettisonStyleMapperProvider.java new file mode 100644 index 0000000000..23b984a3d0 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/JettisonStyleMapperProvider.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; + +@Component +public class JettisonStyleMapperProvider extends CommonObjectMapperProvider { + + public JettisonStyleMapperProvider() { + + mapper = new ObjectMapper(); + JaxbAnnotationModule jaxbModule = new JaxbAnnotationModule(); + mapper.setSerializationInclusion(Include.NON_NULL); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); + mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.registerModule(jaxbModule); + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/LoggingFilter.java b/common/src/main/java/org/onap/so/client/policy/LoggingFilter.java new file mode 100644 index 0000000000..83cf08f77f --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/LoggingFilter.java @@ -0,0 +1,157 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import javax.annotation.Priority; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.ext.Provider; +import javax.ws.rs.ext.WriterInterceptor; +import javax.ws.rs.ext.WriterInterceptorContext; + +import org.onap.so.logger.MsoLogger; + + +@Provider +@Priority(0) +public class LoggingFilter implements ClientRequestFilter, ClientResponseFilter, WriterInterceptor { + + private static final MsoLogger logger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, LoggingFilter.class); + private static final String ENTITY_STREAM_PROPERTY = "LoggingFilter.entityStream"; + private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; + private final int maxEntitySize; + + public LoggingFilter() { + maxEntitySize = 1024 * 1024; + } + + public LoggingFilter(int maxPayloadSize) { + this.maxEntitySize = Integer.min(maxPayloadSize, 1024 * 1024); + } + + private void log(StringBuilder sb) { + logger.debug(sb.toString()); + } + + protected InputStream logInboundEntity(final StringBuilder b, InputStream stream, final Charset charset) + throws IOException { + if (!stream.markSupported()) { + stream = new BufferedInputStream(stream); + } + stream.mark(maxEntitySize + 1); + final byte[] entity = new byte[maxEntitySize + 1]; + final int entitySize = stream.read(entity); + if (entitySize != -1) { + b.append(new String(entity, 0, Math.min(entitySize, maxEntitySize), charset)); + } + if (entitySize > maxEntitySize) { + b.append("...more..."); + } + b.append('\n'); + stream.reset(); + return stream; + } + + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + if (requestContext.hasEntity()) { + final OutputStream stream = new LoggingStream(requestContext.getEntityStream()); + requestContext.setEntityStream(stream); + requestContext.setProperty(ENTITY_STREAM_PROPERTY, stream); + } + String method = formatMethod(requestContext); + log(new StringBuilder("Making " + method + " request to: " + requestContext.getUri() + "\nRequest Headers: " + requestContext.getHeaders().toString())); + + } + + @Override + public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException { + final StringBuilder sb = new StringBuilder(); + if (responseContext.hasEntity()) { + responseContext.setEntityStream(logInboundEntity(sb, responseContext.getEntityStream(), DEFAULT_CHARSET)); + String method = formatMethod(requestContext); + log(sb.insert(0, "Response from " + method + ": " + requestContext.getUri() + "\nResponse Headers: " + responseContext.getHeaders().toString())); + } + } + + @Override + public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { + final LoggingStream stream = (LoggingStream) context.getProperty(ENTITY_STREAM_PROPERTY); + context.proceed(); + if (stream != null) { + log(stream.getStringBuilder(DEFAULT_CHARSET)); + } + } + + private class LoggingStream extends FilterOutputStream { + + private final StringBuilder sb = new StringBuilder(); + private final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + LoggingStream(OutputStream out) { + super(out); + } + + StringBuilder getStringBuilder(Charset charset) { + // write entity to the builder + final byte[] entity = baos.toByteArray(); + + sb.append(new String(entity, 0, entity.length, charset)); + if (entity.length > maxEntitySize) { + sb.append("...more..."); + } + sb.append('\n'); + + return sb; + } + + @Override + public void write(final int i) throws IOException { + if (baos.size() <= maxEntitySize) { + baos.write(i); + } + out.write(i); + } + } + + private String formatMethod(ClientRequestContext requestContext) { + String method = requestContext.getHeaderString("X-HTTP-Method-Override"); + if (method == null) { + method = requestContext.getMethod(); + } else { + method = requestContext.getMethod() + " (overridden to " + method + ")"; + } + + return method; + } +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/client/policy/PolicyClient.java b/common/src/main/java/org/onap/so/client/policy/PolicyClient.java new file mode 100644 index 0000000000..74c1e398db --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/PolicyClient.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + +import org.onap.so.client.policy.entities.DictionaryData; +import org.onap.so.client.policy.entities.PolicyDecision; + +public interface PolicyClient { + + public PolicyDecision getDecision(String serviceType, String vnfType, String bbID, String workStep, + String errorCode); + + public DictionaryData getAllowedTreatments(String bbID, String workStep); +} diff --git a/common/src/main/java/org/onap/so/client/policy/PolicyClientImpl.java b/common/src/main/java/org/onap/so/client/policy/PolicyClientImpl.java new file mode 100644 index 0000000000..1fd01e65ed --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/PolicyClientImpl.java @@ -0,0 +1,96 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + +import java.util.List; + +import org.onap.so.client.RestClient; +import org.onap.so.client.RestPropertiesLoader; +import org.onap.so.client.defaultproperties.PolicyRestPropertiesImpl; +import org.onap.so.client.policy.entities.AllowedTreatments; +import org.onap.so.client.policy.entities.Bbid; +import org.onap.so.client.policy.entities.DecisionAttributes; +import org.onap.so.client.policy.entities.DictionaryData; +import org.onap.so.client.policy.entities.DictionaryItemsRequest; +import org.onap.so.client.policy.entities.DictionaryJson; +import org.onap.so.client.policy.entities.PolicyDecision; +import org.onap.so.client.policy.entities.PolicyDecisionRequest; +import org.onap.so.client.policy.entities.PolicyServiceType; +import org.onap.so.client.policy.entities.Workstep; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class PolicyClientImpl implements PolicyClient { + + private static Logger logger = LoggerFactory.getLogger(PolicyClientImpl.class); + private PolicyRestProperties props; + public PolicyClientImpl() { + props = RestPropertiesLoader.getInstance().getNewImpl(PolicyRestProperties.class); + if (props == null) { + logger.error("No RestProperty.PolicyRestProperties implementation found on classpath"); + props = new PolicyRestPropertiesImpl(); + } + } + public PolicyDecision getDecision(String serviceType, String vnfType, String bbID, String workStep, + String errorCode) { + DecisionAttributes decisionAttributes = new DecisionAttributes(); + decisionAttributes.setServiceType(serviceType); + decisionAttributes.setvNFType(vnfType); + decisionAttributes.setBbID(bbID); + decisionAttributes.setWorkStep(workStep); + decisionAttributes.setErrorCode(errorCode); + + return this.getDecision(decisionAttributes); + } + + protected PolicyDecision getDecision(DecisionAttributes decisionAttributes) { + PolicyRestClient client = new PolicyRestClient(this.props, PolicyServiceType.GET_DECISION); + PolicyDecisionRequest decisionRequest = new PolicyDecisionRequest(); + decisionRequest.setDecisionAttributes(decisionAttributes); + decisionRequest.setEcompcomponentName(RestClient.ECOMP_COMPONENT_NAME); + + return client.post(decisionRequest, PolicyDecision.class); + } + + public DictionaryData getAllowedTreatments(String bbID, String workStep) + { + PolicyRestClient client = new PolicyRestClient(this.props, PolicyServiceType.GET_DICTIONARY_ITEMS); + DictionaryItemsRequest dictionaryItemsRequest = new DictionaryItemsRequest(); + dictionaryItemsRequest.setDictionaryType("Decision"); + dictionaryItemsRequest.setDictionary("RainyDayTreatments"); + final AllowedTreatments response = client.post(dictionaryItemsRequest, AllowedTreatments.class); + final DictionaryJson dictionaryJson = response.getDictionaryJson(); + final List<DictionaryData> dictionaryDataList = dictionaryJson.getDictionaryDatas(); + for(DictionaryData dictData : dictionaryDataList){ + Bbid bBid = dictData.getBbid(); + Workstep workstep = dictData.getWorkstep(); + String bBidString = bBid.getString(); + String workstepString = workstep.getString(); + if(bbID.equals(bBidString) && workStep.equals(workstepString)){ + return dictData; + } + } + logger.error("There is no AllowedTreatments with that specified parameter set"); + return null; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/PolicyRestClient.java b/common/src/main/java/org/onap/so/client/policy/PolicyRestClient.java new file mode 100644 index 0000000000..9427fa7eb9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/PolicyRestClient.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + + +import java.util.Map; +import java.util.Optional; + +import javax.ws.rs.core.UriBuilder; + +import org.onap.so.client.RestClient; +import org.onap.so.client.policy.entities.PolicyServiceType; +import org.onap.so.utils.TargetEntity; + +public class PolicyRestClient extends RestClient { + + private final PolicyRestProperties properties; + + public PolicyRestClient(PolicyRestProperties props, PolicyServiceType serviceType) { + super(props, Optional.of(UriBuilder.fromPath(serviceType.toString()).build())); + this.properties = props; + } + + @Override + public TargetEntity getTargetEntity(){ + return TargetEntity.POLICY; + } + + @Override + protected void initializeHeaderMap(Map<String, String> headerMap) { + headerMap.put("ClientAuth", properties.getClientAuth()); + headerMap.put("Authorization", properties.getAuth()); + headerMap.put("Environment", properties.getEnvironment()); + } + +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/client/policy/PolicyRestProperties.java b/common/src/main/java/org/onap/so/client/policy/PolicyRestProperties.java new file mode 100644 index 0000000000..1de6e8cd97 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/PolicyRestProperties.java @@ -0,0 +1,31 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy; + +import org.onap.so.client.RestProperties; + +public interface PolicyRestProperties extends RestProperties { + + public String getClientAuth(); + public String getAuth(); + public String getEnvironment(); + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/AllowedTreatments.java b/common/src/main/java/org/onap/so/client/policy/entities/AllowedTreatments.java new file mode 100644 index 0000000000..e82eca56b8 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/AllowedTreatments.java @@ -0,0 +1,105 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"dictionaryJson", +"dictionaryData", +"responseCode", +"responseMessage" +}) +public class AllowedTreatments{ + +@JsonProperty("dictionaryJson") +private DictionaryJson dictionaryJson; +@JsonProperty("dictionaryData") +private Object dictionaryData; +@JsonProperty("responseCode") +private Integer responseCode; +@JsonProperty("responseMessage") +private String responseMessage; + +@JsonProperty("dictionaryJson") +public DictionaryJson getDictionaryJson() { +return dictionaryJson; + } + +@JsonProperty("dictionaryJson") +public void setDictionaryJson(DictionaryJson dictionaryJson) { +this.dictionaryJson = dictionaryJson; + } + +public AllowedTreatments withDictionaryJson(DictionaryJson dictionaryJson) { +this.dictionaryJson = dictionaryJson; +return this; + } + +@JsonProperty("dictionaryData") +public Object getDictionaryData() { +return dictionaryData; + } + +@JsonProperty("dictionaryData") +public void setDictionaryData(Object dictionaryData) { +this.dictionaryData = dictionaryData; + } + +public AllowedTreatments withDictionaryData(Object dictionaryData) { +this.dictionaryData = dictionaryData; +return this; + } + +@JsonProperty("responseCode") +public Integer getResponseCode() { +return responseCode; + } + +@JsonProperty("responseCode") +public void setResponseCode(Integer responseCode) { +this.responseCode = responseCode; + } + +public AllowedTreatments withResponseCode(Integer responseCode) { +this.responseCode = responseCode; +return this; + } + +@JsonProperty("responseMessage") +public String getResponseMessage() { +return responseMessage; + } + +@JsonProperty("responseMessage") +public void setResponseMessage(String responseMessage) { +this.responseMessage = responseMessage; + } + +public AllowedTreatments withResponseMessage(String responseMessage) { +this.responseMessage = responseMessage; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/Bbid.java b/common/src/main/java/org/onap/so/client/policy/entities/Bbid.java new file mode 100644 index 0000000000..34faa7df09 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/Bbid.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"valueType", +"string", +"chars" +}) +public class Bbid { + +@JsonProperty("valueType") +private String valueType; +@JsonProperty("string") +private String string; +@JsonProperty("chars") +private String chars; + +@JsonProperty("valueType") +public String getValueType() { +return valueType; + } + +@JsonProperty("valueType") +public void setValueType(String valueType) { +this.valueType = valueType; + } + +public Bbid withValueType(String valueType) { +this.valueType = valueType; +return this; + } + +@JsonProperty("string") +public String getString() { +return string; + } + +@JsonProperty("string") +public void setString(String string) { +this.string = string; + } + +public Bbid withString(String string) { +this.string = string; +return this; + } + +@JsonProperty("chars") +public String getChars() { +return chars; + } + +@JsonProperty("chars") +public void setChars(String chars) { +this.chars = chars; + } + +public Bbid withChars(String chars) { +this.chars = chars; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/DecisionAttributes.java b/common/src/main/java/org/onap/so/client/policy/entities/DecisionAttributes.java new file mode 100644 index 0000000000..07db7d8568 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/DecisionAttributes.java @@ -0,0 +1,94 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + + + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ "ServiceType", "VNFType", "BB_ID", "WorkStep", "ErrorCode" }) +public class DecisionAttributes { + + @JsonProperty("ServiceType") + private String serviceType; + @JsonProperty("VNFType") + private String vNFType; + @JsonProperty("BB_ID") + private String bbID; + @JsonProperty("WorkStep") + private String workStep; + @JsonProperty("ErrorCode") + private String errorCode; + + @JsonProperty("ServiceType") + public String getServiceType() { + return serviceType; + } + + @JsonProperty("ServiceType") + public void setServiceType(String serviceType) { + this.serviceType = serviceType; + } + + @JsonProperty("WorkStep") + public String getWorkStep() { + return workStep; + } + + @JsonProperty("WorkStep") + public void setWorkStep(String workStep) { + this.workStep = workStep; + } + + @JsonProperty("ErrorCode") + public String getErrorCode() { + return errorCode; + } + + @JsonProperty("ErrorCode") + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + @JsonProperty("VNFType") + public String getvNFType() { + return vNFType; + } + + @JsonProperty("VNFType") + public void setvNFType(String vNFType) { + this.vNFType = vNFType; + } + + @JsonProperty("BB_ID") + public String getBbID() { + return bbID; + } + + @JsonProperty("BB_ID") + public void setBbID(String bbID) { + this.bbID = bbID; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/DictionaryData.java b/common/src/main/java/org/onap/so/client/policy/entities/DictionaryData.java new file mode 100644 index 0000000000..8207999a80 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/DictionaryData.java @@ -0,0 +1,105 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"id", +"bbid", +"workstep", +"treatments" +}) +public class DictionaryData { + +@JsonProperty("id") +private Id id; +@JsonProperty("bbid") +private Bbid bbid; +@JsonProperty("workstep") +private Workstep workstep; +@JsonProperty("treatments") +private Treatments treatments; + +@JsonProperty("id") +public Id getId() { +return id; + } + +@JsonProperty("id") +public void setId(Id id) { +this.id = id; + } + +public DictionaryData withId(Id id) { +this.id = id; +return this; + } + +@JsonProperty("bbid") +public Bbid getBbid() { +return bbid; + } + +@JsonProperty("bbid") +public void setBbid(Bbid bbid) { +this.bbid = bbid; + } + +public DictionaryData withBbid(Bbid bbid) { +this.bbid = bbid; +return this; + } + +@JsonProperty("workstep") +public Workstep getWorkstep() { +return workstep; + } + +@JsonProperty("workstep") +public void setWorkstep(Workstep workstep) { +this.workstep = workstep; + } + +public DictionaryData withWorkstep(Workstep workstep) { +this.workstep = workstep; +return this; + } + +@JsonProperty("treatments") +public Treatments getTreatments() { +return treatments; + } + +@JsonProperty("treatments") +public void setTreatments(Treatments treatments) { +this.treatments = treatments; + } + +public DictionaryData withTreatments(Treatments treatments) { +this.treatments = treatments; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/DictionaryItemsRequest.java b/common/src/main/java/org/onap/so/client/policy/entities/DictionaryItemsRequest.java new file mode 100644 index 0000000000..8b063e83c7 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/DictionaryItemsRequest.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ "dictionaryType", "dictionary" }) +public class DictionaryItemsRequest { + + @JsonProperty("dictionary") + private String dictionary; + @JsonProperty("dictionaryType") + private String dictionaryType; + + @JsonProperty("dictionary") + public String getDictionary() { + return dictionary; + } + + @JsonProperty("dictionary") + public void setDictionary(String dictionary) { + this.dictionary = dictionary; + } + + @JsonProperty("dictionaryType") + public String getDictionaryType() { + return dictionaryType; + } + + @JsonProperty("dictionaryType") + public void setDictionaryType(String dictionaryType) { + this.dictionaryType = dictionaryType; + } +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/DictionaryJson.java b/common/src/main/java/org/onap/so/client/policy/entities/DictionaryJson.java new file mode 100644 index 0000000000..097c9a5cb9 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/DictionaryJson.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"DictionaryDatas" +}) +public class DictionaryJson { + +@JsonProperty("DictionaryDatas") +private List<DictionaryData> dictionaryDatas = new ArrayList<DictionaryData>(); + +@JsonProperty("DictionaryDatas") +public List<DictionaryData> getDictionaryDatas() { +return dictionaryDatas; + } + +@JsonProperty("DictionaryDatas") +public void setDictionaryDatas(List<DictionaryData> dictionaryDatas) { +this.dictionaryDatas = dictionaryDatas; + } + +public DictionaryJson withDictionaryDatas(List<DictionaryData> dictionaryDatas) { +this.dictionaryDatas = dictionaryDatas; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/Id.java b/common/src/main/java/org/onap/so/client/policy/entities/Id.java new file mode 100644 index 0000000000..af164d6866 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/Id.java @@ -0,0 +1,69 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"integral", +"valueType" +}) +public class Id { + +@JsonProperty("integral") +private Boolean integral; +@JsonProperty("valueType") +private String valueType; + +@JsonProperty("integral") +public Boolean getIntegral() { +return integral; + } + +@JsonProperty("integral") +public void setIntegral(Boolean integral) { +this.integral = integral; + } + +public Id withIntegral(Boolean integral) { +this.integral = integral; +return this; + } + +@JsonProperty("valueType") +public String getValueType() { +return valueType; + } + +@JsonProperty("valueType") +public void setValueType(String valueType) { +this.valueType = valueType; + } + +public Id withValueType(String valueType) { +this.valueType = valueType; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/PolicyDecision.java b/common/src/main/java/org/onap/so/client/policy/entities/PolicyDecision.java new file mode 100644 index 0000000000..57c93927cb --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/PolicyDecision.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + + + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ "decision", "details" }) +public class PolicyDecision { + + @JsonProperty("decision") + private String decision; + @JsonProperty("details") + private String details; + + @JsonProperty("decision") + public String getDecision() { + return decision; + } + + @JsonProperty("decision") + public void setDecision(String decision) { + this.decision = decision; + } + + @JsonProperty("details") + public String getDetails() { + return details; + } + + @JsonProperty("details") + public void setDetails(String details) { + this.details = details; + } +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/PolicyDecisionRequest.java b/common/src/main/java/org/onap/so/client/policy/entities/PolicyDecisionRequest.java new file mode 100644 index 0000000000..b402e85e32 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/PolicyDecisionRequest.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ "decisionAttributes", "ecompcomponentName" }) +public class PolicyDecisionRequest { + + @JsonProperty("decisionAttributes") + private DecisionAttributes decisionAttributes; + @JsonProperty("ecompcomponentName") + private String ecompcomponentName; + + @JsonProperty("decisionAttributes") + public DecisionAttributes getDecisionAttributes() { + return decisionAttributes; + } + + @JsonProperty("decisionAttributes") + public void setDecisionAttributes(DecisionAttributes decisionAttributes) { + this.decisionAttributes = decisionAttributes; + } + + @JsonProperty("ecompcomponentName") + public String getEcompcomponentName() { + return ecompcomponentName; + } + + @JsonProperty("ecompcomponentName") + public void setEcompcomponentName(String ecompcomponentName) { + this.ecompcomponentName = ecompcomponentName; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/PolicyServiceType.java b/common/src/main/java/org/onap/so/client/policy/entities/PolicyServiceType.java new file mode 100644 index 0000000000..83dc6b7862 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/PolicyServiceType.java @@ -0,0 +1,48 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +public enum PolicyServiceType { + GET_CONFIG("getConfig"), + SEND_EVENT("sendEvent"), + PUSH_POLICY("pushPolicy"), + CREATE_POLICY("createPolicy"), + UPDATE_POLICY("updatePolicy"), + GET_DECISION("getDecision"), + GET_METRICS("getMetrics"), + DELETE_POLICY("deletePolicy"), + LIST_CONFIG("listConfig"), + CREATE_DICTIONARY_ITEM("createDictionaryItem"), + UPDATE_DICTIONARY_ITEM("updateDictionaryItem"), + GET_DICTIONARY_ITEMS("getDictionaryItems"); + + private final String name; + + PolicyServiceType(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/Treatments.java b/common/src/main/java/org/onap/so/client/policy/entities/Treatments.java new file mode 100644 index 0000000000..433d32756c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/Treatments.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"valueType", +"string", +"chars" +}) +public class Treatments { + +@JsonProperty("valueType") +private String valueType; +@JsonProperty("string") +private String string; +@JsonProperty("chars") +private String chars; + +@JsonProperty("valueType") +public String getValueType() { +return valueType; + } + +@JsonProperty("valueType") +public void setValueType(String valueType) { +this.valueType = valueType; + } + +public Treatments withValueType(String valueType) { +this.valueType = valueType; +return this; + } + +@JsonProperty("string") +public String getString() { +return string; + } + +@JsonProperty("string") +public void setString(String string) { +this.string = string; + } + +public Treatments withString(String string) { +this.string = string; +return this; + } + +@JsonProperty("chars") +public String getChars() { +return chars; + } + +@JsonProperty("chars") +public void setChars(String chars) { +this.chars = chars; + } + +public Treatments withChars(String chars) { +this.chars = chars; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/policy/entities/Workstep.java b/common/src/main/java/org/onap/so/client/policy/entities/Workstep.java new file mode 100644 index 0000000000..4fbd6e2f8a --- /dev/null +++ b/common/src/main/java/org/onap/so/client/policy/entities/Workstep.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.policy.entities; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"valueType", +"string", +"chars" +}) +public class Workstep { + +@JsonProperty("valueType") +private String valueType; +@JsonProperty("string") +private String string; +@JsonProperty("chars") +private String chars; + +@JsonProperty("valueType") +public String getValueType() { +return valueType; + } + +@JsonProperty("valueType") +public void setValueType(String valueType) { +this.valueType = valueType; + } + +public Workstep withValueType(String valueType) { +this.valueType = valueType; +return this; + } + +@JsonProperty("string") +public String getString() { +return string; + } + +@JsonProperty("string") +public void setString(String string) { +this.string = string; + } + +public Workstep withString(String string) { +this.string = string; +return this; + } + +@JsonProperty("chars") +public String getChars() { +return chars; + } + +@JsonProperty("chars") +public void setChars(String chars) { +this.chars = chars; + } + +public Workstep withChars(String chars) { +this.chars = chars; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/ruby/RubyClient.java b/common/src/main/java/org/onap/so/client/ruby/RubyClient.java new file mode 100644 index 0000000000..15b232475b --- /dev/null +++ b/common/src/main/java/org/onap/so/client/ruby/RubyClient.java @@ -0,0 +1,90 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.ruby; + +import java.io.IOException; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +import org.onap.so.client.dmaap.DmaapPublisher; +import org.onap.so.client.ruby.beans.Event; +import org.onap.so.client.ruby.beans.MsoRequest; +import org.onap.so.client.ruby.beans.Ruby; +import org.onap.so.client.ruby.dmaap.RubyCreateTicketRequestPublisher; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + + +public class RubyClient { + + private static final String REQUEST_CLIENT_NAME = "MSO"; + private static final String ACTION = "Create Ticket"; + + protected String buildRequest(String requestId, String sourceName, String reason, String workflowId, String notification) throws JsonProcessingException { + final MsoRequest request = new MsoRequest(); + request.withRequestClientName(REQUEST_CLIENT_NAME) + .withRequestId(requestId) + .withSourceName(sourceName) + .withWorkflowId(workflowId) + .withAction(ACTION); + + request.withRequestTime(this.getTime()); + + if(reason.length() <= 255){ + request.withReason(reason); + } else { + throw new IllegalArgumentException("reason exceeds 255 characters"); + } + if(notification.length() <= 1024){ + request.withNotification(notification); + } else { + throw new IllegalArgumentException("notification exceeds 1024 characters"); + } + final Event event = new Event(); + event.setMsoRequest(request); + final Ruby ruby = new Ruby(); + ruby.setEvent(event); + return this.getJson(ruby); + } + + protected String getJson(Ruby obj) throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(obj); + } + + protected DmaapPublisher getPublisher() throws IOException { + return new RubyCreateTicketRequestPublisher(); + } + + protected String getTime() { + final ZonedDateTime currentDateTime = ZonedDateTime.now(ZoneOffset.UTC); + final DateTimeFormatter format = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z"); + return currentDateTime.format(format); + } + + public void rubyCreateTicketCheckRequest(String requestId, String sourceName, String reason, String workflowId, String notification) throws Exception { + String request = this.buildRequest(requestId, sourceName, reason, workflowId, notification); + final DmaapPublisher publisher = this.getPublisher(); + publisher.send(request); + } +} diff --git a/common/src/main/java/org/onap/so/client/ruby/beans/Event.java b/common/src/main/java/org/onap/so/client/ruby/beans/Event.java new file mode 100644 index 0000000000..93745ff55e --- /dev/null +++ b/common/src/main/java/org/onap/so/client/ruby/beans/Event.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.ruby.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"msoRequest" +}) +public class Event { + +@JsonProperty("msoRequest") +private MsoRequest msoRequest; + +/** +* No args constructor for use in serialization +* +*/ +public Event() { + } + +/** +* +* @param msoRequest +*/ +public Event(MsoRequest msoRequest) { +super(); +this.msoRequest = msoRequest; + } + +@JsonProperty("msoRequest") +public MsoRequest getMsoRequest() { +return msoRequest; + } + +@JsonProperty("msoRequest") +public void setMsoRequest(MsoRequest msoRequest) { +this.msoRequest = msoRequest; + } + +public Event withMsoRequest(MsoRequest msoRequest) { +this.msoRequest = msoRequest; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java b/common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java new file mode 100644 index 0000000000..f2c004ea6e --- /dev/null +++ b/common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java @@ -0,0 +1,207 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.ruby.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"requestClientName", +"requestId", +"requestTime", +"sourceName", +"reason", +"action", +"workflowId", +"notification" +}) +public class MsoRequest { + +@JsonProperty("requestClientName") +private String requestClientName; +@JsonProperty("requestId") +private String requestId; +@JsonProperty("requestTime") +private String requestTime; +@JsonProperty("sourceName") +private String sourceName; +@JsonProperty("reason") +private String reason; +@JsonProperty("action") +private String action; +@JsonProperty("workflowId") +private String workflowId; +@JsonProperty("notification") +private String notification; + +/** +* No args constructor for use in serialization +* +*/ +public MsoRequest() { + } + +/** +* +* @param requestClientName +* @param requestTime +* @param reason +* @param requestId +* @param workflowId +* @param sourceName +* @param action +* @param notification +*/ +public MsoRequest(String requestClientName, String requestId, String requestTime, String sourceName, String reason, String action, String workflowId, String notification) { +super(); +this.requestClientName = requestClientName; +this.requestId = requestId; +this.requestTime = requestTime; +this.sourceName = sourceName; +this.reason = reason; +this.action = action; +this.workflowId = workflowId; +this.notification = notification; + } + +@JsonProperty("requestClientName") +public String getRequestClientName() { +return requestClientName; + } + +@JsonProperty("requestClientName") +public void setRequestClientName(String requestClientName) { +this.requestClientName = requestClientName; + } + +public MsoRequest withRequestClientName(String requestClientName) { +this.requestClientName = requestClientName; +return this; + } + +@JsonProperty("requestId") +public String getRequestId() { +return requestId; + } + +@JsonProperty("requestId") +public void setRequestId(String requestId) { +this.requestId = requestId; + } + +public MsoRequest withRequestId(String requestId) { +this.requestId = requestId; +return this; + } + +@JsonProperty("requestTime") +public String getRequestTime() { +return requestTime; + } + +@JsonProperty("requestTime") +public void setRequestTime(String requestTime) { +this.requestTime = requestTime; + } + +public MsoRequest withRequestTime(String requestTime) { +this.requestTime = requestTime; +return this; + } + +@JsonProperty("sourceName") +public String getSourceName() { +return sourceName; + } + +@JsonProperty("sourceName") +public void setSourceName(String sourceName) { +this.sourceName = sourceName; + } + +public MsoRequest withSourceName(String sourceName) { +this.sourceName = sourceName; +return this; + } + +@JsonProperty("reason") +public String getReason() { +return reason; + } + +@JsonProperty("reason") +public void setReason(String reason) { +this.reason = reason; + } + +public MsoRequest withReason(String reason) { +this.reason = reason; +return this; + } + +@JsonProperty("action") +public String getAction() { +return action; + } + +@JsonProperty("action") +public void setAction(String action) { +this.action = action; + } + +public MsoRequest withAction(String action) { +this.action = action; +return this; + } + +@JsonProperty("workflowId") +public String getWorkflowId() { +return workflowId; + } + +@JsonProperty("workflowId") +public void setWorkflowId(String workflowId) { +this.workflowId = workflowId; + } + +public MsoRequest withWorkflowId(String workflowId) { +this.workflowId = workflowId; +return this; + } + +@JsonProperty("notification") +public String getNotification() { +return notification; + } + +@JsonProperty("notification") +public void setNotification(String notification) { +this.notification = notification; + } + +public MsoRequest withNotification(String notification) { +this.notification = notification; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java b/common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java new file mode 100644 index 0000000000..725e6a3a94 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.ruby.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"event" +}) +public class Ruby { + +@JsonProperty("event") +private Event event; + +/** +* No args constructor for use in serialization +* +*/ +public Ruby() { + } + +/** +* +* @param event +*/ +public Ruby(Event event) { +super(); +this.event = event; + } + +@JsonProperty("event") +public Event getEvent() { +return event; + } + +@JsonProperty("event") +public void setEvent(Event event) { +this.event = event; + } + +public Ruby withEvent(Event event) { +this.event = event; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java b/common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java new file mode 100644 index 0000000000..1d4e014300 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.ruby.dmaap; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Optional; + +import org.onap.so.client.dmaap.DmaapPublisher; + +public class RubyCreateTicketRequestPublisher extends DmaapPublisher{ + public RubyCreateTicketRequestPublisher() throws FileNotFoundException, IOException { + super(); + } + + @Override + public String getUserName() { + return msoProperties.get("ruby.create-ticket-request.dmaap.username"); + } + + @Override + public String getPassword() { + return msoProperties.get("ruby.create-ticket-request.dmaap.password"); + } + + @Override + public String getTopic() { + return msoProperties.get("ruby.create-ticket-request.publisher.topic"); + } + + @Override + public Optional<String> getHost() { + return Optional.ofNullable(msoProperties.get("ruby.create-ticket-request.publisher.host")); + } + +} + + diff --git a/common/src/main/java/org/onap/so/client/sdno/SDNOHealthCheckClient.java b/common/src/main/java/org/onap/so/client/sdno/SDNOHealthCheckClient.java new file mode 100644 index 0000000000..93a35f34b0 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/SDNOHealthCheckClient.java @@ -0,0 +1,158 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import org.onap.so.client.dmaap.DmaapConsumer; +import org.onap.so.client.dmaap.DmaapPublisher; +import org.onap.so.client.sdno.beans.AAIParamList; +import org.onap.so.client.sdno.beans.Body; +import org.onap.so.client.sdno.beans.Input; +import org.onap.so.client.sdno.beans.RequestHdCustom; +import org.onap.so.client.sdno.beans.SDNO; +import org.onap.so.client.sdno.dmaap.SDNOHealthCheckDmaapConsumer; +import org.onap.so.client.sdno.dmaap.SDNOHealthCheckDmaapPublisher; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class SDNOHealthCheckClient { + + private static final String NODE_TYPE = "VROUTER"; + private static final String API_OPERATION_TYPE = "health-diagnostic-custom"; + private static final String MIRRORING_CHECK = "mirroring_check"; + private static final String CLIENT_NAME = "MSO"; + private static final String PRE_CHECK_CODE = "VROUTER000003"; + private static final String POST_CHECK_CODE = "VROUTER000004"; + private static final String LPORT_MIRRORING_CHECK = "lport_mirroring_check"; + private static final String CONFIGURATION_ID = "configuration-id"; + + + public boolean lPortMirrorHealthPreCheck(String userId, String requestId, Optional<String>clliCode, String configurationId, String interfaceId) throws Exception{ + String request = buildLPortMirrorCheckPreRequest(userId, requestId, clliCode, configurationId, interfaceId); + return this.execute(requestId, request); + } + + public boolean lPortMirrorHealthPostCheck(String userId, String requestId, Optional<String>clliCode, String configurationId, String interfaceId) throws Exception{ + String request = buildLPortMirrorCheckPostRequest(userId, requestId, clliCode, configurationId, interfaceId); + return this.execute(requestId, request); + } + + public boolean portMirrorHealthPreCheck(String userId, String requestId, Optional<String> clliCode, String configurationId) throws Exception { + final String request = this.buildPortMirrorPreCheckRequest(userId, requestId, clliCode, configurationId); + return this.execute(requestId, request); + } + + public boolean portMirrorHealthPostCheck(String userId, String requestId, Optional<String> clliCode, String configurationId) throws Exception { + final String request = this.buildPortMirrorPostCheckRequest(userId, requestId, clliCode, configurationId); + return this.execute(requestId, request); + } + + protected String buildLPortMirrorCheckPreRequest(String userId, String requestId, Optional<String> clliCode, String configurationId, String interfaceId) throws JsonProcessingException{ + return this.buildLPortMirrorCheckRequest(userId, requestId, clliCode, configurationId, interfaceId, PRE_CHECK_CODE); + } + + protected String buildLPortMirrorCheckPostRequest(String userId, String requestId, Optional<String> clliCode, String configurationId, String interfaceId) throws JsonProcessingException{ + return this.buildLPortMirrorCheckRequest(userId, requestId, clliCode, configurationId, interfaceId, POST_CHECK_CODE); + } + + protected String buildPortMirrorPreCheckRequest(String userId, String requestId, Optional<String> clliCode, String configurationId) throws JsonProcessingException { + return this.buildPortMirrorCheckRequest(userId, requestId, clliCode, configurationId, PRE_CHECK_CODE); + } + + protected String buildPortMirrorPostCheckRequest(String userId, String requestId, Optional<String> clliCode, String configurationId) throws JsonProcessingException { + return this.buildPortMirrorCheckRequest(userId, requestId, clliCode, configurationId, POST_CHECK_CODE); + } + + protected String buildPortMirrorCheckRequest(String userId, String requestId, Optional<String> clliCode, String configurationId, String diagnosticCode) throws JsonProcessingException { + final AAIParamList list = new AAIParamList(); + list.setKey(CONFIGURATION_ID); + list.setValue(configurationId); + + return this.buildRequest(userId, requestId, clliCode, diagnosticCode, MIRRORING_CHECK, Collections.singletonList(list)); + } + + protected String buildLPortMirrorCheckRequest(String userId, String requestId, Optional<String> clliCode, String configurationId, String interfaceId, String diagnosticCode) throws JsonProcessingException { + + final AAIParamList configurationIdParam = new AAIParamList(); + configurationIdParam.setKey(CONFIGURATION_ID); + configurationIdParam.setValue(configurationId); + final AAIParamList interfaceIdParam = new AAIParamList(); + interfaceIdParam.setKey("interface-id"); + interfaceIdParam.setValue(interfaceId); + final List<AAIParamList> list = new ArrayList<>(); + list.add(configurationIdParam); + list.add(interfaceIdParam); + return this.buildRequest(userId, requestId, clliCode, diagnosticCode, LPORT_MIRRORING_CHECK, list); + } + + + protected String buildRequest(String userId, String requestId, Optional<String> clliCode, String diagnosticCode, String operationType, List<AAIParamList> paramList) throws JsonProcessingException { + + final RequestHdCustom hdCustom = new RequestHdCustom(); + hdCustom.withRequestUserId(userId) + .withRequestId(requestId) + .withRequestClientName(CLIENT_NAME) + .withHealthDiagnosticCode(diagnosticCode) + .withOperationType(operationType) + .withAaiParamList(paramList); + + final Input input = new Input(); + input.setRequestHdCustom(hdCustom); + final Body body = new Body(); + body.setInput(input); + final SDNO request = new SDNO(); + request.withBody(body).withOperation(API_OPERATION_TYPE).withNodeType(NODE_TYPE); + if (clliCode.isPresent()) { + request.setNodeLoc(clliCode.get()); + } + return this.getJson(request); + + } + protected String getJson(SDNO obj) throws JsonProcessingException { + final ObjectMapper mapper = new ObjectMapper(); + return mapper.writeValueAsString(obj); + } + + protected DmaapPublisher getPublisher() throws FileNotFoundException, IOException { + return new SDNOHealthCheckDmaapPublisher(); + } + + protected DmaapConsumer getConsumer(String requestId) throws FileNotFoundException, IOException { + return new SDNOHealthCheckDmaapConsumer(requestId); + } + + protected boolean execute(String requestId, String request) throws Exception { + final DmaapPublisher publisher = this.getPublisher(); + publisher.send(request); + + final DmaapConsumer consumer = this.getConsumer(requestId); + + return consumer.consume(); + } + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/SDNOValidator.java b/common/src/main/java/org/onap/so/client/sdno/SDNOValidator.java new file mode 100644 index 0000000000..f3cab1e3e8 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/SDNOValidator.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno; + +import java.io.IOException; +import java.util.UUID; + +import org.onap.aai.domain.yang.GenericVnf; + +public interface SDNOValidator { + + /** + * Issues a health diagnostic request for a given vnf to SDN-O + * + * @param vnfId + * @param uuid + * @param requestingUserId + * @return diagnostic result + * @throws IOException + * @throws Exception + */ + public boolean healthDiagnostic(String vnfId, UUID uuid, String requestingUserId) throws IOException, Exception; + + + /** + * Issues a health diagnostic request for a given GenericVnf to SDN-O + * + * @param genericVnf + * @param uuid + * @param requestingUserId + * @return diagnostic result + * @throws IOException + * @throws Exception + */ + public boolean healthDiagnostic(GenericVnf genericVnf, UUID uuid, String requestingUserId) throws IOException, Exception; + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/SDNOValidatorImpl.java b/common/src/main/java/org/onap/so/client/sdno/SDNOValidatorImpl.java new file mode 100644 index 0000000000..be79c8b927 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/SDNOValidatorImpl.java @@ -0,0 +1,125 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Optional; +import java.util.UUID; + +import javax.ws.rs.NotFoundException; + +import org.onap.aai.domain.yang.GenericVnf; +import org.onap.so.client.aai.AAIObjectType; +import org.onap.so.client.aai.AAIResourcesClient; +import org.onap.so.client.aai.AAIVersion; +import org.onap.so.client.aai.entities.uri.AAIResourceUri; +import org.onap.so.client.aai.entities.uri.AAIUriFactory; +import org.onap.so.client.dmaap.DmaapConsumer; +import org.onap.so.client.dmaap.DmaapPublisher; +import org.onap.so.client.sdno.beans.Body; +import org.onap.so.client.sdno.beans.Input; +import org.onap.so.client.sdno.beans.RequestHealthDiagnostic; +import org.onap.so.client.sdno.beans.SDNO; +import org.onap.so.client.sdno.dmaap.SDNOHealthCheckDmaapConsumer; +import org.onap.so.client.sdno.dmaap.SDNOHealthCheckDmaapPublisher; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class SDNOValidatorImpl implements SDNOValidator { + + private final static String clientName = "MSO"; + + @Override + public boolean healthDiagnostic(String vnfId, UUID uuid, String requestingUserId) throws IOException, Exception { + + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId); + AAIResourcesClient client = new AAIResourcesClient(AAIVersion.V10); + GenericVnf vnf = client.get(GenericVnf.class, uri).orElseThrow(() -> new NotFoundException(vnfId + " not found in A&AI")); + + SDNO requestDiagnostic = buildRequestDiagnostic(vnf, uuid, requestingUserId); + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(requestDiagnostic); + this.submitRequest(json); + boolean status = this.pollForResponse(uuid.toString()); + return status; + } + + @Override + public boolean healthDiagnostic(GenericVnf genericVnf, UUID uuid, String requestingUserId) throws IOException, Exception { + + SDNO requestDiagnostic = buildRequestDiagnostic(genericVnf, uuid, requestingUserId); + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(requestDiagnostic); + this.submitRequest(json); + boolean status = this.pollForResponse(uuid.toString()); + return status; + } + + protected SDNO buildRequestDiagnostic(GenericVnf vnf, UUID uuid, String requestingUserId) { + + Optional<String> vnfType; + if (vnf.getVnfType() == null) { + vnfType = Optional.empty(); + } else { + vnfType = Optional.of(vnf.getVnfType()); + } + Input input = new Input(); + SDNO parentRequest = new SDNO(); + Body body = new Body(); + parentRequest.setBody(body); + parentRequest.setNodeType(vnfType.orElse("NONE").toUpperCase()); + parentRequest.setOperation("health-diagnostic"); + + body.setInput(input); + + RequestHealthDiagnostic request = new RequestHealthDiagnostic(); + + request.setRequestClientName(clientName); + request.setRequestNodeName(vnf.getVnfName()); + request.setRequestNodeUuid(vnf.getVnfId()); + request.setRequestNodeIp(vnf.getIpv4OamAddress()); //generic-vnf oam ip + request.setRequestUserId(requestingUserId); //mech id? + request.setRequestId(uuid.toString()); //something to identify this request by for polling + + input.setRequestHealthDiagnostic(request); + + return parentRequest; + } + protected void submitRequest(String json) throws FileNotFoundException, IOException, InterruptedException { + + DmaapPublisher publisher = new SDNOHealthCheckDmaapPublisher(); + publisher.send(json); + } + protected boolean pollForResponse(String uuid) throws Exception { + DmaapConsumer consumer = this.getConsumer(uuid); + return consumer.consume(); + } + + + + protected DmaapConsumer getConsumer(String uuid) throws FileNotFoundException, IOException { + return new SDNOHealthCheckDmaapConsumer(uuid); + } + + + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/beans/AAIParamList.java b/common/src/main/java/org/onap/so/client/sdno/beans/AAIParamList.java new file mode 100644 index 0000000000..0de9b90d66 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/beans/AAIParamList.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.beans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"key", +"value" +}) +public class AAIParamList { + +@JsonProperty("key") +private String key; +@JsonProperty("value") +private String value; + +/** +* No args constructor for use in serialization +* +*/ +public AAIParamList() { + } + +/** +* +* @param value +* @param key +*/ +public AAIParamList(String key, String value) { +super(); +this.key = key; +this.value = value; + } + +@JsonProperty("key") +public String getKey() { +return key; + } + +@JsonProperty("key") +public void setKey(String key) { +this.key = key; + } + +public AAIParamList withKey(String key) { +this.key = key; +return this; + } + +@JsonProperty("value") +public String getValue() { +return value; + } + +@JsonProperty("value") +public void setValue(String value) { +this.value = value; + } + +public AAIParamList withValue(String value) { +this.value = value; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/beans/Body.java b/common/src/main/java/org/onap/so/client/sdno/beans/Body.java new file mode 100644 index 0000000000..dfca9ec124 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/beans/Body.java @@ -0,0 +1,80 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.beans; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "input" +}) +public class Body implements Serializable +{ + + @JsonProperty("input") + private Input input; + @JsonIgnore + private Map<String, Object> additionalProperties = new HashMap<String, Object>(); + private final static long serialVersionUID = 9101706044452851559L; + + @JsonProperty("input") + public Input getInput() { + return input; + } + + @JsonProperty("input") + public void setInput(Input input) { + this.input = input; + } + + public Body withInput(Input input) { + this.input = input; + return this; + } + + @JsonAnyGetter + public Map<String, Object> getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + public void setAdditionalProperties(Map<String, Object> map) { + this.additionalProperties = map; + } + + public Body withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/beans/Input.java b/common/src/main/java/org/onap/so/client/sdno/beans/Input.java new file mode 100644 index 0000000000..e565f71445 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/beans/Input.java @@ -0,0 +1,95 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.beans; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "request-healthdiagnostic", + "request-hd-custom" +}) +public class Input implements Serializable +{ + + @JsonProperty("request-healthdiagnostic") + private RequestHealthDiagnostic RequestHealthDiagnostic; + @JsonProperty("request-hd-custom") + private RequestHdCustom requestHdCustom; + + @JsonIgnore + private Map<String, Object> additionalProperties = new HashMap<String, Object>(); + private final static long serialVersionUID = 7155546785389227528L; + + @JsonProperty("request-healthdiagnostic") + public RequestHealthDiagnostic getRequestHealthDiagnostic() { + return RequestHealthDiagnostic; + } + + @JsonProperty("request-healthdiagnostic") + public void setRequestHealthDiagnostic(RequestHealthDiagnostic RequestHealthDiagnostic) { + this.RequestHealthDiagnostic = RequestHealthDiagnostic; + } + + @JsonProperty("request-hd-custom") + public RequestHdCustom getRequestHdCustom() { + return requestHdCustom; + } + + @JsonProperty("request-hd-custom") + public void setRequestHdCustom(RequestHdCustom requestHdCustom) { + this.requestHdCustom = requestHdCustom; + } + + public Input withRequestHealthDiagnostic(RequestHealthDiagnostic RequestHealthDiagnostic) { + this.RequestHealthDiagnostic = RequestHealthDiagnostic; + return this; + } + + @JsonAnyGetter + public Map<String, Object> getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public void setAdditionalProperties(Map<String, Object> map) { + this.additionalProperties = map; + } + + public Input withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/beans/RequestHdCustom.java b/common/src/main/java/org/onap/so/client/sdno/beans/RequestHdCustom.java new file mode 100644 index 0000000000..b3a6a4815e --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/beans/RequestHdCustom.java @@ -0,0 +1,191 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.beans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"request-client-name", +"request-user-id", +"request-id", +"health-diagnostic-code", +"operation-type", +"send-detailed-cmd-response", +"aai-param-list" +}) +public class RequestHdCustom implements Serializable { + +/** + * + */ + private static final long serialVersionUID = -206110458275127710L; +@JsonProperty("request-client-name") +private String requestClientName; +@JsonProperty("request-user-id") +private String requestUserId; +@JsonProperty("request-id") +private String requestId; +@JsonProperty("health-diagnostic-code") +private String healthDiagnosticCode; +@JsonProperty("operation-type") +private String operationType; +@JsonProperty("send-detailed-cmd-response") +private String sendDetailedCmdResponse = "false"; +@JsonProperty("aai-param-list") +private List<AAIParamList> aaiParamList = new ArrayList<AAIParamList>(); + +/** +* No args constructor for use in serialization +* +*/ +public RequestHdCustom() { + } + +/** +* +* @param requestClientName +* @param operationType +* @param requestId +* @param healthDiagnosticCode +* @param aaiParamList +* @param requestUserId +*/ +public RequestHdCustom(String requestClientName, String requestUserId, String requestId, String healthDiagnosticCode, String operationType, List<AAIParamList> aaiParamList) { +super(); +this.requestClientName = requestClientName; +this.requestUserId = requestUserId; +this.requestId = requestId; +this.healthDiagnosticCode = healthDiagnosticCode; +this.operationType = operationType; +this.aaiParamList = aaiParamList; + } + +@JsonProperty("request-client-name") +public String getRequestClientName() { +return requestClientName; + } + +@JsonProperty("request-client-name") +public void setRequestClientName(String requestClientName) { +this.requestClientName = requestClientName; + } + +public RequestHdCustom withRequestClientName(String requestClientName) { +this.requestClientName = requestClientName; +return this; + } + +@JsonProperty("request-user-id") +public String getRequestUserId() { +return requestUserId; + } + +@JsonProperty("request-user-id") +public void setRequestUserId(String requestUserId) { +this.requestUserId = requestUserId; + } + +public RequestHdCustom withRequestUserId(String requestUserId) { +this.requestUserId = requestUserId; +return this; + } + +@JsonProperty("request-id") +public String getRequestId() { +return requestId; + } + +@JsonProperty("request-id") +public void setRequestId(String requestId) { +this.requestId = requestId; + } + +public RequestHdCustom withRequestId(String requestId) { +this.requestId = requestId; +return this; + } + +@JsonProperty("health-diagnostic-code") +public String getHealthDiagnosticCode() { +return healthDiagnosticCode; + } + +@JsonProperty("health-diagnostic-code") +public void setHealthDiagnosticCode(String healthDiagnosticCode) { +this.healthDiagnosticCode = healthDiagnosticCode; + } + +public RequestHdCustom withHealthDiagnosticCode(String healthDiagnosticCode) { +this.healthDiagnosticCode = healthDiagnosticCode; +return this; + } + +@JsonProperty("operation-type") +public String getOperationType() { +return operationType; + } + +@JsonProperty("operation-type") +public void setOperationType(String operationType) { +this.operationType = operationType; + } + +public RequestHdCustom withOperationType(String operationType) { +this.operationType = operationType; +return this; + } + +public void setSendDetailedCmdResponse(String sendDetailedCmdResponse) { + this.sendDetailedCmdResponse = sendDetailedCmdResponse; +} + +public String getSendDetailedCmdResponse() { + return sendDetailedCmdResponse; +} + +public RequestHdCustom withSendDetailedCmdResponse(String sendDetailedCmdResponse) { + this.sendDetailedCmdResponse = sendDetailedCmdResponse; + return this; +} + +@JsonProperty("aai-param-list") +public List<AAIParamList> getAaiParamList() { +return aaiParamList; + } + +@JsonProperty("aai-param-list") +public void setAaiParamList(List<AAIParamList> aaiParamList) { +this.aaiParamList = aaiParamList; + } + +public RequestHdCustom withAaiParamList(List<AAIParamList> aaiParamList) { +this.aaiParamList = aaiParamList; +return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/beans/RequestHealthDiagnostic.java b/common/src/main/java/org/onap/so/client/sdno/beans/RequestHealthDiagnostic.java new file mode 100644 index 0000000000..69745d6bfb --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/beans/RequestHealthDiagnostic.java @@ -0,0 +1,207 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.beans; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "request-client-name", + "request-node-name", + "request-node-uuid", + "request-node-ip", + "request-id", + "request-user-id", + "request-node-type", + "health-diagnostic-code" +}) +public class RequestHealthDiagnostic implements Serializable +{ + + @JsonProperty("request-client-name") + private String requestClientName; + @JsonProperty("request-node-name") + private String requestNodeName; + @JsonProperty("request-node-uuid") + private String requestNodeUuid; + @JsonProperty("request-node-ip") + private String requestNodeIp; + @JsonProperty("request-id") + private String requestId; + @JsonProperty("request-user-id") + private String requestUserId; + @JsonProperty("request-node-type") + private String requestNodeType; + @JsonProperty("health-diagnostic-code") + private String healthDiagnosticCode; + @JsonIgnore + private Map<String, Object> additionalProperties = new HashMap<String, Object>(); + private final static long serialVersionUID = 1166788526178388021L; + + @JsonProperty("request-client-name") + public String getRequestClientName() { + return requestClientName; + } + + @JsonProperty("request-client-name") + public void setRequestClientName(String requestClientName) { + this.requestClientName = requestClientName; + } + + public RequestHealthDiagnostic withRequestClientName(String requestClientName) { + this.requestClientName = requestClientName; + return this; + } + + @JsonProperty("request-node-name") + public String getRequestNodeName() { + return requestNodeName; + } + + @JsonProperty("request-node-name") + public void setRequestNodeName(String requestNodeName) { + this.requestNodeName = requestNodeName; + } + + public RequestHealthDiagnostic withRequestNodeName(String requestNodeName) { + this.requestNodeName = requestNodeName; + return this; + } + + @JsonProperty("request-node-uuid") + public String getRequestNodeUuid() { + return requestNodeUuid; + } + + @JsonProperty("request-node-uuid") + public void setRequestNodeUuid(String requestNodeUuid) { + this.requestNodeUuid = requestNodeUuid; + } + + public RequestHealthDiagnostic withRequestNodeUuid(String requestNodeUuid) { + this.requestNodeUuid = requestNodeUuid; + return this; + } + + @JsonProperty("request-node-ip") + public String getRequestNodeIp() { + return requestNodeIp; + } + + @JsonProperty("request-node-ip") + public void setRequestNodeIp(String requestNodeIp) { + this.requestNodeIp = requestNodeIp; + } + + public RequestHealthDiagnostic withRequestNodeIp(String requestNodeIp) { + this.requestNodeIp = requestNodeIp; + return this; + } + + @JsonProperty("request-id") + public String getRequestId() { + return requestId; + } + + @JsonProperty("request-id") + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public RequestHealthDiagnostic withRequestId(String requestId) { + this.requestId = requestId; + return this; + } + + @JsonProperty("request-user-id") + public String getRequestUserId() { + return requestUserId; + } + + @JsonProperty("request-user-id") + public void setRequestUserId(String requestUserId) { + this.requestUserId = requestUserId; + } + + public RequestHealthDiagnostic withRequestUserId(String requestUserId) { + this.requestUserId = requestUserId; + return this; + } + + @JsonProperty("request-node-type") + public String getRequestNodeType() { + return requestNodeType; + } + + @JsonProperty("request-node-type") + public void setRequestNodeType(String requestNodeType) { + this.requestNodeType = requestNodeType; + } + + public RequestHealthDiagnostic withRequestNodeType(String requestNodeType) { + this.requestNodeType = requestNodeType; + return this; + } + + @JsonProperty("health-diagnostic-code") + public String getHealthDiagnosticCode() { + return healthDiagnosticCode; + } + + @JsonProperty("health-diagnostic-code") + public void setHealthDiagnosticCode(String healthDiagnosticCode) { + this.healthDiagnosticCode = healthDiagnosticCode; + } + + public RequestHealthDiagnostic withHealthDiagnosticCode(String healthDiagnosticCode) { + this.healthDiagnosticCode = healthDiagnosticCode; + return this; + } + + @JsonAnyGetter + public Map<String, Object> getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public void setAdditionalProperties(Map<String, Object> map) { + this.additionalProperties = map; + } + + public RequestHealthDiagnostic withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/beans/ResultInfo.java b/common/src/main/java/org/onap/so/client/sdno/beans/ResultInfo.java new file mode 100644 index 0000000000..7cf9c7cb06 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/beans/ResultInfo.java @@ -0,0 +1,119 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.beans; + +import java.util.HashMap; +import java.util.Map; + +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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ +"client-name", +"code", +"processing-host", +"request-id", +"status" +}) +public class ResultInfo { + +@JsonProperty("client-name") +private String clientName; +@JsonProperty("code") +private String code; +@JsonProperty("processing-host") +private String processingHost; +@JsonProperty("request-id") +private String requestId; +@JsonProperty("status") +private String status; +@JsonIgnore +private Map<String, Object> additionalProperties = new HashMap<String, Object>(); + +@JsonProperty("client-name") +public String getClientName() { +return clientName; +} + +@JsonProperty("client-name") +public void setClientName(String clientName) { +this.clientName = clientName; +} + +@JsonProperty("code") +public String getCode() { +return code; +} + +@JsonProperty("code") +public void setCode(String code) { +this.code = code; +} + +@JsonProperty("processing-host") +public String getProcessingHost() { +return processingHost; +} + +@JsonProperty("processing-host") +public void setProcessingHost(String processingHost) { +this.processingHost = processingHost; +} + +@JsonProperty("request-id") +public String getRequestId() { +return requestId; +} + +@JsonProperty("request-id") +public void setRequestId(String requestId) { +this.requestId = requestId; +} + +@JsonProperty("status") +public String getStatus() { +return status; +} + +@JsonProperty("status") +public void setStatus(String status) { +this.status = status; +} + +@JsonAnyGetter +public Map<String, Object> getAdditionalProperties() { +return this.additionalProperties; +} + +@JsonAnySetter +public void setAdditionalProperty(String name, Object value) { +this.additionalProperties.put(name, value); +} + +public void setAdditionalProperties(Map<String, Object> map) { +this.additionalProperties = map; +} +} diff --git a/common/src/main/java/org/onap/so/client/sdno/beans/SDNO.java b/common/src/main/java/org/onap/so/client/sdno/beans/SDNO.java new file mode 100644 index 0000000000..7c728a7bab --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/beans/SDNO.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.beans; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "operation", + "nodeLoc", + "nodeType", + "body" +}) +public class SDNO implements Serializable +{ + + @JsonProperty("operation") + private String operation; + @JsonProperty("nodeLoc") + private String nodeLoc; + @JsonProperty("nodeType") + private String nodeType; + @JsonProperty("body") + private Body body; + @JsonIgnore + private Map<String, Object> additionalProperties = new HashMap<String, Object>(); + private final static long serialVersionUID = -5303297382564282650L; + + @JsonProperty("operation") + public String getOperation() { + return operation; + } + + @JsonProperty("operation") + public void setOperation(String operation) { + this.operation = operation; + } + + @JsonProperty("nodeLoc") + public String getNodeLoc() { + return nodeLoc; + } + + @JsonProperty("nodeLoc") + public void setNodeLoc(String nodeLoc) { + this.nodeLoc = nodeLoc; + } + + public SDNO withNodeLoc(String nodeLoc) { + this.nodeLoc = nodeLoc; + return this; + } + + public SDNO withOperation(String operation) { + this.operation = operation; + return this; + } + + @JsonProperty("nodeType") + public String getNodeType() { + return nodeType; + } + + @JsonProperty("nodeType") + public void setNodeType(String nodeType) { + this.nodeType = nodeType; + } + + public SDNO withNodeType(String nodeType) { + this.nodeType = nodeType; + return this; + } + + @JsonProperty("body") + public Body getBody() { + return body; + } + + @JsonProperty("body") + public void setBody(Body body) { + this.body = body; + } + + public SDNO withBody(Body body) { + this.body = body; + return this; + } + + @JsonAnyGetter + public Map<String, Object> getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public void setAdditionalProperties(Map<String, Object> map) { + this.additionalProperties = map; + } + + public SDNO SDNO (String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + +} diff --git a/common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapConsumer.java b/common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapConsumer.java new file mode 100644 index 0000000000..6f415af8b0 --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapConsumer.java @@ -0,0 +1,159 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.dmaap; + +import java.io.IOException; +import java.util.Optional; +import org.onap.so.client.dmaap.DmaapConsumer; +import org.onap.so.client.exceptions.SDNOException; +import org.onap.so.jsonpath.JsonPathUtil; + +public class SDNOHealthCheckDmaapConsumer extends DmaapConsumer { + + private final String uuid; + private boolean continuePolling = true; + private final static String healthDiagnosticPath = "body.output.*"; + + public SDNOHealthCheckDmaapConsumer() throws IOException { + this("none"); + } + + public SDNOHealthCheckDmaapConsumer(String uuid) throws IOException { + super(); + this.uuid = uuid; + } + + @Override + public String getUserName() { + return msoProperties.get("sdno.health-check.dmaap.username"); + } + + @Override + public String getPassword() { + return msoProperties.get("sdno.health-check.dmaap.password"); + } + + @Override + public String getTopic() { + return msoProperties.get("sdno.health-check.dmaap.subscriber.topic"); + } + + @Override + public Optional<String> getHost() { + return Optional.ofNullable(msoProperties.get("sdno.health-check.dmaap.subscriber.host")); + } + + @Override + public boolean continuePolling() { + return continuePolling; + } + + @Override + public void stopProcessingMessages() { + continuePolling = false; + } + @Override + public void processMessage(String message) throws Exception { + if (isHealthDiagnostic(message, this.getRequestId())) { + if (!healthDiagnosticSuccessful(message)) { + Optional<String> statusMessage = this.getStatusMessage(message); + if (statusMessage.isPresent()) { + throw new SDNOException("failed with message " + statusMessage.get()); + } else { + throw new SDNOException("failed with no status message"); + } + } else { + logger.info("successful health diagnostic found for request: {}" ,getRequestId()); + stopProcessingMessages(); + } + } + } + + @Override + public boolean isAccepted(String message) { + if (isResultInfo(message)) { + Optional<String> code = isAccepted(message, this.getRequestId()); + if (code.isPresent()) { + if ("202".equals(code.get())) { + return true; + } else { + //TODO check other statuses 400 and 500 + } + } else { + //TODO throw error + } + } + + return false; + } + + @Override + public boolean isFailure(String message) { + if (isResultInfo(message)) { + Optional<String> code = isFailure(message, this.getRequestId()); + if (code.isPresent()) { + if ("500".equals(code.get())) { + return true; + } else { + //TODO check other statuses 400 and 500 + } + } else { + //TODO throw error + } + } + + return false; + } + + @Override + public String getRequestId() { + return uuid; + } + + protected Optional<String> isAccepted(String json, String uuid) { + return JsonPathUtil.getInstance().locateResult(json, String.format("$.result-info[?(@.status=='ACCEPTED' && @.request-id=='%s')].code", uuid)); + } + + protected Optional<String> isFailure(String json, String uuid) { + return JsonPathUtil.getInstance().locateResult(json, String.format("$.result-info[?(@.status=='FAILURE' && @.request-id=='%s')].code", uuid)); + } + + protected boolean isResultInfo(String json) { + return JsonPathUtil.getInstance().pathExists(json, "$[?(@.result-info)]"); + } + + protected boolean isHealthDiagnostic(String json, String uuid) { + return JsonPathUtil.getInstance().pathExists(json, String.format("$[?(@.result-info.request-id=='%s')].%s", uuid, healthDiagnosticPath)); + } + + protected boolean healthDiagnosticSuccessful(String json) { + return JsonPathUtil.getInstance().pathExists(json, "$." + healthDiagnosticPath + "[?(@.response-status=='Success')]"); + } + + protected Optional<String> getStatusMessage(String json) { + return JsonPathUtil.getInstance().locateResult(json, "$." + healthDiagnosticPath + ".error-message"); + } + + @Override + public int getMaximumElapsedTime() { + return 300000; + } +} diff --git a/common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapPublisher.java b/common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapPublisher.java new file mode 100644 index 0000000000..2556e67e3c --- /dev/null +++ b/common/src/main/java/org/onap/so/client/sdno/dmaap/SDNOHealthCheckDmaapPublisher.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.client.sdno.dmaap; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Optional; + +import org.onap.so.client.dmaap.DmaapPublisher; + +public class SDNOHealthCheckDmaapPublisher extends DmaapPublisher { + + public SDNOHealthCheckDmaapPublisher() throws FileNotFoundException, IOException { + super(); + } + + @Override + public String getUserName() { + return msoProperties.get("sdno.health-check.dmaap.username"); + } + + @Override + public String getPassword() { + return msoProperties.get("sdno.health-check.dmaap.password"); + } + + @Override + public String getTopic() { + return msoProperties.get("sdno.health-check.dmaap.publisher.topic"); + } + + @Override + public Optional<String> getHost() { + return Optional.ofNullable(msoProperties.get("sdno.health-check.dmaap.publisher.host")); + } + +} diff --git a/common/src/main/java/org/onap/so/entity/MsoRequest.java b/common/src/main/java/org/onap/so/entity/MsoRequest.java new file mode 100644 index 0000000000..c61684bec7 --- /dev/null +++ b/common/src/main/java/org/onap/so/entity/MsoRequest.java @@ -0,0 +1,64 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.entity; + + +import java.io.Serializable; + +/** + * This simple bean holds tracking information for MSO requests within + * the adapters. This tracking information should be added to logs, + * metrics, alarms as appropriate. + * + * + */ +public class MsoRequest implements Serializable +{ + private static final long serialVersionUID = 1797142528913733469L; + private String requestId; + private String serviceInstanceId; + + public MsoRequest() { + this.requestId = null; + this.serviceInstanceId = null; + } + + public MsoRequest(String r, String s) { + this.requestId = r; + this.serviceInstanceId = s; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getServiceInstanceId() { + return serviceInstanceId; + } + + public void setServiceInstanceId(String serviceInstanceId) { + this.serviceInstanceId = serviceInstanceId; + } +} diff --git a/common/src/main/java/org/onap/so/entity/package-info.java b/common/src/main/java/org/onap/so/entity/package-info.java new file mode 100644 index 0000000000..c4f5a16aee --- /dev/null +++ b/common/src/main/java/org/onap/so/entity/package-info.java @@ -0,0 +1,26 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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========================================================= + */ + +/** + * Entities used for logging. + */ + +package org.onap.so.entity; + diff --git a/common/src/main/java/org/onap/so/exceptions/MarshallerException.java b/common/src/main/java/org/onap/so/exceptions/MarshallerException.java new file mode 100644 index 0000000000..8b06a8519f --- /dev/null +++ b/common/src/main/java/org/onap/so/exceptions/MarshallerException.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.exceptions; + + +public class MarshallerException extends Exception { + + private static final long serialVersionUID = 1L; + private String message; + private int errorCode; + + public MarshallerException(String message) { + super(message); + } + + public MarshallerException(String message, int errorCode, Exception e) { + super (e); + this.message = message; + this.errorCode = errorCode; + + } + + @Override + public String getMessage() { + return message; + } + + public int getErrorCode() { + return errorCode; + } +} diff --git a/common/src/main/java/org/onap/so/exceptions/ValidationException.java b/common/src/main/java/org/onap/so/exceptions/ValidationException.java new file mode 100644 index 0000000000..713fac70f3 --- /dev/null +++ b/common/src/main/java/org/onap/so/exceptions/ValidationException.java @@ -0,0 +1,54 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.exceptions; + + +public class ValidationException extends Exception { + + /** + * This class simply extends Exception (without addition additional functionality) + * to provide an identifier for RequestsDB related exceptions on create, delete, query. + * + * + **/ + + private static final long serialVersionUID = 1L; + private static final String VALIDATION_FAIL = "No valid $ELEMENT is specified"; + private static final String INVALID_ELEMENT = "$ELEMENT is not valid in the $VERSION version"; + private static final String REPLACE_ELEMENT_KEY = "\\$ELEMENT"; + private static final String REPLACE_VERSION_KEY = "\\$VERSION"; + + @Deprecated + public ValidationException (String msg) { + super (VALIDATION_FAIL.replaceAll (REPLACE_ELEMENT_KEY, msg)); + } + + public ValidationException(String msg, boolean overrideExistingMessage) { + super(overrideExistingMessage ? VALIDATION_FAIL.replaceAll(REPLACE_ELEMENT_KEY, msg) : msg); + } + + public ValidationException (String msg, Exception cause) { + super (VALIDATION_FAIL.replaceAll (REPLACE_ELEMENT_KEY, msg), cause); + } + public ValidationException(String msg, String version) { + super(INVALID_ELEMENT.replaceAll(REPLACE_ELEMENT_KEY, msg).replaceAll(REPLACE_VERSION_KEY, version)); + } +} diff --git a/common/src/main/java/org/onap/so/jsonpath/JsonPathUtil.java b/common/src/main/java/org/onap/so/jsonpath/JsonPathUtil.java new file mode 100644 index 0000000000..cb0de998ba --- /dev/null +++ b/common/src/main/java/org/onap/so/jsonpath/JsonPathUtil.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.jsonpath; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.jayway.jsonpath.Configuration; +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.Option; +import com.jayway.jsonpath.spi.json.JacksonJsonNodeJsonProvider; + +public class JsonPathUtil { + + + private final Configuration conf; + private final Configuration pathListConf; + private JsonPathUtil() { + conf = Configuration.defaultConfiguration().jsonProvider(new JacksonJsonNodeJsonProvider()).addOptions(Option.ALWAYS_RETURN_LIST, Option.SUPPRESS_EXCEPTIONS); + pathListConf = Configuration.defaultConfiguration().addOptions(Option.AS_PATH_LIST, Option.SUPPRESS_EXCEPTIONS,Option.ALWAYS_RETURN_LIST); + } + + private static class Helper { + private static final JsonPathUtil INSTANCE = new JsonPathUtil(); + } + + public static JsonPathUtil getInstance() { + return Helper.INSTANCE; + } + public boolean pathExists(String json, String jsonPath) { + return JsonPath.using(conf).parse(json).<ArrayNode>read(jsonPath).size() != 0; + } + + public Optional<String> locateResult(String json, String jsonPath) { + final ArrayNode result = JsonPath.using(conf).parse(json).read(jsonPath); + if (result.size() == 0) { + return Optional.empty(); + } else { + if (result.get(0).isValueNode()) { + return Optional.of(result.get(0).asText()); + } else { + return Optional.of(result.get(0).toString()); + } + + } + } + + public List<String> locateResultList(String json, String jsonPath) { + final ArrayNode resultNodes = JsonPath.using(conf).parse(json).read(jsonPath); + final ArrayList<String> result = new ArrayList<>(); + + for (JsonNode node : resultNodes) { + if (node.isValueNode()) { + result.add(node.asText()); + } else { + result.add(node.toString()); + } + + } + return result; + } + + public List<String> getPathList(String json, String jsonPath) { + return JsonPath.using(pathListConf).parse(json).read(jsonPath); + } +} diff --git a/common/src/main/java/org/onap/so/logger/LoggerStartupListener.java b/common/src/main/java/org/onap/so/logger/LoggerStartupListener.java new file mode 100644 index 0000000000..0d20dd8bf9 --- /dev/null +++ b/common/src/main/java/org/onap/so/logger/LoggerStartupListener.java @@ -0,0 +1,87 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.logger; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import org.springframework.stereotype.Component; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggerContextListener; +import ch.qos.logback.core.Context; +import ch.qos.logback.core.spi.ContextAwareBase; +import ch.qos.logback.core.spi.LifeCycle; + +@Component +public class LoggerStartupListener extends ContextAwareBase implements LoggerContextListener, LifeCycle { + + private boolean started = false; + + @Override + public void start() { + if (started) + return; + InetAddress addr= null; + try { + addr = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + Context context = getContext(); + if (addr != null) { + context.putProperty("server.name", addr.getHostName()); + } + started = true; + } + + @Override + public void stop() { + } + + @Override + public boolean isStarted() { + return started; + } + + @Override + public boolean isResetResistant() { + return true; + } + + @Override + public void onLevelChange(Logger arg0, Level arg1) { + } + + @Override + public void onReset(LoggerContext arg0) { + } + + @Override + public void onStart(LoggerContext arg0) { + } + + @Override + public void onStop(LoggerContext arg0) { + } +} diff --git a/common/src/main/java/org/onap/so/logger/MessageEnum.java b/common/src/main/java/org/onap/so/logger/MessageEnum.java new file mode 100644 index 0000000000..fcaa52024b --- /dev/null +++ b/common/src/main/java/org/onap/so/logger/MessageEnum.java @@ -0,0 +1,223 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.logger; + + + +public enum MessageEnum{ + // Api Handler Messages + APIH_REQUEST_NULL, + APIH_QUERY_FOUND, + APIH_QUERY_NOT_FOUND, + APIH_QUERY_PARAM_WRONG, + APIH_DB_ACCESS_EXC, + APIH_DB_ACCESS_EXC_REASON, + APIH_VALIDATION_ERROR, + APIH_REQUEST_VALIDATION_ERROR, + APIH_SERVICE_VALIDATION_ERROR, + APIH_GENERAL_EXCEPTION_ARG, + APIH_GENERAL_EXCEPTION, + APIH_GENERAL_WARNING, + APIH_AUDIT_EXEC, + APIH_GENERAL_METRICS, + APIH_DUPLICATE_CHECK_EXC, + APIH_DUPLICATE_FOUND, + APIH_BAD_ORDER, + APIH_DB_ATTRIBUTE_NOT_FOUND, + APIH_BPEL_COMMUNICATE_ERROR, + APIH_BPEL_RESPONSE_ERROR, + APIH_WARP_REQUEST, + APIH_ERROR_FROM_BPEL_SERVER, + APIH_DB_INSERT_EXC, + APIH_DB_UPDATE_EXC, + APIH_NO_PROPERTIES, + APIH_PROPERTY_LOAD_SUC, + APIH_LOAD_PROPERTIES_FAIL, + APIH_SDNC_COMMUNICATE_ERROR, + APIH_SDNC_RESPONSE_ERROR, + APIH_CANNOT_READ_SCHEMA, + APIH_HEALTH_CHECK_EXCEPTION, + APIH_REQUEST_VALIDATION_ERROR_REASON, + APIH_JAXB_MARSH_ERROR, + APIH_JAXB_UNMARSH_ERROR, + APIH_VNFREQUEST_VALIDATION_ERROR, + APIH_DOM2STR_ERROR, + APIH_READ_VNFOUTPUT_CLOB_EXCEPTION, + APIH_DUPLICATE_CHECK_EXC_ATT, + APIH_GENERATED_REQUEST_ID, + APIH_GENERATED_SERVICE_INSTANCE_ID, + APIH_REPLACE_REQUEST_ID, + // Resource Adapter Messages + RA_GENERAL_EXCEPTION_ARG, + RA_GENERAL_EXCEPTION, + RA_GENERAL_WARNING, + RA_MISSING_PARAM, + RA_AUDIT_EXEC, + RA_GENERAL_METRICS, + RA_CREATE_STACK_TIMEOUT, + RA_DELETE_STACK_TIMEOUT, + RA_UPDATE_STACK_TIMEOUT, + RA_CONNECTION_EXCEPTION, + RA_PARSING_ERROR, + RA_PROPERTIES_NOT_FOUND, + RA_LOAD_PROPERTIES_SUC, + RA_NETWORK_ALREADY_EXIST, + RA_UPDATE_NETWORK_ERR, + RA_CREATE_STACK_ERR, + RA_UPDATE_STACK_ERR, + RA_CREATE_TENANT_ERR, + RA_NETWORK_NOT_FOUND, + RA_NETWORK_ORCHE_MODE_NOT_SUPPORT, + RA_CREATE_NETWORK_EXC, + RA_NS_EXC, + RA_PARAM_NOT_FOUND, + RA_CONFIG_EXC, + RA_UNKOWN_PARAM, + RA_VLAN_PARSE, + RA_DELETE_NETWORK_EXC, + RA_ROLLBACK_NULL, + RA_TENANT_NOT_FOUND, + RA_QUERY_NETWORK_EXC, + RA_CREATE_NETWORK_NOTIF_EXC, + RA_ASYNC_ROLLBACK, + RA_WSDL_NOT_FOUND, + RA_WSDL_URL_CONVENTION_EXC, + RA_INIT_NOTIF_EXC, + RA_SET_CALLBACK_AUTH_EXC, + RA_FAULT_INFO_EXC, + RA_MARSHING_ERROR, + RA_PARSING_REQUEST_ERROR, + RA_SEND_REQUEST_SDNC, + RA_RESPONSE_FROM_SDNC, + RA_EXCEPTION_COMMUNICATE_SDNC, + RA_EVALUATE_XPATH_ERROR, + RA_ANALYZE_ERROR_EXC, + RA_ERROR_GET_RESPONSE_SDNC, + RA_CALLBACK_BPEL, + RA_INIT_CALLBACK_WSDL_ERR, + RA_CALLBACK_BPEL_EXC, + RA_CALLBACK_BPEL_COMPLETE, + RA_SDNC_MISS_CONFIG_PARAM, + RA_SDNC_INVALID_CONFIG, + RA_PRINT_URL, + RA_ERROR_CREATE_SDNC_REQUEST, + RA_ERROR_CREATE_SDNC_RESPONSE, + RA_ERROR_CONVERT_XML2STR, + RA_RECEIVE_SDNC_NOTIF, + RA_INIT_SDNC_ADAPTER, + RA_SEND_REQUEST_APPC_ERR, + RA_SEND_REQUEST_SDNC_ERR, + RA_RECEIVE_BPEL_REQUEST, + RA_TENANT_ALREADY_EXIST, + RA_UPDATE_TENANT_ERR, + RA_DELETE_TEMAMT_ERR, + RA_ROLLBACK_TENANT_ERR, + RA_QUERY_VNF_ERR, + RA_VNF_ALREADY_EXIST, + RA_VNF_UNKNOWN_PARAM, + RA_VNF_EXTRA_PARAM, + RA_CREATE_VNF_ERR, + RA_VNF_NOT_EXIST, + RA_UPDATE_VNF_ERR, + RA_DELETE_VNF_ERR, + RA_ASYNC_CREATE_VNF, + RA_SEND_VNF_NOTIF_ERR, + RA_ASYNC_CREATE_VNF_COMPLETE, + RA_ASYNC_UPDATE_VNF, + RA_ASYNC_UPDATE_VNF_COMPLETE, + RA_ASYNC_QUERY_VNF, + RA_ASYNC_QUERY_VNF_COMPLETE, + RA_ASYNC_DELETE_VNF, + RA_ASYNC_DELETE_VNF_COMPLETE, + RA_ASYNC_ROLLBACK_VNF, + RA_ASYNC_ROLLBACK_VNF_COMPLETE, + RA_ROLLBACK_VNF_ERR, + RA_DB_INVALID_STATUS, + RA_CANT_UPDATE_REQUEST, + RA_DB_REQUEST_NOT_EXIST, + RA_CONFIG_NOT_FOUND, + RA_CONFIG_LOAD, + RA_RECEIVE_WORKFLOW_MESSAGE, + // BPEL engine Messages + BPMN_GENERAL_INFO, + BPMN_GENERAL_EXCEPTION_ARG, + BPMN_GENERAL_EXCEPTION, + BPMN_GENERAL_WARNING, + BPMN_AUDIT_EXEC, + BPMN_GENERAL_METRICS, + BPMN_URN_MAPPING_FAIL, + BPMN_VARIABLE_NULL, + BPMN_CALLBACK_EXCEPTION, + // ASDC Messages + ASDC_GENERAL_EXCEPTION_ARG, + ASDC_GENERAL_EXCEPTION, + ASDC_GENERAL_WARNING, + ASDC_GENERAL_INFO, + ASDC_AUDIT_EXEC, + ASDC_GENERAL_METRICS, + ASDC_CREATE_SERVICE, + ASDC_ARTIFACT_ALREADY_DEPLOYED, + ASDC_CREATE_ARTIFACT, + ASDC_ARTIFACT_INSTALL_EXC, + ASDC_ARTIFACT_ALREADY_DEPLOYED_DETAIL, + ASDC_ARTIFACT_NOT_DEPLOYED_DETAIL, + ASDC_ARTIFACT_CHECK_EXC, + ASDC_INIT_ASDC_CLIENT_EXC, + ASDC_INIT_ASDC_CLIENT_SUC, + ASDC_LOAD_ASDC_CLIENT_EXC, + ASDC_SINGLETON_CHECKT_EXC, + ASDC_SHUTDOWN_ASDC_CLIENT_EXC, + ASDC_CHECK_HEAT_TEMPLATE, + ASDC_START_INSTALL_ARTIFACT, + ASDC_ARTIFACT_TYPE_NOT_SUPPORT, + ASDC_ARTIFACT_ALREADY_EXIST, + ASDC_ARTIFACT_DOWNLOAD_SUC, + ASDC_ARTIFACT_DOWNLOAD_FAIL, + ASDC_START_DEPLOY_ARTIFACT, + ASDC_SEND_NOTIF_ASDC, + ASDC_SEND_NOTIF_ASDC_EXEC, + ASDC_RECEIVE_CALLBACK_NOTIF, + ASDC_RECEIVE_SERVICE_NOTIF, + ASDC_ARTIFACT_NULL, + ASDC_SERVICE_NOT_SUPPORT, + ASDC_ARTIFACT_DEPLOY_SUC, + ASDC_PROPERTIES_NOT_FOUND, + ASDC_PROPERTIES_LOAD_SUCCESS, + // Default Messages, in case Log catalog is not defined + GENERAL_EXCEPTION_ARG, + GENERAL_EXCEPTION, + GENERAL_WARNING, + AUDIT_EXEC, + GENERAL_METRICS, + LOGGER_SETUP, + LOGGER_NOT_FOUND, + LOGGER_UPDATE_SUC, + LOGGER_UPDATE_DEBUG, + LOGGER_UPDATE_DEBUG_SUC, + LOAD_PROPERTIES_SUC, + NO_PROPERTIES, + MADATORY_PARAM_MISSING, + LOAD_PROPERTIES_FAIL, + INIT_LOGGER, + INIT_LOGGER_FAIL, + JAXB_EXCEPTION, + IDENTITY_SERVICE_NOT_FOUND; +} diff --git a/common/src/main/java/org/onap/so/logger/MsoAlarmLogger.java b/common/src/main/java/org/onap/so/logger/MsoAlarmLogger.java new file mode 100644 index 0000000000..890aac93c0 --- /dev/null +++ b/common/src/main/java/org/onap/so/logger/MsoAlarmLogger.java @@ -0,0 +1,187 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.logger; + + +import java.io.File; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.encoder.PatternLayoutEncoder; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.rolling.RollingFileAppender; +import ch.qos.logback.core.rolling.TimeBasedRollingPolicy; + +/** + * Wrapper around log4j and Nagios NRDP passive alarming for MSO. + * + * For local alarm logging, this class will look for an alarm log file name + * in the servlet context parameter "mso.alarms.file". If none is found, + * it will look for an MsoProperty of the same name. As a last resort, + * it will use the default path "/var/log/ecomp/MSO/alarms/alarm.log". + * It is expected that all alarms within an application will use the same + * alarm file, so there is no way to dynamically add other alarm files. + * + * Alarms are logged as a simple pipe-delimited string of the format: + * <dateTime>|<alarmType>|<state>|<detailMessage> + * + * This class also supports real-time Nagios NRDP alarming. If enabled via + * MsoProperties, all alarms generated and logged to the local alarm file will + * also be transmitted to a Nagios NRDP instance. NRDP requires 4 parameters + * in service alarm events (all Mso Alarms will be Service Alarms): + * hostname, servicename, state, detail + * + * The log file format is also intended to be compatible with Nagios NRDP for + * non-real-time reporting. The command-line tool for sending alarms is + * is "send_nrdp.php", which takes the same 4 parameters as input. + * It will be easy enough to translate entries from an alarm.log file to + * NRDP if real-time NRDP alarming is not enabled. + * + * For Nagios integration, the alarmTypes should all match "service names" + * configured in the receiving Nagios server. Also, the alarm state will + * be limited to the 4 values defined by Nagios: + * 0 = OK, 1 = Warning, 2 = Critical, 3 = Unknown + * + * + */ +public class MsoAlarmLogger implements ServletContextListener { + + private Logger alarmLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(MSO_ALARM_CONTEXT); + private static RollingFileAppender<ILoggingEvent> fileAppender = null; + public static final String DEFAULT_MSO_ALARM_FILE = "/var/log/ecomp/MSO/alarms/alarm.log"; + public static final String MSO_ALARM_CONTEXT = "mso.alarms"; + + public static final int OK = 0; + public static final int WARNING = 1; + public static final int CRITICAL = 2; + public static final int UNKNOWN = 3; + + /** + * Get the default MSO Alarm Logger + */ + public MsoAlarmLogger () { + + initializeAlarmLogger(null); + + } + + public MsoAlarmLogger (String alarmFile) { + initializeAlarmLogger(alarmFile); + + } + + /** + * Method to record an alarm. + * + * @param alarm - the alarm identifier (Nagios "service") + * @param state - the alarm state/severity, based on Nagios service + * state values: 0 = OK, 1 = Warning, 2 = Critical, 3 = Unknown + * @param detail - detail message (may contain additional internal + * structure per alarm type) + */ + public void sendAlarm (String alarm, int state, String detail) { + // Write the alarm to Log file + if (alarmLogger != null) { + String output = alarm + "|" + state + "|" + detail; + alarmLogger.info (output); + } + + } + + @Override + public void contextDestroyed (ServletContextEvent event) { + // Nothing to do... + } + + @Override + public void contextInitialized (ServletContextEvent event) { + String msoAlarmFile = event.getServletContext ().getInitParameter ("mso.alarm.file"); + if (msoAlarmFile == null) { + msoAlarmFile = DEFAULT_MSO_ALARM_FILE; + } + + initializeAlarmLogger (msoAlarmFile); + } + + private void initializeAlarmLogger (String alarmFile) { + synchronized (MsoAlarmLogger.class) { + if (fileAppender == null) { + if (alarmFile != null) { + fileAppender = MsoAlarmLogger.getAppender (alarmFile); + } else { + fileAppender = MsoAlarmLogger.getAppender (DEFAULT_MSO_ALARM_FILE); + } + } + } + // The alarmLogger was static originally. + // The initialization of the alarmLogger was fine, but not sure why, it lost its appender info later + // Due to that issue, the alarmLogger is not static any more. + // Instead static attribute fileAppender is added and will be assigned to the alarmLogger every time new MsoAlarmLogger is created. + alarmLogger.setLevel (Level.INFO); + alarmLogger.addAppender (fileAppender); + alarmLogger.setAdditive (false); + } + + public void resetAppender() { + synchronized (MsoAlarmLogger.class) { + fileAppender = null; + } + } + + private static RollingFileAppender<ILoggingEvent> getAppender (String msoAlarmFile) { + // Create a Logger for alarms. Just use a default Pattern that outputs + // a message. MsoAlarmLogger will handle the formatting. + File alarmFile = new File (msoAlarmFile); + File alarmDir = alarmFile.getParentFile (); + if (!alarmDir.exists ()) { + alarmDir.mkdirs (); + } + + String logPattern = "%d{yyyy-MM-dd HH:mm:ss}|%m%n"; + + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + PatternLayoutEncoder encoder=new PatternLayoutEncoder(); + encoder.setPattern(logPattern); + encoder.setContext(context); + encoder.start(); + RollingFileAppender<ILoggingEvent> fileAppender= new RollingFileAppender<>(); + TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy= new TimeBasedRollingPolicy<>(); + rollingPolicy.setContext(context); + rollingPolicy.setFileNamePattern(msoAlarmFile + ".%d"); + rollingPolicy.setParent(fileAppender); + rollingPolicy.start(); + fileAppender.setFile(msoAlarmFile); + fileAppender.setAppend(true); + fileAppender.setEncoder(encoder); + fileAppender.setRollingPolicy(rollingPolicy); + fileAppender.setContext(context); + fileAppender.start(); + + return fileAppender; + } + +} diff --git a/common/src/main/java/org/onap/so/logger/MsoLogger.java b/common/src/main/java/org/onap/so/logger/MsoLogger.java new file mode 100644 index 0000000000..10f572e772 --- /dev/null +++ b/common/src/main/java/org/onap/so/logger/MsoLogger.java @@ -0,0 +1,1193 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.so.logger; + + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.invoke.MethodHandles; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.onap.so.entity.MsoRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; + + +/** + * This class supports all of the normal logging functions (debug, info, etc.), prepending + * a string of format "[<requestId>|<serviceId]" to each message. + * + * SO code should initialize with these IDs when available, so that individual + * requests and/or services can be tracked throughout the various MSO component + * logs (API Handler, BPEL, and Adapters). + * + * + */ + +public class MsoLogger { + // MDC parameters + public static final String REQUEST_ID = "RequestId"; + public static final String SERVICE_INSTANCE_ID = "ServiceInstanceId"; + public static final String SERVICE_NAME = "ServiceName"; + public static final String SERVICE_NAME_IS_METHOD_NAME = "ServiceNameIsMethodName"; + public static final String INSTANCE_UUID = "InstanceUUID"; + public static final String SERVER_IP = "ServerIPAddress"; + + public static final String FQDN = "ServerFQDN"; + public static final String REMOTE_HOST = "RemoteHost"; + public static final String ALERT_SEVERITY = "AlertSeverity"; + public static final String TIMER = "Timer"; + public static final String USER = "User"; + public static final String DUMMY_VALUE = "trace-#"; + public static final String UNKNOWN = "UNKNOWN"; + public static final String CAT_LOG_LEVEL = "CategoryLogLevel"; + public static final String AUDI_CAT_LOG_LEVEL = "AuditCategoryLogLevel"; + + //For getting an identity of calling application + public static final String HEADER_FROM_APP_ID = "X-FromAppId"; + public static final String FROM_APP_ID = "FromAppId"; + public static final String HEADER_REQUEST_ID = "X-RequestId"; + public static final String TRANSACTION_ID = "X-TransactionID"; + public static final String ECOMP_REQUEST_ID = "X-ECOMP-RequestID"; + public static final String CLIENT_ID = "X-ClientID"; + + // Audit/Metric log specific + public static final String BEGINTIME = "BeginTimestamp"; + public static final String STARTTIME = "StartTimeMilis"; + public static final String ENDTIME = "EndTimestamp"; + public static final String PARTNERNAME = "PartnerName"; + public static final String STATUSCODE = "StatusCode"; + public static final String RESPONSECODE = "ResponseCode"; + public static final String RESPONSEDESC = "ResponseDesc"; + + + // Metric log specific + public static final String METRIC_BEGIN_TIME = "MetricBeginTime"; + public static final String METRIC_START_TIME = "MetricStartTime"; + public static final String METRIC_END_TIME = "MetricEndTime"; + public static final String METRIC_TIMER = "MetricEndTime"; + public static final String TARGETENTITY = "TargetEntity"; + public static final String TARGETSERVICENAME = "TargetServiceName"; + public static final String TARGETVIRTUALENTITY = "TargetVirtualEntity"; + + public static final String FATAL_LEVEL = "FATAL"; + public static final String ERROR_LEVEL = "ERROR"; + public static final String WARN_LEVEL = "WARN"; + public static final String INFO_LEVEL = "INFO"; + public static final String DEBUG_LEVEL = "DEBUG"; + + public static final String ERRORCODE = "ErrorCode"; + public static final String ERRORDESC = "ErrorDesc"; + + public static final String COMPLETE = "COMPLETE"; + + public enum Catalog { + APIH, BPEL, RA, ASDC, GENERAL + } + + public enum StatusCode { + COMPLETE, ERROR + } + + public enum TargetEntity { + CAMUNDA("Camunda"); + + private String name; + + TargetEntity(String name) { + this.name = name; + } + + public String getUrl() { + return name; + } + } + + public enum ResponseCode { + Suc(0), PermissionError(100), DataError(300), DataNotFound(301), BadRequest(302), SchemaError( + 400), BusinessProcesssError(500), ServiceNotAvailable(501), InternalError( + 502), Conflict(503), DBAccessError(504), CommunicationError(505), UnknownError(900); + + private int value; + + public int getValue() { + return this.value; + } + + private ResponseCode(int value) { + this.value = value; + } + } + + public enum ErrorCode { + PermissionError(100), AvailabilityError(200), DataError(300), SchemaError(400), BusinessProcesssError( + 500), UnknownError(900); + + private int value; + + public int getValue() { + return this.value; + } + + private ErrorCode(int value) { + this.value = value; + } + } + + private Logger logger; + private Logger metricsLogger; + private Logger auditLogger; + private static String instanceUUID, serverIP, serverName; + private MessageEnum exceptionArg, defaultException, defaultWarning, defaultAudit, defaultMetrics; + + // For internal logging of the initialization of MSO logs + private static final Logger initLOGGER = LoggerFactory.getLogger(MsoLogger.class.getName()); + + private MsoLogger() { + this(MsoLogger.Catalog.GENERAL); + } + + private MsoLogger(MsoLogger.Catalog cat) { + this(cat, MethodHandles.lookup().lookupClass()); + } + + private MsoLogger(MsoLogger.Catalog cat, Class<?> clazz) { + this.logger = LoggerFactory.getLogger(clazz); + this.auditLogger = LoggerFactory.getLogger("AUDIT"); + this.metricsLogger = LoggerFactory.getLogger("METRIC"); + MsoLogger.initialization(); + setDefaultLogCatalog(cat); + } + + private static synchronized void initialization() { + if (instanceUUID == null || ("").equals(instanceUUID)) { + instanceUUID = getInstanceUUID(); + } + + if (serverIP == null || serverName == null || ("").equals(serverIP) || ("").equals(serverName)) { + try { + InetAddress server = InetAddress.getLocalHost(); + serverIP = server.getHostAddress(); + serverName = server.getHostName(); + } catch (UnknownHostException e) { + initLOGGER.error("Could not get local hostname", e); + serverIP = ""; + serverName = ""; + } + } + } + + + + public static MsoLogger getMsoLogger(MsoLogger.Catalog cat, Class<?> clazz) { + return new MsoLogger(cat,clazz); + } + + + + /** + * Record the Metrics event with no argument + * + * @param startTime + * Transaction starting time in millieseconds + * @param statusCode + * StatusCode of the transaction, either COMPLETE or ERROR + * @param responseCode + * The response code returned by the sub-components + * @param responseDesc + * Human redable description of the response code + * @param targetEntity + * The component which is invoked for this sub-operation + * @param targetServiceName + * API invoked on the TargetEntity + * @param targetVEntity + * Target VNF or VM acted opon by the component, if available + */ + public void recordMetricEvent() { + metricsLogger.info(""); + MDC.remove(TIMER); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + public void recordMetricEvent(Long startTime, StatusCode statusCode, ResponseCode responseCode, String responseDesc, + String targetEntity, String targetServiceName, String targetVEntity) { + prepareMetricMsg(startTime, statusCode, responseCode.getValue(), responseDesc, targetEntity, targetServiceName, + targetVEntity); + metricsLogger.info(""); + MDC.remove(TIMER); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + + /** + * Record the Audit event + * + * @param startTime + * Transaction starting time in millieseconds + * @param statusCode + * StatusCode of the transaction, either COMPLETE or ERROR + * @param responseCode + * The application specific response code + * @param responseDesc + * Human redable description of the application response code + */ + public void recordAuditEvent(){ + auditLogger.info(""); + } + + public void recordAuditEvent(Long startTime, StatusCode statusCode, ResponseCode responseCode, + String responseDesc) { + MDC.put(MsoLogger.PARTNERNAME, "UNKNOWN"); + prepareAuditMsg(startTime, statusCode, responseCode.getValue(), responseDesc); + auditLogger.info(""); + MDC.remove(TIMER); + } + + // Debug methods + /** + * Record the Debug event + * + * @param msg + * The log message to put + */ + public void debug(String msg) { + prepareMsg(DEBUG_LEVEL); + logger.debug(msg); + } + + /** + * Record the Debug event + * + * @param msg + * The log message to put + * @param t + * The exception to put + */ + public void debug(String msg, Throwable t) { + prepareMsg(DEBUG_LEVEL); + logger.debug(msg, t); + } + + public void info(String msg) { + prepareMsg(DEBUG_LEVEL); + logger.info(msg); + } + + + /** + * Log error message with the details of the exception that caused the error. + * @param msg + * @param throwable + */ + public void error(String msg) { + prepareMsg(ERROR_LEVEL); + logger.error(msg); + } + + /** + * Log error message with the details of the exception that caused the error. + * @param msg + * @param throwable + */ + public void error(String msg, Throwable throwable) { + prepareMsg(ERROR_LEVEL); + logger.error(msg, throwable); + } + + // Info methods + /** + * Record the Info event + * + * @param msg + * The log message to put + */ + public void info(String msg, String targetEntity, String targetServiceName) { + prepareErrorMsg(INFO_LEVEL, targetEntity, targetServiceName, null, ""); + + logger.info(msg); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Info event with 1 argument + * + * @param msg + * The log message to put + * @param arg0 + * The argument used in the log message + */ + public void info(MessageEnum msg, String arg0, String targetEntity, String targetServiceName) { + prepareErrorMsg(INFO_LEVEL, targetEntity, targetServiceName, null, ""); + + logger.info(msg.toString(), normalize(arg0)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Info event with 2 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1 + * The arguments used in the log message + */ + public void info(String msg, String arg0, String arg1, String targetEntity, + String targetServiceName) { + prepareErrorMsg(INFO_LEVEL, targetEntity, targetServiceName, null, ""); + + logger.info(msg, normalize(arg0), normalize(arg1)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Info event with 3 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2 + * The arguments used in the log message + */ + public void info(MessageEnum msg, String arg0, String arg1, String arg2, String targetEntity, + String targetServiceName) { + prepareErrorMsg(INFO_LEVEL, targetEntity, targetServiceName, null, ""); + + logger.info(msg.toString(), normalize(arg0), normalize(arg1), normalize(arg2)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Info event with 4 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3 + * The arguments used in the log message + */ + public void info(String msg, String arg0, String arg1, String arg2, String arg3, + String targetEntity, String targetServiceName) { + prepareErrorMsg(INFO_LEVEL, targetEntity, targetServiceName, null, ""); + + logger.info(msg, normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Info event with 5 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3,arg4 + * The arguments used in the log message + */ + public void info(String msg, String arg0, String arg1, String arg2, String arg3, String arg4, + String targetEntity, String targetServiceName) { + prepareErrorMsg(INFO_LEVEL, targetEntity, targetServiceName, null, ""); + + logger.info(msg, normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3), normalize(arg4)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Info event with 6 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3,arg4,arg5 + * The arguments used in the log message + */ + public void info(String msg, String arg0, String arg1, String arg2, String arg3, String arg4, + String arg5, String targetEntity, String targetServiceName) { + prepareErrorMsg(INFO_LEVEL, targetEntity, targetServiceName, null, ""); + + logger.info(msg, normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3), normalize(arg4), + normalize(arg5)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + // Warning methods + + + /** + * Record the Warning event + * + * @param msg + * The log message to put + */ + public void warnSimple( String targetServiceName, String errorDesc) { + logger.warn("Service Name: {} Error: {}" , targetServiceName, errorDesc); + } + /** + * Record the Warning event + * + * @param msg + * The log message to put + */ + public void warn(MessageEnum msg, String targetEntity, String targetServiceName, ErrorCode errorCode, + String errorDesc) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + + logger.warn(msg.toString()); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warning event + * + * @param msg + * The log message to put + * @param t + * The exception info + */ + public void warn(MessageEnum msg, String targetEntity, String targetServiceName, ErrorCode errorCode, + String errorDesc, Throwable t) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn("Warning: "+msg, t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 1 argument + * + * @param msg + * The log message to put + * @param arg + * The argument used in the log message + */ + public void warn(MessageEnum msg, String arg, String targetEntity, String targetServiceName, + ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg.toString(), arg); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 1 argument + * + * @param msg + * The log message to put + * @param arg + * The arguments used in the log message + * @param t + * The exception info + */ + public void warn(MessageEnum msg, String arg, String targetEntity, String targetServiceName, + ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg.toString(), arg); + logger.debug("Exception raised", t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 2 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1 + * The arguments used in the log message + */ + public void warn(MessageEnum msg, String arg0, String arg1, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg.toString(), normalize(arg0), normalize(arg1)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 2 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1 + * The arguments used in the log message + * @param t + * The exception info + */ + public void warn(String msg, String arg0, String arg1, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg, normalize(arg0), normalize(arg1)); + logger.warn(msg, t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 3 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2 + * The arguments used in the log message + */ + public void warn(String msg, String arg0, String arg1, String arg2, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg, normalize(arg0), normalize(arg1), normalize(arg2)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 3 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2 + * The arguments used in the log message + * @param t + * The exception info + */ + public void warn(String msg, String arg0, String arg1, String arg2, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg, normalize(arg0), normalize(arg1), normalize(arg2)); + logger.warn(msg, t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 4 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3 + * The arguments used in the log message + */ + public void warn(String msg, String arg0, String arg1, String arg2, String arg3, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg, normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 4 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2, + * arg3 The arguments used in the log message + * @param t + * The exception info + */ + public void warn(String msg, String arg0, String arg1, String arg2, String arg3, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg, normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3)); + logger.warn(msg, t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 5 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3,arg4 + * The arguments used in the log message + */ + public void warn(String msg, String arg0, String arg1, String arg2, String arg3, String arg4, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg, normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3), normalize(arg4)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Warn event with 5 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3,arg4 + * The arguments used in the log message + * @param t + * The exception info + */ + public void warn(String msg, String arg0, String arg1, String arg2, String arg3, String arg4, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(WARN_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.warn(msg, normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3), normalize(arg4)); + logger.warn(msg, t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + + + // Error methods + /** + * Record the Error event + * + * @param generalException + * The log message to put + */ + public void error(MessageEnum generalException, String targetEntity, String targetServiceName, ErrorCode errorCode, + String errorDesc) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(generalException.toString() + ": " +errorDesc); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + + /** + * Record the Error event + * + * @param msg + * The log message to put + * @param t + * The exception info + */ + public void trace(String traceMessage) { + logger.trace(traceMessage); + } + + + /** + * Record the Error event + * + * @param msg + * The log message to put + * @param t + * The exception info + */ + public void error( Throwable t) { + logger.error(t.getMessage(), t); + } + + + /** + * Record the Error event + * + * @param msg + * The log message to put + * @param t + * The exception info + */ + public void error(MessageEnum msg, String targetEntity, String targetServiceName, ErrorCode errorCode, + String errorDesc, Throwable t) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 1 argument + * + * @param msg + * The log message to put + * @param arg0 + * The arguments used in the log message + */ + public void error(MessageEnum msg, String arg0, String targetEntity, String targetServiceName, + ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 1 argument + * + * @param msg + * The log message to put + * @param arg0 + * The arguments used in the log message + * @param t + * The exception info + */ + public void error(MessageEnum msg, String arg0, String targetEntity, String targetServiceName, + ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 2 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1 + * The arguments used in the log message + */ + public void error(MessageEnum msg, String arg0, String arg1, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 2 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1 + * The arguments used in the log message + * @param t + * The exception info + */ + public void error(MessageEnum msg, String arg0, String arg1, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1), t); + logger.debug("Exception raised", t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 3 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2 + * The arguments used in the log message + */ + public void error(MessageEnum msg, String arg0, String arg1, String arg2, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1), normalize(arg2)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 3 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2 + * The arguments used in the log message + * @param t + * The exception info + */ + public void error(MessageEnum msg, String arg0, String arg1, String arg2, String targetEntity, + String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1), normalize(arg2), t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 4 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3 + * The arguments used in the log message + */ + public void error(MessageEnum msg, String arg0, String arg1, String arg2, String arg3, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 4 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3 + * The arguments used in the log message + * @param t + * The exception info + */ + public void error(MessageEnum msg, String arg0, String arg1, String arg2, String arg3, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3), t); + + logger.debug("Exception raised", t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 5 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3,arg4 + * The arguments used in the log message + */ + public void error(MessageEnum msg, String arg0, String arg1, String arg2, String arg3, String arg4, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3), normalize(arg4)); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + /** + * Record the Error event with 5 arguments + * + * @param msg + * The log message to put + * @param arg0,arg1,arg2,arg3,arg4 + * The arguments used in the log message + * @param t + * The exception info + */ + public void error(MessageEnum msg, String arg0, String arg1, String arg2, String arg3, String arg4, + String targetEntity, String targetServiceName, ErrorCode errorCode, String errorDesc, Throwable t) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorDesc); + logger.error(msg.toString(), normalize(arg0), normalize(arg1), normalize(arg2), normalize(arg3), normalize(arg4), t); + logger.debug("Exception raised", t); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + } + + public void error(String errorMessage, String errorSource, String targetEntity, String targetServiceName, + ErrorCode errorCode, String errorText) { + prepareErrorMsg(ERROR_LEVEL, targetEntity, targetServiceName, errorCode, errorText); + logger.error(errorMessage); + MDC.remove(TARGETENTITY); + MDC.remove(TARGETSERVICENAME); + + } + + public void logStackTrace(Exception ex){ + StringWriter errors = new StringWriter(); + ex.printStackTrace(new PrintWriter(errors)); + logger.error(errors.toString()); + } + + public boolean isDebugEnabled() { + return logger.isDebugEnabled(); + } + + private void prepareMsg(String loggingLevel) { + prepareMsg(loggingLevel, null, null); + } + + private void prepareMsg(String loggingLevel, String serviceNamep, String timer) { + String reqId = MDC.get(REQUEST_ID); + String svcId = MDC.get(SERVICE_INSTANCE_ID); + + // Based on the discussion with Adrian, + // if these 2 parameters is not available, using dummy value "trace-#" + if (reqId == null || reqId.isEmpty()) { + MDC.put(REQUEST_ID, DUMMY_VALUE); + } + + if (timer != null) { + MDC.put(TIMER, timer); + } + + writeIfNotNullorEmpty(SERVICE_NAME,getFinalServiceName(serviceNamep)); + writeIfNotNullorEmpty(ALERT_SEVERITY,getSeverityLevel(loggingLevel)); + writeIfNotNullorEmpty(INSTANCE_UUID,instanceUUID); + writeIfNotNullorEmpty(SERVER_IP,serverIP); + writeIfNotNullorEmpty(FQDN,serverName); + + } + + private void writeIfNotNullorEmpty(String Key, String value) { + if (MDC.get(Key) == null|| MDC.get(Key).isEmpty()) { + MDC.put(Key, value); + } + } + + private void prepareAuditMsg(long startTime, StatusCode statusCode, int responseCode, String responseDesc) { + long endTime = System.currentTimeMillis(); + prepareMsg(INFO_LEVEL, null, String.valueOf(endTime - startTime)); + prepareAuditMetricMsg(startTime, endTime, statusCode, responseCode, responseDesc); + } + + private void prepareAuditMetricMsg(long startTime, long endTime, StatusCode statusCode, int responseCode, + String responseDesc) { + Date startDate = new Date(startTime); + Date endDate = new Date(endTime); + DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); + + MDC.put(BEGINTIME, String.valueOf(formatter.format(startDate))); + MDC.put(ENDTIME, String.valueOf(formatter.format(endDate))); + MDC.put(STATUSCODE, statusCode.name()); + MDC.put(RESPONSECODE, String.valueOf(responseCode)); + MDC.put(RESPONSEDESC, responseDesc); + } + + private void prepareErrorMsg(String loggingLevel, String targetEntity, String targetServiceName, + ErrorCode errorCode, String errorDesc) { + MDC.put(ALERT_SEVERITY, getSeverityLevel(loggingLevel)); + if(errorCode != null) { + MDC.put(ERRORCODE, Integer.toString(errorCode.getValue())); + } + MDC.put(ERRORDESC, errorDesc); + MDC.put(TARGETENTITY, targetEntity); + MDC.put(TARGETSERVICENAME, targetServiceName); + MDC.put(SERVICE_NAME, getFinalServiceName(getServiceName())); + } + + private void prepareMetricMsg(long startTime, StatusCode statusCode, int responseCode, String responseDesc, + String targetEntity, String targetServiceName, String targetVEntity) { + long endTime = System.currentTimeMillis(); + prepareMsg(INFO_LEVEL, null, String.valueOf(endTime - startTime)); + prepareAuditMetricMsg(startTime, endTime, statusCode, responseCode, responseDesc); + + // Populate Metric log specific parameter + MDC.put(TARGETENTITY, targetEntity); + MDC.put(TARGETSERVICENAME, targetServiceName); + + if (null != targetVEntity) { + MDC.put(TARGETVIRTUALENTITY, targetVEntity); + } + } + + private String getSeverityLevel(String loggingLevel) { + String severity; + // According to the Nagios alerting: 0=OK; 1=WARNING; 2=UNKOWN; + // 3=CRITICAL + switch (loggingLevel) { + case ERROR_LEVEL: + severity = "2"; + break; + case FATAL_LEVEL: + severity = "3"; + break; + case WARN_LEVEL: + severity = "1"; + break; + default: + severity = "0"; + break; + } + return severity; + } + + private String getFinalServiceName(String serviceNamep) { + // This step to set the serviceName should be put after the className is + // get, + // since the default serviceName is obtained during the method to get + // the className. + // + // There's 3 ways to set the serviceName. The first method has the most + // priority to set the value. + // a) If the serviceName is set within the log method, this value will + // be used first + // b) If serviceName is not set within the log method, the value defined + // in the MDC will be used + // c) If nothing is set specifically, then MsoLogger will assign a + // default(MSO.<method_name>) value to it + String serName = MDC.get(MsoLogger.SERVICE_NAME); + + // Check if service name was already set as the method name by a + // previous call to this method. + String isMethodNameStr = MDC.get(MsoLogger.SERVICE_NAME_IS_METHOD_NAME); + boolean isMethodName = isMethodNameStr != null && isMethodNameStr.equals(Boolean.TRUE.toString()); + if (serviceNamep != null) { + return serviceNamep; + } else if (serName != null && !isMethodName) { + return serName; + } + + MDC.put(MsoLogger.SERVICE_NAME_IS_METHOD_NAME, Boolean.TRUE.toString()); + int limit; + StackTraceElement[] classArr = new Exception().getStackTrace(); + if (classArr.length >= 6) { + limit = 7; + } else { + limit = classArr.length; + } + for (int i = 1; i < limit; i++) { + if (!classArr[i].getClassName().equals(this.getClass().getName())) { + return classArr[i].getMethodName(); + } + } + return classArr[0].getMethodName(); + } + + // Based on the discussion with Adrian, instanceUUID is used to identifiy + // the mso instance, + // it is generated during mso instance initialization period + // The same mso instnace will use the same instanceUUID value, even after + // restart + private static String getInstanceUUID() { + return System.getProperty("mso-instance-id"); + } + + /** + * Set the requestId and serviceInstanceId + * + * @param reqId + * The requestId + * @param svcId + * The serviceInstanceId + */ + public static void setLogContext(String reqId, String svcId) { + if (null != reqId) { + MDC.put(REQUEST_ID, reqId); + } + + if (null != svcId) { + MDC.put(SERVICE_INSTANCE_ID, svcId); + } + } + + /** + * Set the remoteIp and the basic HTTP Authentication user + * + * @param remoteIpp + * The remote ip address + * @param userp + * The basic http authencitation user + */ + public static void setLoggerParameters(String remoteIpp, String userp) { + if (null != remoteIpp) { + MDC.put(REMOTE_HOST, remoteIpp); + } + if (null != userp) { + MDC.put(USER, userp); + } + } + + /** + * Set the serviceName + * + * @param serviceNamep + * The service name + */ + public static void setServiceName(String serviceNamep) { + if (null != serviceNamep) { + MDC.put(SERVICE_NAME, serviceNamep); + MDC.remove(SERVICE_NAME_IS_METHOD_NAME); + } + } + + /** + * Get the serviceName + * + * @return The service name + */ + public static String getServiceName() { + return MDC.get(SERVICE_NAME); + } + + /** + * Reset the serviceName + */ + public static void resetServiceName() { + MDC.remove(SERVICE_NAME); + } + + /** + * Set the requestId and serviceInstanceId based on the mso request + * + * @param msoRequest + * The mso request + */ + public static void setLogContext(MsoRequest msoRequest) { + if (msoRequest != null) { + MDC.put(REQUEST_ID, msoRequest.getRequestId()); + MDC.put(SERVICE_INSTANCE_ID, msoRequest.getServiceInstanceId()); + } else { + MDC.put(REQUEST_ID, DUMMY_VALUE); + MDC.put(SERVICE_INSTANCE_ID, DUMMY_VALUE); + } + } + + private String normalize(String input) { + if (input == null) { + return null; + } + String result = input.replace('|', '!'); + result = result.replace("\n", " - "); + return result; + } + + private void setDefaultLogCatalog(MsoLogger.Catalog cat) { + if ("APIH".equals(cat.toString())) { + exceptionArg = MessageEnum.APIH_GENERAL_EXCEPTION_ARG; + defaultException = MessageEnum.APIH_GENERAL_EXCEPTION; + defaultWarning = MessageEnum.APIH_GENERAL_WARNING; + defaultAudit = MessageEnum.APIH_AUDIT_EXEC; + defaultMetrics = MessageEnum.APIH_GENERAL_METRICS; + } else if ("RA".equals(cat.toString())) { + exceptionArg = MessageEnum.RA_GENERAL_EXCEPTION_ARG; + defaultException = MessageEnum.RA_GENERAL_EXCEPTION; + defaultWarning = MessageEnum.RA_GENERAL_WARNING; + defaultAudit = MessageEnum.RA_AUDIT_EXEC; + defaultMetrics = MessageEnum.RA_GENERAL_METRICS; + } else if ("BPEL".equals(cat.toString())) { + exceptionArg = MessageEnum.BPMN_GENERAL_EXCEPTION_ARG; + defaultException = MessageEnum.BPMN_GENERAL_EXCEPTION; + defaultWarning = MessageEnum.BPMN_GENERAL_WARNING; + defaultAudit = MessageEnum.BPMN_AUDIT_EXEC; + defaultMetrics = MessageEnum.BPMN_GENERAL_METRICS; + } else if ("ASDC".equals(cat.toString())) { + exceptionArg = MessageEnum.ASDC_GENERAL_EXCEPTION_ARG; + defaultException = MessageEnum.ASDC_GENERAL_EXCEPTION; + defaultWarning = MessageEnum.ASDC_GENERAL_WARNING; + defaultAudit = MessageEnum.ASDC_AUDIT_EXEC; + defaultMetrics = MessageEnum.ASDC_GENERAL_METRICS; + } else { + exceptionArg = MessageEnum.GENERAL_EXCEPTION_ARG; + defaultException = MessageEnum.GENERAL_EXCEPTION; + defaultWarning = MessageEnum.GENERAL_WARNING; + defaultAudit = MessageEnum.AUDIT_EXEC; + defaultMetrics = MessageEnum.GENERAL_METRICS; + } + } + + public void warnSimple(String message, Exception e) { + logger.warn(message,e); + + } + + + + + +} diff --git a/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/JaxRsClientLogging.java b/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/JaxRsClientLogging.java new file mode 100644 index 0000000000..2888cbf3a1 --- /dev/null +++ b/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/JaxRsClientLogging.java @@ -0,0 +1,135 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.logging.jaxrs.filter.jersey; + + +import org.apache.commons.io.IOUtils; +import org.onap.so.logger.MsoLogger; +import org.onap.so.utils.TargetEntity; +import org.slf4j.MDC; +import org.springframework.stereotype.Component; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.client.ClientResponseFilter; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; + +import java.io.*; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import java.util.UUID; + +@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") +@Component +public class JaxRsClientLogging implements ClientRequestFilter,ClientResponseFilter { + + private static MsoLogger logger = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA,JaxRsClientLogging.class); + + private TargetEntity targetEntity; + + public void setTargetService(TargetEntity targetEntity){ + this.targetEntity = targetEntity; + } + + @Override + public void filter(ClientRequestContext clientRequest) { + try{ + MultivaluedMap<String, Object> headers = clientRequest.getHeaders(); + + + Instant instant = Instant.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) + .withLocale( Locale.US ) + .withZone( ZoneId.systemDefault() ); + + String requestId = MDC.get(MsoLogger.REQUEST_ID); + if(requestId == null || requestId.isEmpty()){ + requestId = UUID.randomUUID().toString(); + logger.warnSimple(clientRequest.getUri().getPath(),"Could not Find Request ID Generating New One"); + } + + MDC.put(MsoLogger.METRIC_BEGIN_TIME, formatter.format(instant)); + MDC.put(MsoLogger.METRIC_START_TIME, String.valueOf(System.currentTimeMillis())); + MDC.put(MsoLogger.REQUEST_ID,requestId); + MDC.put(MsoLogger.TARGETSERVICENAME, clientRequest.getUri().toString()); + } catch (Exception e) { + logger.warnSimple("Error in incoming JAX-RS Inteceptor", e); + } + } + + + @Override + public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) { + + try { + Instant instant = Instant.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) + .withLocale( Locale.US ) + .withZone( ZoneId.systemDefault() ); + String startTime= MDC.get(MsoLogger.METRIC_START_TIME); + + long elapsedTime = System.currentTimeMillis()-Long.parseLong(startTime); + String statusCode; + if(Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)){ + statusCode=MsoLogger.COMPLETE; + }else{ + statusCode=MsoLogger.StatusCode.ERROR.toString(); + } + MultivaluedMap<String, String> headers = responseContext.getHeaders(); + + String partnerName = headers.getFirst(MsoLogger.HEADER_FROM_APP_ID ); + if(partnerName == null || partnerName.isEmpty()) + partnerName="UNKNOWN"; + MDC.put(MsoLogger.RESPONSEDESC,getStringFromInputStream(responseContext)); + MDC.put(MsoLogger.STATUSCODE, statusCode); + MDC.put(MsoLogger.RESPONSECODE,String.valueOf(responseContext.getStatus())); + MDC.put(MsoLogger.METRIC_TIMER, String.valueOf(elapsedTime)); + MDC.put(MsoLogger.METRIC_END_TIME,formatter.format(instant)); + MDC.put(MsoLogger.PARTNERNAME,partnerName); + MDC.put(MsoLogger.TARGETENTITY, targetEntity.toString()); + logger.recordMetricEvent(); + } catch ( Exception e) { + logger.warnSimple("Error in outgoing JAX-RS Inteceptor", e); + } + } + + private static String getStringFromInputStream(ClientResponseContext clientResponseContext) { + + InputStream is = clientResponseContext.getEntityStream(); + ByteArrayOutputStream boas = new ByteArrayOutputStream(); + + try { + IOUtils.copy(is,boas); + InputStream copiedStream = new ByteArrayInputStream(boas.toByteArray()); + clientResponseContext.setEntityStream(copiedStream); + return boas.toString(); + + } catch (IOException e) { + logger.warnSimple("Failed to read response body", e); + } + return "Unable to read input stream"; + } +} diff --git a/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/JaxRsFilterLogging.java b/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/JaxRsFilterLogging.java new file mode 100644 index 0000000000..9fab4ff0df --- /dev/null +++ b/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/JaxRsFilterLogging.java @@ -0,0 +1,180 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.logging.jaxrs.filter.jersey; + + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Locale; +import java.util.UUID; + +import javax.annotation.Priority; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.MessageBodyWriter; +import javax.ws.rs.ext.Provider; +import javax.ws.rs.ext.Providers; + +import org.onap.so.logger.MsoLogger; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@Priority(1) +@Provider +@Component +public class JaxRsFilterLogging implements ContainerRequestFilter,ContainerResponseFilter { + + private static MsoLogger logger = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA,JaxRsFilterLogging.class); + + @Context + private HttpServletRequest httpServletRequest; + + @Context + private Providers providers; + + @Autowired + ObjectMapper objectMapper; + + @Override + public void filter(ContainerRequestContext containerRequest) { + + try { + String clientID = null; + //check headers for request id + MultivaluedMap<String, String> headers = containerRequest.getHeaders(); + String requestId = (String) headers.getFirst(MsoLogger.HEADER_REQUEST_ID ); + if(requestId == null || requestId.isEmpty()){ + if(headers.containsKey(MsoLogger.TRANSACTION_ID)){ + requestId = headers.getFirst(MsoLogger.TRANSACTION_ID); + }else if(headers.containsKey(MsoLogger.ECOMP_REQUEST_ID)){ + requestId = headers.getFirst(MsoLogger.ECOMP_REQUEST_ID); + }else{ + requestId = UUID.randomUUID().toString(); + logger.warnSimple(containerRequest.getUriInfo().getPath(),"Generating RequestId for Request"); + } + } + containerRequest.setProperty("requestId", requestId); + if(headers.containsKey(MsoLogger.CLIENT_ID)){ + clientID = headers.getFirst(MsoLogger.CLIENT_ID); + }else{ + clientID = "UNKNOWN"; + headers.add(MsoLogger.CLIENT_ID, clientID); + } + String remoteIpAddress = ""; + if (httpServletRequest != null) { + remoteIpAddress = httpServletRequest.getRemoteAddr(); + } + Instant instant = Instant.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) + .withLocale( Locale.US ) + .withZone( ZoneId.systemDefault() ); + + String partnerName = headers.getFirst(MsoLogger.HEADER_FROM_APP_ID ); + if(partnerName == null || partnerName.isEmpty()) + partnerName="UNKNOWN"; + + MDC.put(MsoLogger.FROM_APP_ID,partnerName); + MDC.put(MsoLogger.SERVICE_NAME, containerRequest.getUriInfo().getPath()); + MDC.put(MsoLogger.BEGINTIME, formatter.format(instant)); + MDC.put(MsoLogger.REQUEST_ID,requestId); + MDC.put(MsoLogger.PARTNERNAME,partnerName); + MDC.put(MsoLogger.REMOTE_HOST, String.valueOf(remoteIpAddress)); + MDC.put(MsoLogger.STARTTIME, String.valueOf(System.currentTimeMillis())); + MDC.put(MsoLogger.CLIENT_ID, clientID); + } catch (Exception e) { + logger.warnSimple("Error in incoming JAX-RS Inteceptor", e); + } + } + + + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) + throws IOException { + try { + Instant instant = Instant.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX" ) + .withLocale( Locale.US ) + .withZone( ZoneId.systemDefault() ); + String startTime= MDC.get(MsoLogger.STARTTIME); + long elapsedTime; + try { + elapsedTime = System.currentTimeMillis() - Long.parseLong(startTime); + }catch(NumberFormatException e){ + elapsedTime = 0; + } + String statusCode; + if(Response.Status.Family.familyOf(responseContext.getStatus()).equals(Response.Status.Family.SUCCESSFUL)){ + statusCode=MsoLogger.COMPLETE; + }else{ + statusCode= MsoLogger.StatusCode.ERROR.toString(); + } + + MDC.put(MsoLogger.RESPONSEDESC,payloadMessage(responseContext)); + MDC.put(MsoLogger.STATUSCODE, statusCode); + MDC.put(MsoLogger.RESPONSECODE,String.valueOf(responseContext.getStatus())); + MDC.put(MsoLogger.TIMER, String.valueOf(elapsedTime)); + MDC.put(MsoLogger.ENDTIME,formatter.format(instant)); + logger.recordAuditEvent(); + } catch ( Exception e) { + logger.warnSimple("Error in outgoing JAX-RS Inteceptor", e); + } + } + + private String payloadMessage(ContainerResponseContext responseContext) throws IOException { + String message = new String(); + if (responseContext.hasEntity()) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + Class<?> entityClass = responseContext.getEntityClass(); + Type entityType = responseContext.getEntityType(); + Annotation[] entityAnnotations = responseContext.getEntityAnnotations(); + MediaType mediaType = responseContext.getMediaType(); + @SuppressWarnings("unchecked") + MessageBodyWriter<Object> bodyWriter = (MessageBodyWriter<Object>) providers.getMessageBodyWriter(entityClass, + entityType, + entityAnnotations, + mediaType); + bodyWriter.writeTo(responseContext.getEntity(), + entityClass, + entityType, + entityAnnotations, + mediaType, + responseContext.getHeaders(), + baos); + message = message.concat(new String(baos.toByteArray())); + } + return message; + } +} diff --git a/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/SpringClientFilter.java b/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/SpringClientFilter.java new file mode 100644 index 0000000000..0477c9a429 --- /dev/null +++ b/common/src/main/java/org/onap/so/logging/jaxrs/filter/jersey/SpringClientFilter.java @@ -0,0 +1,67 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.logging.jaxrs.filter.jersey; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.StreamUtils; + +import java.io.IOException; +import java.nio.charset.Charset; + +public class SpringClientFilter implements ClientHttpRequestInterceptor { + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + logRequest(request, body); + ClientHttpResponse response = execution.execute(request, body); + logResponse(response); + return response; + } + + private void logRequest(HttpRequest request, byte[] body) throws IOException { + if (log.isDebugEnabled()) { + log.debug("===========================request begin================================================"); + log.debug("URI : {}", request.getURI()); + log.debug("Method : {}", request.getMethod()); + log.debug("Headers : {}", request.getHeaders()); + log.debug("Request body: {}", new String(body, "UTF-8")); + log.debug("==========================request end================================================"); + } + } + + private void logResponse(ClientHttpResponse response) throws IOException { + if (log.isDebugEnabled()) { + log.debug("============================response begin=========================================="); + log.debug("Status code : {}", response.getStatusCode()); + log.debug("Status text : {}", response.getStatusText()); + log.debug("Headers : {}", response.getHeaders()); + log.debug("Response body: {}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset())); + log.debug("=======================response end================================================="); + } + } +} diff --git a/common/src/main/java/org/onap/so/openpojo/rules/CustomSetterMustExistRule.java b/common/src/main/java/org/onap/so/openpojo/rules/CustomSetterMustExistRule.java new file mode 100644 index 0000000000..2c6590afb3 --- /dev/null +++ b/common/src/main/java/org/onap/so/openpojo/rules/CustomSetterMustExistRule.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.openpojo.rules; + +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.anything; +import static org.hamcrest.CoreMatchers.not; + +import org.hamcrest.Matcher; + +import com.openpojo.reflection.PojoClass; +import com.openpojo.reflection.PojoField; +import com.openpojo.validation.affirm.Affirm; +import com.openpojo.validation.rule.Rule; + +public class CustomSetterMustExistRule implements Rule { + + private Matcher[] excludeMatchers = new Matcher[]{not(anything())}; + private Matcher<PojoField>[] includeMatchers = new Matcher[]{anything()}; + public CustomSetterMustExistRule() { + } + @Override + public void evaluate(final PojoClass pojoClass) { + for (PojoField fieldEntry : pojoClass.getPojoFields()) { + if (!anyOf(excludeMatchers).matches(fieldEntry) && anyOf(includeMatchers).matches(fieldEntry) && !fieldEntry.isFinal() && !fieldEntry.hasSetter()) { + Affirm.fail(String.format("[%s] is missing a setter", fieldEntry)); + } + } + } + public CustomSetterMustExistRule exclude(Matcher... excludeMatchers) { + this.excludeMatchers = excludeMatchers; + return this; + } + + public CustomSetterMustExistRule include(Matcher<PojoField>... includeMatchers) { + this.includeMatchers = includeMatchers; + return this; + } + +} diff --git a/common/src/main/java/org/onap/so/openpojo/rules/EqualsAndHashCodeTester.java b/common/src/main/java/org/onap/so/openpojo/rules/EqualsAndHashCodeTester.java new file mode 100644 index 0000000000..5433681b83 --- /dev/null +++ b/common/src/main/java/org/onap/so/openpojo/rules/EqualsAndHashCodeTester.java @@ -0,0 +1,128 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.openpojo.rules; + +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.anything; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +import org.hamcrest.Matcher; + +import com.openpojo.business.annotation.BusinessKey; +import com.openpojo.random.RandomFactory; +import com.openpojo.reflection.PojoClass; +import com.openpojo.reflection.PojoField; +import com.openpojo.validation.affirm.Affirm; +import com.openpojo.validation.test.Tester; +import com.openpojo.validation.utils.ValidationHelper; + +public class EqualsAndHashCodeTester implements Tester { + + + private final Matcher m; + private boolean onlyDeclaredMethods = false; + public EqualsAndHashCodeTester() { + m = anything(); + } + + public EqualsAndHashCodeTester(Matcher m) { + this.m = m; + } + + public EqualsAndHashCodeTester onlyDeclaredMethods() { + this.onlyDeclaredMethods = true; + return this; + } + @Override + public void run(PojoClass pojoClass) { + Class<?> clazz = pojoClass.getClazz(); + if (anyOf(m).matches(clazz)) { + final Object classInstanceOne = ValidationHelper.getBasicInstance(pojoClass); + final Object classInstanceTwo = ValidationHelper.getBasicInstance(pojoClass); + if (onlyDeclaredMethods) { + Method[] methods = classInstanceOne.getClass().getDeclaredMethods(); + boolean hasEquals = false; + boolean hasHashcode = false; + for (Method method : methods) { + if (method.getName().equals("equals")) { + hasEquals = true; + } else if (method.getName().equals("hashCode")) { + hasHashcode = true; + } + } + + if (!(hasEquals && hasHashcode)) { + return; + } + } + Set<PojoField> identityFields = hasIdOrBusinessKey(pojoClass); + List<PojoField> otherFields = new ArrayList<>(pojoClass.getPojoFields()); + otherFields.removeAll(identityFields); + + for (PojoField field : identityFields) { + final Object value = RandomFactory.getRandomValue(field); + + field.invokeSetter(classInstanceOne, value); + field.invokeSetter(classInstanceTwo, value); + } + + for (PojoField field : otherFields) { + if (field.hasSetter()) { + final Object valueOne = RandomFactory.getRandomValue(field); + final Object valueTwo = RandomFactory.getRandomValue(field); + + field.invokeSetter(classInstanceOne, valueOne); + field.invokeSetter(classInstanceTwo, valueTwo); + } + } + + Affirm.affirmTrue("Equals test failed for [" + classInstanceOne.getClass().getName() + "]", classInstanceOne.equals(classInstanceTwo)); + + Affirm.affirmTrue("Equals test failed for [" + classInstanceOne.getClass().getName() + "]", classInstanceOne.equals( + classInstanceOne)); + + Affirm.affirmTrue("HashCode test failed for [" + classInstanceOne.getClass().getName() + "]", classInstanceOne.hashCode() == classInstanceTwo.hashCode()); + + Affirm.affirmFalse("Expected false for comparison of two unlike objects", classInstanceOne.equals("test")); + } + } + + + private Set<PojoField> hasIdOrBusinessKey(PojoClass pojoClass) { + final Set<PojoField> fields = new HashSet<>(); + + fields.addAll(pojoClass.getPojoFieldsAnnotatedWith(BusinessKey.class)); + fields.addAll(pojoClass.getPojoFieldsAnnotatedWith(Id.class)); + fields.removeAll(pojoClass.getPojoFieldsAnnotatedWith(GeneratedValue.class)); + + return fields; + + } + +} diff --git a/common/src/main/java/org/onap/so/openpojo/rules/HasAnnotationMatcher.java b/common/src/main/java/org/onap/so/openpojo/rules/HasAnnotationMatcher.java new file mode 100644 index 0000000000..6a06834d87 --- /dev/null +++ b/common/src/main/java/org/onap/so/openpojo/rules/HasAnnotationMatcher.java @@ -0,0 +1,71 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.openpojo.rules; + +import static org.hamcrest.CoreMatchers.anything; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedElement; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeDiagnosingMatcher; + +import com.openpojo.reflection.PojoField; + +public class HasAnnotationMatcher<T extends PojoField> extends TypeSafeDiagnosingMatcher<T> { + private final Class<? extends Annotation> annotationType; + private final Matcher<? super T> annotationMatcher; + + public HasAnnotationMatcher(final Class<? extends Annotation> annotationType, final Matcher<? super T> annotationMatcher) { + this.annotationType = annotationType; + this.annotationMatcher = annotationMatcher; + } + + @Override + protected boolean matchesSafely(final PojoField item, final Description mismatchDescription) { + final Annotation annotation = item.getAnnotation(this.annotationType); + if (annotation == null) { + mismatchDescription.appendText("does not have annotation ").appendText(this.annotationType.getName()); + return false; + } + + if (!this.annotationMatcher.matches(annotation)) { + this.annotationMatcher.describeMismatch(annotation, mismatchDescription); + return false; + } + + return true; + } + + @Override + public void describeTo(final Description description) { + // Intentionally left blank. + } + + public static <T extends PojoField> Matcher<T> hasAnnotation(final Class<? extends Annotation> annotationType) { + return hasAnnotation(annotationType, anything("")); + } + + public static <T extends PojoField> Matcher<T> hasAnnotation(final Class<? extends Annotation> annotationType, final Matcher<? super T> annotationMatcher) { + return new HasAnnotationMatcher<T>(annotationType, annotationMatcher); + } +} diff --git a/common/src/main/java/org/onap/so/openpojo/rules/HasAnnotationPropertyWithValueMatcher.java b/common/src/main/java/org/onap/so/openpojo/rules/HasAnnotationPropertyWithValueMatcher.java new file mode 100644 index 0000000000..551305c14a --- /dev/null +++ b/common/src/main/java/org/onap/so/openpojo/rules/HasAnnotationPropertyWithValueMatcher.java @@ -0,0 +1,78 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.openpojo.rules; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeDiagnosingMatcher; +import org.onap.so.logger.MsoLogger; + +import com.openpojo.reflection.PojoField; + +public class HasAnnotationPropertyWithValueMatcher<T extends PojoField> extends TypeSafeDiagnosingMatcher<T> { + private MsoLogger logger=MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL, HasAnnotationPropertyWithValueMatcher.class); + private final String attribute; + private final Matcher<?> annotationMatcher; + private final Class<? extends Annotation> annotationClass; + public HasAnnotationPropertyWithValueMatcher(Class<? extends Annotation> clazz, String attribute, final Matcher<?> annotationMatcher) { + this.attribute = attribute; + this.annotationMatcher = annotationMatcher; + this.annotationClass = clazz; + } + + @Override + protected boolean matchesSafely(T obj, final Description mismatchDescription) { + final PojoField temp = (PojoField)obj; + final Method method; + try { + Annotation a = temp.getAnnotation(this.annotationClass); + if (a == null) { + mismatchDescription.appendText("does not have annotation ").appendText(this.annotationClass.getSimpleName()); + return false; + } + method = a.getClass().getMethod(attribute); + final Object result = method.invoke(a); + if (!this.annotationMatcher.matches(result)) { + this.annotationMatcher.describeMismatch(result, mismatchDescription); + return false; + } + } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + mismatchDescription.appendText("does not have property ").appendText(attribute); + logger.debug("Error occured", e); + return false; + } + return true; + } + + @Override + public void describeTo(final Description description) { + // Intentionally left blank. + } + + public static <T extends PojoField> Matcher<T> hasAnnotationPropertyWithValue(Class<? extends Annotation> clazz, String attribute, final Matcher<?> annotationMatcher) { + return new HasAnnotationPropertyWithValueMatcher<T>(clazz, attribute, annotationMatcher); + } +} diff --git a/common/src/main/java/org/onap/so/openpojo/rules/HasEqualsAndHashCodeRule.java b/common/src/main/java/org/onap/so/openpojo/rules/HasEqualsAndHashCodeRule.java new file mode 100644 index 0000000000..0c7d6add73 --- /dev/null +++ b/common/src/main/java/org/onap/so/openpojo/rules/HasEqualsAndHashCodeRule.java @@ -0,0 +1,81 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.openpojo.rules; + +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.anything; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; + +import org.hamcrest.Matcher; + +import com.openpojo.reflection.PojoClass; +import com.openpojo.validation.affirm.Affirm; +import com.openpojo.validation.rule.Rule; + +/** + * This rule ensures that classes have overriden the default equals and hashCode methods from Object + */ +public class HasEqualsAndHashCodeRule implements Rule { + + private final Matcher m; + public HasEqualsAndHashCodeRule() { + m = anything(); + } + + public HasEqualsAndHashCodeRule(Matcher m) { + this.m = m; + } + @Override + public void evaluate(PojoClass pojoClass) { + Class<?> clazz = pojoClass.getClazz(); + if (anyOf(m).matches(clazz)) { + boolean hasEquals = false; + boolean hasHashCode = false; + final String name = clazz.getSimpleName(); + final Method[] methods; + if (clazz.getSuperclass().equals(Object.class)) { + methods = clazz.getDeclaredMethods(); + } else { + methods = clazz.getMethods(); + } + for (Method method : methods) { + Parameter[] parameters = method.getParameters(); + if ("equals".equals(method.getName()) && boolean.class.equals(method.getReturnType()) && parameters.length == 1 && Object.class.equals(parameters[0].getType())) { + hasEquals = true; + } else if ("hashCode".equals(method.getName()) && int.class.equals(method.getReturnType())) { + hasHashCode = true; + } + } + + if (!hasEquals) { + Affirm.fail(String.format( + "[%s] does not override equals", name)); + } + if (!hasHashCode) { + Affirm.fail(String.format( + "[%s] does not override hashCode", name)); + } + } + } + +} diff --git a/common/src/main/java/org/onap/so/openpojo/rules/HasToStringRule.java b/common/src/main/java/org/onap/so/openpojo/rules/HasToStringRule.java new file mode 100644 index 0000000000..8a4333e0e2 --- /dev/null +++ b/common/src/main/java/org/onap/so/openpojo/rules/HasToStringRule.java @@ -0,0 +1,72 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.openpojo.rules; + +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.anything; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; + +import org.hamcrest.Matcher; + +import com.openpojo.reflection.PojoClass; +import com.openpojo.validation.affirm.Affirm; +import com.openpojo.validation.rule.Rule; + +public class HasToStringRule implements Rule { + + private final Matcher m; + public HasToStringRule() { + m = anything(); + } + + public HasToStringRule(Matcher m) { + this.m = m; + } + @Override + public void evaluate(PojoClass pojoClass) { + Class<?> clazz = pojoClass.getClazz(); + if (anyOf(m).matches(clazz)) { + boolean hasToString = false; + final String name = clazz.getSimpleName(); + final Method[] methods; + if (clazz.getSuperclass().equals(Object.class)) { + methods = clazz.getDeclaredMethods(); + } else { + methods = clazz.getMethods(); + } + for (Method method : methods) { + Parameter[] parameters = method.getParameters(); + if ("toString".equals(method.getName()) && String.class.equals(method.getReturnType()) && parameters.length == 0) { + hasToString = true; + break; + } + } + + if (!hasToString) { + Affirm.fail(String.format( + "[%s] does not override toString", name)); + } + } + } + +} diff --git a/common/src/main/java/org/onap/so/openpojo/rules/ToStringTester.java b/common/src/main/java/org/onap/so/openpojo/rules/ToStringTester.java new file mode 100644 index 0000000000..ff1a139768 --- /dev/null +++ b/common/src/main/java/org/onap/so/openpojo/rules/ToStringTester.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.openpojo.rules; + +import static org.hamcrest.CoreMatchers.anyOf; +import static org.hamcrest.CoreMatchers.anything; + +import org.hamcrest.Matcher; + +import com.openpojo.reflection.PojoClass; +import com.openpojo.validation.affirm.Affirm; +import com.openpojo.validation.test.Tester; +import com.openpojo.validation.utils.ValidationHelper; + +public class ToStringTester implements Tester { + + private final Matcher m; + public ToStringTester() { + m = anything(); + } + + public ToStringTester(Matcher m) { + this.m = m; + } + + @Override + public void run(PojoClass pojoClass) { + Class<?> clazz = pojoClass.getClazz(); + if (anyOf(m).matches(clazz)) { + final Object classInstance = ValidationHelper.getBasicInstance(pojoClass); + + Affirm.affirmFalse("Found default toString output", classInstance.toString().matches(Object.class.getName() + "@" + "\\w+")); + } + + } + +} diff --git a/common/src/main/java/org/onap/so/properties/MsoDatabaseException.java b/common/src/main/java/org/onap/so/properties/MsoDatabaseException.java new file mode 100644 index 0000000000..84216af6e8 --- /dev/null +++ b/common/src/main/java/org/onap/so/properties/MsoDatabaseException.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.properties; + + +/** + * Exception during artifact installation. + */ +public class MsoDatabaseException extends RuntimeException { + + /** + * + */ + private static final long serialVersionUID = -7048331652191419371L; + + /** + * @param message The message to dump + * @param cause The Throwable cause object + */ + public MsoDatabaseException (final String message) { + super (message); + + } + + /** + * @param message The message to dump + * @param cause The Throwable cause object + */ + public MsoDatabaseException (final String message, final Throwable cause) { + super (message, cause); + + } +} diff --git a/common/src/main/java/org/onap/so/security/MSOSpringFirewall.java b/common/src/main/java/org/onap/so/security/MSOSpringFirewall.java new file mode 100644 index 0000000000..82a30f05be --- /dev/null +++ b/common/src/main/java/org/onap/so/security/MSOSpringFirewall.java @@ -0,0 +1,34 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.security; + +import org.springframework.security.web.firewall.StrictHttpFirewall; + +public class MSOSpringFirewall extends StrictHttpFirewall { + + + public MSOSpringFirewall() { + super(); + this.setAllowUrlEncodedSlash(true); + this.setAllowSemicolon(true); + this.setAllowUrlEncodedPercent(true); + } +} diff --git a/common/src/main/java/org/onap/so/security/UserCredentials.java b/common/src/main/java/org/onap/so/security/UserCredentials.java new file mode 100644 index 0000000000..f411789e00 --- /dev/null +++ b/common/src/main/java/org/onap/so/security/UserCredentials.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.security; + +public class UserCredentials { + + private String username; + private String password; + private String role; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + +} diff --git a/common/src/main/java/org/onap/so/security/UserDetailsServiceImpl.java b/common/src/main/java/org/onap/so/security/UserDetailsServiceImpl.java new file mode 100644 index 0000000000..90d484ebf4 --- /dev/null +++ b/common/src/main/java/org/onap/so/security/UserDetailsServiceImpl.java @@ -0,0 +1,56 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.security; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import java.util.List; + +@ConfigurationProperties(prefix = "spring.security") +public class UserDetailsServiceImpl implements UserDetailsService { + + private List<UserCredentials> usercredentials; + + public List<UserCredentials> getUsercredentials() { + return usercredentials; + } + + public void setUsercredentials(List<UserCredentials> usercredentials) { + this.usercredentials = usercredentials; + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + + for (int i = 0; usercredentials != null && i < usercredentials.size(); i++) { + if (usercredentials.get(i).getUsername().equals(username)) { + return User.withUsername(username).password(usercredentials.get(i).getPassword()) + .roles(usercredentials.get(i).getRole()).build(); + } + } + + throw new UsernameNotFoundException("User not found, username: " + username); + } + +} diff --git a/common/src/main/java/org/onap/so/security/WebSecurityConfig.java b/common/src/main/java/org/onap/so/security/WebSecurityConfig.java new file mode 100644 index 0000000000..11eec46f41 --- /dev/null +++ b/common/src/main/java/org/onap/so/security/WebSecurityConfig.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.security; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + + +@ConfigurationProperties(prefix = "spring.security") +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + private List<UserCredentials> credentials; + private List<String> roles = new ArrayList<>(); + + public List<String> getRoles() { + return roles; + } + + @PostConstruct + private void addRoles() { + for(int i=0; i <credentials.size(); i++) { + roles.add(credentials.get(i).getRole()); + } + } + + public List<UserCredentials> getUsercredentials() { + return credentials; + } + + public void setUsercredentials(List<UserCredentials> usercredentials) { + this.credentials = usercredentials; + } + + @Bean + public UserDetailsService userDetailsService() { + return new UserDetailsServiceImpl(); + } + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder()); + } + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/CloudConfiguration.java b/common/src/main/java/org/onap/so/serviceinstancebeans/CloudConfiguration.java new file mode 100644 index 0000000000..a58949e498 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/CloudConfiguration.java @@ -0,0 +1,106 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "cloudConfiguration") +@JsonInclude(Include.NON_DEFAULT) +public class CloudConfiguration implements Serializable { + + private static final long serialVersionUID = 6260165690180745471L; + @JsonProperty("aicNodeClli") + protected String aicNodeClli; + @JsonProperty("tenantId") + protected String tenantId; + @JsonProperty("lcpCloudRegionId") + protected String lcpCloudRegionId; + + /** + * Gets the value of the aicNodeClli property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getAicNodeClli() { + return aicNodeClli; + } + + /** + * Sets the value of the aicNodeClli property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setAicNodeClli(String value) { + this.aicNodeClli = value; + } + + /** + * Gets the value of the tenantId property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTenantId() { + return tenantId; + } + + /** + * Sets the value of the tenantId property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTenantId(String value) { + this.tenantId = value; + } + + + public String getLcpCloudRegionId() { + return lcpCloudRegionId; + } + + public void setLcpCloudRegionId(String lcpCloudRegionId) { + this.lcpCloudRegionId = lcpCloudRegionId; + } + + @Override + public String toString() { + return "CloudConfiguration [aicNodeClli=" + aicNodeClli + ", tenantId=" + + tenantId + ", lcpCloudRegionId=" + lcpCloudRegionId + "]"; + } + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ExceptionType.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ExceptionType.java new file mode 100644 index 0000000000..e5d586f165 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ExceptionType.java @@ -0,0 +1,168 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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========================================================= + */ + +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 +// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2016.05.03 at 03:56:30 PM CDT +// + + +package org.onap.so.serviceinstancebeans; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlSeeAlso; +import javax.xml.bind.annotation.XmlType; + +import org.apache.commons.lang3.builder.ToStringBuilder; + + +/** + * <p>Java class for exceptionType complex type. + * + * <p>The following schema fragment specifies the expected content contained within this class. + * + * <pre> + * <complexType name="exceptionType"> + * <complexContent> + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> + * <sequence> + * <element name="messageId" type="{http://www.w3.org/2001/XMLSchema}string"/> + * <element name="text" type="{http://www.w3.org/2001/XMLSchema}string"/> + * <element name="variables" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="50" minOccurs="0"/> + * </sequence> + * </restriction> + * </complexContent> + * </complexType> + * </pre> + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "exceptionType", propOrder = { + "messageId", + "text", + "variables" +}) +@XmlSeeAlso({ + ServiceException.class, + PolicyException.class +}) +public class ExceptionType { + + @XmlElement(required = true) + protected String messageId; + @XmlElement(required = true) + protected String text; + protected List<String> variables; + + /** + * Gets the value of the messageId property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getMessageId() { + return messageId; + } + + /** + * Sets the value of the messageId property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setMessageId(String value) { + this.messageId = value; + } + + /** + * Gets the value of the text property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getText() { + return text; + } + + /** + * Sets the value of the text property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setText(String value) { + this.text = value; + } + + /** + * Gets the value of the variables property. + * + * <p> + * This accessor method returns a reference to the live list, + * not a snapshot. Therefore any modification you make to the + * returned list will be present inside the JAXB object. + * This is why there is not a <CODE>set</CODE> method for the variables property. + * + * <p> + * For example, to add a new item, do as follows: + * <pre> + * getVariables().add(newItem); + * </pre> + * + * + * <p> + * Objects of the following type(s) are allowed in the list + * {@link String } + * + * + */ + public List<String> getVariables() { + if (variables == null) { + variables = new ArrayList<>(); + } + return this.variables; + } + + public void setVariables(List<String> variables) { + this.variables = variables; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("messageId", messageId).append("text", text) + .append("variables", variables).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/GetOrchestrationListResponse.java b/common/src/main/java/org/onap/so/serviceinstancebeans/GetOrchestrationListResponse.java new file mode 100644 index 0000000000..7be03e635f --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/GetOrchestrationListResponse.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * OPENECOMP - MSO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonInclude(Include.NON_DEFAULT) +public class GetOrchestrationListResponse { + + protected List<RequestList> requestList; + + public List<RequestList> getRequestList() { + return requestList; + } + + public void setRequestList(List<RequestList> requestList) { + this.requestList = requestList; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("requestList", requestList).toString(); + } + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/GetOrchestrationResponse.java b/common/src/main/java/org/onap/so/serviceinstancebeans/GetOrchestrationResponse.java new file mode 100644 index 0000000000..788cdd973d --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/GetOrchestrationResponse.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +@JsonInclude(Include.NON_DEFAULT) +public class GetOrchestrationResponse { + + protected Request request; + + public Request getRequest() { + return request; + } + + public void setRequest(Request request) { + this.request = request; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("request", request).toString(); + } + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/InstanceDirection.java b/common/src/main/java/org/onap/so/serviceinstancebeans/InstanceDirection.java new file mode 100644 index 0000000000..ad796b21f9 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/InstanceDirection.java @@ -0,0 +1,35 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +public enum InstanceDirection { + + source, + destination; + + public String value() { + return name(); + } + + public static InstanceDirection fromValue(String v) { + return valueOf(v); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/InstanceReferences.java b/common/src/main/java/org/onap/so/serviceinstancebeans/InstanceReferences.java new file mode 100644 index 0000000000..69d21c41ac --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/InstanceReferences.java @@ -0,0 +1,123 @@ +/*- + * ============LICENSE_START======================================================= + * OPENECOMP - MSO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +@JsonInclude(Include.NON_DEFAULT) +public class InstanceReferences { + + protected String serviceInstanceId; + protected String serviceInstanceName; + protected String vnfInstanceId; + protected String vnfInstanceName; + protected String vfModuleInstanceId; + protected String vfModuleInstanceName; + protected String volumeGroupInstanceId; + protected String volumeGroupInstanceName; + protected String networkInstanceId; + protected String networkInstanceName; + protected String requestorId; + + + public String getServiceInstanceId() { + return serviceInstanceId; + } + public void setServiceInstanceId(String serviceInstanceId) { + this.serviceInstanceId = serviceInstanceId; + } + public String getServiceInstanceName() { + return serviceInstanceName; + } + public void setServiceInstanceName(String serviceInstanceName) { + this.serviceInstanceName = serviceInstanceName; + } + public String getVnfInstanceId() { + return vnfInstanceId; + } + public void setVnfInstanceId(String vnfInstanceId) { + this.vnfInstanceId = vnfInstanceId; + } + public String getVnfInstanceName() { + return vnfInstanceName; + } + public void setVnfInstanceName(String vnfInstanceName) { + this.vnfInstanceName = vnfInstanceName; + } + public String getVfModuleInstanceId() { + return vfModuleInstanceId; + } + public void setVfModuleInstanceId(String vfModuleInstanceId) { + this.vfModuleInstanceId = vfModuleInstanceId; + } + public String getVfModuleInstanceName() { + return vfModuleInstanceName; + } + public void setVfModuleInstanceName(String vfModuleInstanceName) { + this.vfModuleInstanceName = vfModuleInstanceName; + } + public String getVolumeGroupInstanceId() { + return volumeGroupInstanceId; + } + public void setVolumeGroupInstanceId(String volumeGroupInstanceId) { + this.volumeGroupInstanceId = volumeGroupInstanceId; + } + public String getVolumeGroupInstanceName() { + return volumeGroupInstanceName; + } + public void setVolumeGroupInstanceName(String volumeGroupInstanceName) { + this.volumeGroupInstanceName = volumeGroupInstanceName; + } + public String getNetworkInstanceId() { + return networkInstanceId; + } + public void setNetworkInstanceId(String networkInstanceId) { + this.networkInstanceId = networkInstanceId; + } + public String getNetworkInstanceName() { + return networkInstanceName; + } + public void setNetworkInstanceName(String networkInstanceName) { + this.networkInstanceName = networkInstanceName; + } + + public String getRequestorId() { + return requestorId; + } + + public void setRequestorId(String requestorId) { + this.requestorId = requestorId; + } + @Override + public String toString() { + return new ToStringBuilder(this).append("serviceInstanceId", serviceInstanceId) + .append("serviceInstanceName", serviceInstanceName).append("vnfInstanceId", vnfInstanceId) + .append("vnfInstanceName", vnfInstanceName).append("vfModuleInstanceId", vfModuleInstanceId) + .append("vfModuleInstanceName", vfModuleInstanceName) + .append("volumeGroupInstanceId", volumeGroupInstanceId) + .append("volumeGroupInstanceName", volumeGroupInstanceName) + .append("networkInstanceId", networkInstanceId).append("networkInstanceName", networkInstanceName) + .append("requestorId", requestorId).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/LineOfBusiness.java b/common/src/main/java/org/onap/so/serviceinstancebeans/LineOfBusiness.java new file mode 100644 index 0000000000..27bc0e84a4 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/LineOfBusiness.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonRootName(value = "lineOfBusiness") +@JsonInclude(Include.NON_DEFAULT) +public class LineOfBusiness implements Serializable { + + private static final long serialVersionUID = -8574860788160041209L; + @JsonProperty("lineOfBusinessName") + private String lineOfBusinessName; + + public String getLineOfBusinessName(){ + return lineOfBusinessName; + } + public void setLineOfBusinessName(String value){ + this.lineOfBusinessName = value; + } + @Override + public String toString() { + return new ToStringBuilder(this).append("lineOfBusinessName", lineOfBusinessName).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ModelInfo.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ModelInfo.java new file mode 100644 index 0000000000..6976fb6791 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ModelInfo.java @@ -0,0 +1,169 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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========================================================= + */ + +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 +// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2016.03.30 at 02:48:23 PM CDT +// + + +package org.onap.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "modelInfo") +@JsonInclude(Include.NON_DEFAULT) +public class ModelInfo implements Serializable { + + private static final long serialVersionUID = 5281763573935476852L; + @JsonProperty("modelCustomizationName") + protected String modelCustomizationName; + @JsonProperty("modelInvariantId") + protected String modelInvariantId; + @JsonProperty("modelType") + protected ModelType modelType; + @JsonProperty("modelId") + protected String modelId; + //v2 + @JsonProperty("modelNameVersionId") + protected String modelNameVersionId; + @JsonProperty("modelName") + protected String modelName; + @JsonProperty("modelVersion") + protected String modelVersion; + @JsonProperty("modelCustomizationUuid") + protected String modelCustomizationUuid; + //v3 + @JsonProperty("modelVersionId") + protected String modelVersionId; + @JsonProperty("modelCustomizationId") + protected String modelCustomizationId; + + //Decomposition fields + @JsonProperty("modelUuid") + protected String modelUuid; + @JsonProperty("modelInvariantUuid") + protected String modelInvariantUuid; + @JsonProperty("modelInstanceName") + protected String modelInstanceName; + + public String getModelCustomizationName() { + return modelCustomizationName; + } + public void setModelCustomizationName(String modelCustomizationName) { + modelInstanceName = modelCustomizationName; + this.modelCustomizationName = modelCustomizationName; + } + public String getModelNameVersionId() { + return modelNameVersionId; + } + public void setModelNameVersionId(String modelNameVersionId) { + this.modelNameVersionId = modelNameVersionId; + } + public String getModelName() { + return modelName; + } + public void setModelName(String modelName) { + this.modelName = modelName; + } + public String getModelVersion() { + return modelVersion; + } + public void setModelVersion(String modelVersion) { + this.modelVersion = modelVersion; + } + public ModelType getModelType() { + return modelType; + } + public void setModelType(ModelType modelType) { + this.modelType = modelType; + } + public String getModelInvariantId() { + return modelInvariantId; + } + public void setModelInvariantId(String modelInvariantId) { + this.modelInvariantUuid = modelInvariantId; + this.modelInvariantId = modelInvariantId; + } + public String getModelCustomizationUuid() { + return modelCustomizationUuid; + } + public void setModelCustomizationUuid(String modelCustomizationUuid) { + this.modelCustomizationUuid = modelCustomizationUuid; + } + public String getModelVersionId() { + return modelVersionId; + } + public void setModelVersionId(String modelVersionId) { + this.modelUuid=modelVersionId; + this.modelVersionId = modelVersionId; + } + public String getModelCustomizationId() { + return modelCustomizationId; + } + public void setModelCustomizationId(String modelCustomizationId) { + this.modelCustomizationUuid = modelCustomizationId; + this.modelCustomizationId = modelCustomizationId; + } + public String getModelUuid() { + return modelUuid; + } + public String getModelId() { + return modelId; + } + public void setModelUuid(String modelUuid) { + this.modelId = modelUuid; + this.modelUuid = modelUuid; + + } + public void setModelId(String modelId) { + this.modelId = modelId; + } + public String getModelInvariantUuid() { + return modelInvariantUuid; + } + public void setModelInvariantUuid(String modelInvariantUuid) { + this.modelInvariantUuid = modelInvariantUuid; + } + public String getModelInstanceName() { + return modelInstanceName; + } + public void setModelInstanceName(String modelInstanceName) { + this.modelInstanceName = modelInstanceName; + } + @Override + public String toString() { + return "ModelInfo [modelCustomizationName=" + modelCustomizationName + ", modelInvariantId=" + modelInvariantId + + ", modelType=" + modelType + ", modelNameVersionId=" + modelNameVersionId + ", modelName=" + modelName + + ", modelVersion=" + modelVersion + ", modelCustomizationUuid=" + modelCustomizationUuid + + ", modelVersionId=" + modelVersionId + ", modelCustomizationId=" + modelCustomizationId + + ", modelUuid=" + modelUuid + ", modelInvariantUuid=" + modelInvariantUuid + ", modelInstanceName=" + + modelInstanceName + "]"; + } + + +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java new file mode 100644 index 0000000000..2ddad20346 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ModelType.java @@ -0,0 +1,36 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +/* + * Enum for Model Type values returned by API Handler to BPMN +*/ +public enum ModelType { + service, + vnf, + vfModule, + volumeGroup, + network, + configuration, + connectionPoint, + pnf, + networkCollection +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java new file mode 100644 index 0000000000..386078a60b --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Networks.java @@ -0,0 +1,98 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.so.serviceinstancebeans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +@JsonRootName(value = "networks") +@JsonInclude(Include.NON_DEFAULT) +public class Networks implements Serializable{ + + private static final long serialVersionUID = 8081495240474276501L; + @JsonProperty("modelInfo") + protected ModelInfo modelInfo; + @JsonProperty("cloudConfiguration") + protected CloudConfiguration cloudConfiguration; + @JsonProperty("instanceName") + protected String instanceName; + @JsonProperty("productFamilyId") + protected String productFamilyId; + @JsonProperty("instanceParams") + private List<Map<String, String>> instanceParams = new ArrayList<>(); + + public ModelInfo getModelInfo() { + return modelInfo; + } + + public void setModelInfo(ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + + public CloudConfiguration getCloudConfiguration() { + return cloudConfiguration; + } + + public void setCloudConfiguration(CloudConfiguration cloudConfiguration) { + this.cloudConfiguration = cloudConfiguration; + } + + public String getInstanceName() { + return instanceName; + } + + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } + + public String getProductFamilyId() { + return productFamilyId; + } + + public void setProductFamilyId(String productFamilyId) { + this.productFamilyId = productFamilyId; + } + + public List<Map<String, String>> getInstanceParams() { + return instanceParams; + } + + public void setInstanceParams(List<Map<String, String>> instanceParams) { + this.instanceParams = instanceParams; + } + + @Override + public String toString() { + return "Networks [modelInfo=" + modelInfo + + ", cloudConfiguration=" + cloudConfiguration + + ", instanceName=" + instanceName + ", productFamilyId=" + productFamilyId + + ", instanceParams=" + instanceParams + "]"; + } + +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/OwningEntity.java b/common/src/main/java/org/onap/so/serviceinstancebeans/OwningEntity.java new file mode 100644 index 0000000000..f552554ad4 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/OwningEntity.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "owningEntity") +@JsonInclude(Include.NON_DEFAULT) +public class OwningEntity implements Serializable { + + private static final long serialVersionUID = -3907033130633428448L; + @JsonProperty("owningEntityId") + private String owningEntityId; + @JsonProperty("owningEntityName") + private String owningEntityName; + + public String getOwningEntityId(){ + return owningEntityId; + } + + public void setOwningEntityId(String value) { + this.owningEntityId = value; + } + + public String getOwningEntityName(){ + return owningEntityName; + } + + public void setOwningEntityName(String value){ + this.owningEntityName = value; + } + @Override + public String toString() { + return "OwningEntity [owningEntityId=" + owningEntityId + + ", owningEntityName=" + owningEntityName + "]"; + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Platform.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Platform.java new file mode 100644 index 0000000000..961062299f --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Platform.java @@ -0,0 +1,49 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonInclude(Include.NON_DEFAULT) +@JsonRootName(value = "platform") +public class Platform implements Serializable { + + private static final long serialVersionUID = -7334479240678605536L; + @JsonProperty("platformName") + private String platformName; + + public String getPlatformName(){ + return platformName; + } + public void setPlatformName(String value){ + this.platformName = value; + } + @Override + public String toString() { + return new ToStringBuilder(this).append("platformName", platformName).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/PolicyException.java b/common/src/main/java/org/onap/so/serviceinstancebeans/PolicyException.java new file mode 100644 index 0000000000..263089e5c1 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/PolicyException.java @@ -0,0 +1,59 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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========================================================= + */ + +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 +// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2016.03.30 at 02:48:23 PM CDT +// + + +package org.onap.so.serviceinstancebeans; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + + +/** + * <p>Java class for policyException complex type. + * + * <p>The following schema fragment specifies the expected content contained within this class. + * + * <pre> + * <complexType name="policyException"> + * <complexContent> + * <extension base="{http://org.onap/so/request/types/v1}exceptionType"> + * </extension> + * </complexContent> + * </complexType> + * </pre> + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "policyException") +public class PolicyException + extends ExceptionType +{ + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Project.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Project.java new file mode 100644 index 0000000000..47bd2bb802 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Project.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonRootName(value = "project") +@JsonInclude(Include.NON_DEFAULT) +public class Project implements Serializable { + + private static final long serialVersionUID = -3868114191925177035L; + @JsonProperty("projectName") + private String projectName; + + public String getProjectName(){ + return projectName; + } + + public void setProjectName(String value) { + this.projectName = value; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("projectName", projectName).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RelatedInstance.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RelatedInstance.java new file mode 100644 index 0000000000..cfdba18fe1 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RelatedInstance.java @@ -0,0 +1,76 @@ +/*- + * ============LICENSE_START======================================================= + * OPENECOMP - MSO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonRootName(value = "relatedInstance") +@JsonInclude(Include.NON_DEFAULT) +public class RelatedInstance implements Serializable { + + private static final long serialVersionUID = 137250604008221644L; + @JsonProperty("instanceName") + protected String instanceName; + @JsonProperty("instanceId") + protected String instanceId; + @JsonProperty("modelInfo") + protected ModelInfo modelInfo; + //Configuration field + @JsonProperty("instanceDirection") + protected InstanceDirection instanceDirection; + + + public String getInstanceName() { + return instanceName; + } + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } + public String getInstanceId() { + return instanceId; + } + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + public ModelInfo getModelInfo() { + return modelInfo; + } + public void setModelInfo(ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + public InstanceDirection getInstanceDirection() { + return instanceDirection; + } + public void setInstanceDirection(InstanceDirection instanceDirection) { + this.instanceDirection = instanceDirection; + } + @Override + public String toString() { + return new ToStringBuilder(this).append("instanceName", instanceName).append("instanceId", instanceId) + .append("modelInfo", modelInfo).append("instanceDirection", instanceDirection).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RelatedInstanceList.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RelatedInstanceList.java new file mode 100644 index 0000000000..9d10865e24 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RelatedInstanceList.java @@ -0,0 +1,53 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "relatedInstanceList") +@JsonInclude(Include.NON_DEFAULT) +public class RelatedInstanceList implements Serializable { + + private static final long serialVersionUID = 6333898302094446243L; + @JsonProperty("relatedInstance") + protected RelatedInstance relatedInstance; + + public RelatedInstance getRelatedInstance() { + return relatedInstance; + } + + public void setRelatedInstance(RelatedInstance relatedInstance) { + this.relatedInstance = relatedInstance; + } + + @Override + public String toString() { + return "RelatedInstanceList [relatedInstance=" + relatedInstance + "]"; + } + + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Request.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Request.java new file mode 100644 index 0000000000..bda3096f05 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Request.java @@ -0,0 +1,90 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import org.apache.commons.lang3.builder.ToStringBuilder; + + +@JsonInclude(Include.NON_DEFAULT) +public class Request { + + protected String requestId; + protected String startTime; + protected String requestScope; + protected String requestType; + protected RequestDetails requestDetails; + protected InstanceReferences instanceReferences; + protected RequestStatus requestStatus; + + + public String getRequestId() { + return requestId; + } + public void setRequestId(String requestId) { + this.requestId = requestId; + } + public String getStartTime() { + return startTime; + } + public void setStartTime(String startTime) { + this.startTime = startTime; + } + public String getRequestScope() { + return requestScope; + } + public void setRequestScope(String requestScope) { + this.requestScope = requestScope; + } + public String getRequestType() { + return requestType; + } + public void setRequestType(String requestType) { + this.requestType = requestType; + } + public RequestStatus getRequestStatus() { + return requestStatus; + } + public void setRequestStatus(RequestStatus requestStatus) { + this.requestStatus = requestStatus; + } + public InstanceReferences getInstanceReferences() { + return instanceReferences; + } + public void setInstanceReferences(InstanceReferences instanceReferences) { + this.instanceReferences = instanceReferences; + } + public RequestDetails getRequestDetails() { + return requestDetails; + } + public void setRequestDetails(RequestDetails requestDetails) { + this.requestDetails = requestDetails; + } + @Override + public String toString() { + return new ToStringBuilder(this).append("requestId", requestId).append("startTime", startTime) + .append("requestScope", requestScope).append("requestType", requestType) + .append("requestDetails", requestDetails).append("instanceReferences", instanceReferences) + .append("requestStatus", requestStatus).toString(); + } + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestDetails.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestDetails.java new file mode 100644 index 0000000000..d71334288e --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestDetails.java @@ -0,0 +1,303 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "requestDetails") +@JsonInclude(Include.NON_DEFAULT) +public class RequestDetails implements Serializable { + + private static final long serialVersionUID = -73080684945860609L; + @JsonProperty("modelInfo") + protected ModelInfo modelInfo; + @JsonProperty("requestInfo") + protected RequestInfo requestInfo; + @JsonProperty("relatedInstanceList") + protected RelatedInstanceList[] relatedInstanceList; + @JsonProperty("subscriberInfo") + protected SubscriberInfo subscriberInfo; + @JsonProperty("cloudConfiguration") + protected CloudConfiguration cloudConfiguration; + @JsonProperty("requestParameters") + protected RequestParameters requestParameters; + @JsonProperty("project") + protected Project project; + @JsonProperty("owningEntity") + protected OwningEntity owningEntity; + @JsonProperty("platform") + protected Platform platform; + @JsonProperty("lineOfBusiness") + protected LineOfBusiness lineOfBusiness; + @JsonProperty("instanceName") + private List<Map<String, String>> instanceName = new ArrayList<>(); + + + /** + * Gets the value of the serviceInfo property. + * + * @return + * possible object is + * {@link ModelInfo } + * + */ + public ModelInfo getModelInfo() { + return modelInfo; + } + + /** + * Sets the value of the serviceInfo property. + * + * @param value + * allowed object is + * {@link ModelInfo } + * + */ + public void setModelInfo(ModelInfo value) { + this.modelInfo = value; + } + + /** + * Gets the value of the requestInfo property. + * + * @return + * possible object is + * {@link RequestInfo } + * + */ + public RequestInfo getRequestInfo() { + return requestInfo; + } + + /** + * Sets the value of the requestInfo property. + * + * @param value + * allowed object is + * {@link RequestInfo } + * + */ + public void setRequestInfo(RequestInfo value) { + this.requestInfo = value; + } + + /** + * Gets the value of the subscriberInfo property. + * + * @return + * possible object is + * {@link SubscriberInfo } + * + */ + public SubscriberInfo getSubscriberInfo() { + return subscriberInfo; + } + + /** + * Sets the value of the subscriberInfo property. + * + * @param value + * allowed object is + * {@link SubscriberInfo } + * + */ + public void setSubscriberInfo(SubscriberInfo value) { + this.subscriberInfo = value; + } + + /** + * Gets the value of the cloudConfiguration property. + * + * @return + * possible object is + * {@link CloudConfiguration } + * + */ + public CloudConfiguration getCloudConfiguration() { + return cloudConfiguration; + } + + /** + * Sets the value of the cloudConfiguration property. + * + * @param value + * allowed object is + * {@link CloudConfiguration } + * + */ + public void setCloudConfiguration(CloudConfiguration value) { + this.cloudConfiguration = value; + } + + /** + * Gets the value of the requestParameters property. + * + * @return + * possible object is + * {@link RequestParameters } + * + */ + public RequestParameters getRequestParameters() { + return requestParameters; + } + + /** + * Sets the value of the requestParameters property. + * + * @param value + * allowed object is + * {@link RequestParameters } + * + */ + public void setRequestParameters(RequestParameters value) { + this.requestParameters = value; + } + + public RelatedInstanceList[] getRelatedInstanceList() { + return relatedInstanceList; + } + + public void setRelatedInstanceList(RelatedInstanceList[] relatedInstanceList) { + this.relatedInstanceList = relatedInstanceList; + } + /** + * Gets the value of the project property. + * + * @return + * possible object is + * {@link Project } + * + */ + public Project getProject(){ + return project; + } + /** + * Sets the value of the project property. + * + * @param value + * allowed object is + * {@link Project } + * + */ + public void setProject(Project value){ + this.project = value; + } + /** + * Gets the value of the owningEntity property. + * + * @return + * possible object is + * {@link OwningEntity } + * + */ + public OwningEntity getOwningEntity(){ + return owningEntity; + } + /** + * Sets the value of the owningEntity property. + * + * @param value + * allowed object is + * {@link OwningEntity } + * + */ + public void setOwningEntity(OwningEntity value){ + this.owningEntity = value; + } + /** + * Gets the value of the platform property. + * + * @return + * possible object is + * {@link Platform } + * + */ + public Platform getPlatform(){ + return platform; + } + /** + * Sets the value of the platform property. + * + * @param value + * allowed object is + * {@link Platform } + * + */ + public void setPlatform(Platform value){ + this.platform = value; + } + /** + * Gets the value of the lineOfBusiness property. + * + * @return + * possible object is + * {@link LineOfBusiness } + * + */ + public LineOfBusiness getLineOfBusiness(){ + return lineOfBusiness; + } + /** + * Sets the value of the lineOfBusiness property. + * + * @param value + * allowed object is + * {@link LineOfBusiness } + * + */ + public void setLineOfBusiness(LineOfBusiness value){ + this.lineOfBusiness = value; + } + /** + * Gets the value of the instanceName property. + */ + public List<Map<String, String>> getInstanceName() { + return instanceName; + } + /** + * Sets the value of the instanceName property. + * + * @param value + * + */ + public void setInstanceName(List<Map<String, String>> instanceName) { + this.instanceName = instanceName; + } + @Override + public String toString() { + return "RequestDetails [modelInfo=" + modelInfo + ", requestInfo=" + + requestInfo + ", relatedInstanceList=" + + Arrays.toString(relatedInstanceList) + ", subscriberInfo=" + + subscriberInfo + ", cloudConfiguration=" + cloudConfiguration + + ", requestParameters=" + requestParameters + ", platform=" + platform + + ", lineOfBusiness=" + ", project=" + project + ", owningEntity=" + owningEntity + + ", instanceName" + instanceName + "]"; + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestError.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestError.java new file mode 100644 index 0000000000..76137d0f58 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestError.java @@ -0,0 +1,128 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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========================================================= + */ + +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 +// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2016.04.07 at 08:25:52 AM CDT +// + + +package org.onap.so.serviceinstancebeans; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonRootName; + + +/** + * <p>Java class for anonymous complex type. + * + * <p>The following schema fragment specifies the expected content contained within this class. + * + * <pre> + * <complexType> + * <complexContent> + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> + * <sequence> + * <choice> + * <element name="policyException" type="{http://org.onap/so/request/types/v1}policyException"/> + * <element name="serviceException" type="{http://org.onap/so/request/types/v1}serviceException"/> + * </choice> + * </sequence> + * </restriction> + * </complexContent> + * </complexType> + * </pre> + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "policyException", + "serviceException" +}) +@XmlRootElement(name = "requestError") +@JsonRootName(value = "requestError") +public class RequestError { + + protected PolicyException policyException; + protected ServiceException serviceException; + + /** + * Gets the value of the policyException property. + * + * @return + * possible object is + * {@link PolicyException } + * + */ + public PolicyException getPolicyException() { + return policyException; + } + + /** + * Sets the value of the policyException property. + * + * @param value + * allowed object is + * {@link PolicyException } + * + */ + public void setPolicyException(PolicyException value) { + this.policyException = value; + } + + /** + * Gets the value of the serviceException property. + * + * @return + * possible object is + * {@link ServiceException } + * + */ + public ServiceException getServiceException() { + return serviceException; + } + + /** + * Sets the value of the serviceException property. + * + * @param value + * allowed object is + * {@link ServiceException } + * + */ + public void setServiceException(ServiceException value) { + this.serviceException = value; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("policyException", policyException) + .append("serviceException", serviceException).toString(); + } + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestInfo.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestInfo.java new file mode 100644 index 0000000000..158ca7a819 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestInfo.java @@ -0,0 +1,239 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion; + +@JsonRootName(value = "requestInfo") +@JsonInclude(Include.NON_DEFAULT) +public class RequestInfo implements Serializable { + + private static final long serialVersionUID = -1370946827136030181L; + @JsonProperty("billingAccountNumber") + protected String billingAccountNumber; + @JsonProperty("callbackUrl") + protected String callbackUrl; + @JsonProperty("correlator") + protected String correlator; + @JsonProperty("orderNumber") + protected String orderNumber; + @JsonProperty("productFamilyId") + protected String productFamilyId; + @JsonProperty("orderVersion") + protected Integer orderVersion; + @JsonSerialize(include=Inclusion.ALWAYS) + @JsonProperty("source") + protected String source; + @JsonProperty("instanceName") + protected String instanceName; + @JsonProperty("suppressRollback") + @JsonSerialize(include=Inclusion.ALWAYS) + protected boolean suppressRollback; + @JsonProperty("requestorId") + protected String requestorId; + + /** + * Gets the value of the callbackUrl property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCallbackUrl() { + return callbackUrl; + } + + /** + * Sets the value of the callbackUrl property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCallbackUrl(String value) { + this.callbackUrl = value; + } + + /** + * Gets the value of the correlator property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getCorrelator() { + return correlator; + } + + /** + * Sets the value of the correlator property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setCorrelator(String value) { + this.correlator = value; + } + + /** + * Gets the value of the orderNumber property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getOrderNumber() { + return orderNumber; + } + + /** + * Sets the value of the orderNumber property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setOrderNumber(String value) { + this.orderNumber = value; + } + + /** + * Gets the value of the orderVersion property. + * + * @return + * possible object is + * {@link Integer } + * + */ + public Integer getOrderVersion() { + return orderVersion; + } + + /** + * Sets the value of the orderVersion property. + * + * @param value + * allowed object is + * {@link Integer } + * + */ + public void setOrderVersion(Integer value) { + this.orderVersion = value; + } + + /** + * Gets the value of the source property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSource() { + if(null == source || source.isEmpty()){ + source = "VID"; + } + return source; + } + + /** + * Sets the value of the source property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSource(String value) { + this.source = value; + } + + public String getInstanceName() { + return instanceName; + } + + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } + + public String getBillingAccountNumber() { + return billingAccountNumber; + } + + public void setBillingAccountNumber(String billingAccountNumber) { + this.billingAccountNumber = billingAccountNumber; + } + + public String getProductFamilyId() { + return productFamilyId; + } + + public void setProductFamilyId(String productFamilyId) { + this.productFamilyId = productFamilyId; + } + + /** + * Required for Marshalers to send the fields. + * @return + */ + public boolean getSuppressRollback() { + return suppressRollback; + } + + public void setSuppressRollback(boolean suppressRollback) { + this.suppressRollback = suppressRollback; + } + + public String getRequestorId() { + return requestorId; + } + + public void setRequestorId(String requestorId) { + this.requestorId = requestorId; + } + + @Override + public String toString() { + return "RequestInfo [billingAccountNumber=" + billingAccountNumber + + ", callbackUrl=" + callbackUrl + ", correlator=" + correlator + + ", orderNumber=" + orderNumber + ", productFamilyId=" + + productFamilyId + ", orderVersion=" + orderVersion + + ", source=" + source + ", instanceName=" + instanceName + + ", suppressRollback=" + suppressRollback + ", requestorId=" + + requestorId + "]"; + } + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestList.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestList.java new file mode 100644 index 0000000000..a4c0ddfcf2 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestList.java @@ -0,0 +1,44 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.util.List; +import org.apache.commons.lang3.builder.ToStringBuilder; + + +public class RequestList { + + protected Request request; + + public Request getRequest() { + return request; + } + + public void setRequest(Request request) { + this.request = request; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("request", request).toString(); + } + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestParameters.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestParameters.java new file mode 100644 index 0000000000..1697a4eb5f --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestParameters.java @@ -0,0 +1,171 @@ +/*- + * ============LICENSE_START======================================================= + * OPENECOMP - MSO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.persistence.Transient; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "requestParameters") +@JsonInclude(Include.NON_DEFAULT) +public class RequestParameters implements Serializable { + + private static final long serialVersionUID = -5979049912538894930L; + @JsonProperty("subscriptionServiceType") + private String subscriptionServiceType; + @JsonProperty("userParams") + private List<Map<String, Object>> userParams = new ArrayList<>(); + @JsonProperty("aLaCarte") + private Boolean aLaCarte; + + // DONOT USE. It is intended to handle older VID requests(prior to 1802) + @Deprecated + @JsonProperty("alaCarte") + private Boolean alaCarte; + @JsonProperty("autoBuildVfModules") + private Boolean autoBuildVfModules; + @JsonProperty("cascadeDelete") + private Boolean cascadeDelete; + @JsonProperty("testApi") + private String testApi; // usePreload would always be true for Update + @JsonProperty("usePreload") + private Boolean usePreload; // usePreload would always be true for Update + @JsonProperty("rebuildVolumeGroups") + private Boolean rebuildVolumeGroups; + @JsonProperty("payload") + private String payload; + + public String getSubscriptionServiceType() { + return subscriptionServiceType; + } + + public void setSubscriptionServiceType(String subscriptionServiceType) { + this.subscriptionServiceType = subscriptionServiceType; + } + @JsonProperty("aLaCarte") + public Boolean getALaCarte() { + return aLaCarte; + } + @JsonProperty("aLaCarte") + public void setaLaCarte(Boolean aLaCarte) { + this.aLaCarte = aLaCarte; + } + + public Boolean isaLaCarte() { + return aLaCarte; + } + + @Deprecated + @Transient + @JsonProperty("alaCarte") + public Boolean getAlaCarte() { + return alaCarte; + } + + @Deprecated + @JsonProperty("alaCarte") + public void setAlaCarte(Boolean alaCarte) { + this.alaCarte = alaCarte; + } + + public String getTestApi() { + return testApi; + } + + public void setTestApi(String testApi) { + this.testApi = testApi; + } + + public List<Map<String, Object>> getUserParams() { + return userParams; + } + + public void setUserParams(List<Map<String, Object>> userParams) { + this.userParams = userParams; + } + + public String getUserParamValue(String name){ + if(userParams!=null){ + for(Map<String, Object> param:userParams){ + if(param.get("name").equals(name)){ + return param.get("value").toString(); + } + } + } + return null; + } + + public Boolean getAutoBuildVfModules() { + return autoBuildVfModules; + } + + public void setAutoBuildVfModules(Boolean autoBuildVfModules) { + this.autoBuildVfModules = autoBuildVfModules; + } + + public Boolean getCascadeDelete() { + return cascadeDelete; + } + + public void setCascadeDelete(Boolean cascadeDelete) { + this.cascadeDelete = cascadeDelete; + } + + public Boolean isUsePreload() { + return usePreload; + } + + public void setUsePreload(Boolean usePreload) { + this.usePreload = usePreload; + } + + public Boolean getRebuildVolumeGroups() { + return rebuildVolumeGroups; + } + + public void setRebuildVolumeGroups(Boolean rebuildVolumeGroups) { + this.rebuildVolumeGroups = rebuildVolumeGroups; + } + public String getPayload(){ + return payload; + } + public void setPayload(String value){ + this.payload = value; + } + + @Override + public String toString() { + return "RequestParameters [subscriptionServiceType=" + + subscriptionServiceType + ", userParams=" + userParams + + ", aLaCarte=" + aLaCarte + ", testApi= " + testApi + ", autoBuildVfModules=" + + autoBuildVfModules + ", usePreload=" + + usePreload + ", rebuildVolumeGroups=" + + rebuildVolumeGroups + ", payload=" + payload + "]"; + } +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestReferences.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestReferences.java new file mode 100644 index 0000000000..c30e39a028 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestReferences.java @@ -0,0 +1,55 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +@JsonRootName(value = "requestReferences") +@JsonInclude(Include.NON_DEFAULT) +public class RequestReferences { + + String requestId; + String instanceId; + + + public String getRequestId() { + return requestId; + } + public void setRequestId(String requestId) { + this.requestId = requestId; + } + public String getInstanceId() { + return instanceId; + } + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + @Override + public String toString() { + return new ToStringBuilder(this).append("requestId", requestId).append("instanceId", instanceId).toString(); + } + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/RequestStatus.java b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestStatus.java new file mode 100644 index 0000000000..527aa037ed --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/RequestStatus.java @@ -0,0 +1,65 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import org.apache.commons.lang3.builder.ToStringBuilder; + +@JsonInclude(Include.NON_DEFAULT) +public class RequestStatus { + + protected String requestState; + protected String statusMessage; + protected Integer percentProgress; + protected String finishTime; + + + public String getRequestState() { + return requestState; + } + public void setRequestState(String requestState) { + this.requestState = requestState; + } + public String getStatusMessage() { + return statusMessage; + } + public void setStatusMessage(String statusMessage) { + this.statusMessage = statusMessage; + } + public Integer getPercentProgress() { + return percentProgress; + } + public void setPercentProgress(Integer percentProgress) { + this.percentProgress = percentProgress; + } + public String getFinishTime() { + return finishTime; + } + public void setFinishTime(String finishTime) { + this.finishTime = finishTime; + } + @Override + public String toString() { + return new ToStringBuilder(this).append("requestState", requestState).append("statusMessage", statusMessage) + .append("percentProgress", percentProgress).append("finishTime", finishTime).toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Resources.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Resources.java new file mode 100644 index 0000000000..68fd95c293 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Resources.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.so.serviceinstancebeans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "resources") +@JsonInclude(Include.NON_DEFAULT) +public class Resources implements Serializable{ + + private static final long serialVersionUID = 2194797231782624520L; + @JsonProperty("vnfs") + private List<Vnfs> vnfs = new ArrayList<>(); + @JsonProperty("networks") + private List<Networks> networks = new ArrayList<>(); + + public List<Vnfs> getVnfs() { + return vnfs; + } + public void setVnfs(List<Vnfs> vnfs) { + this.vnfs = vnfs; + } + public List<Networks> getNetworks() { + return networks; + } + public void setNetworks(List<Networks> networks) { + this.networks = networks; + } + @Override + public String toString() { + return "Resources [vnfs=" + vnfs + ", networks=" + networks + "]"; + } +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Service.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Service.java new file mode 100644 index 0000000000..66848d343c --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Service.java @@ -0,0 +1,98 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.so.serviceinstancebeans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +@JsonRootName(value = "service") +@JsonInclude(Include.NON_DEFAULT) +public class Service implements Serializable{ + + private static final long serialVersionUID = 2194797231782624520L; + @JsonProperty("modelInfo") + protected ModelInfo modelInfo; + @JsonProperty("cloudConfiguration") + protected CloudConfiguration cloudConfiguration; + @JsonProperty("instanceName") + protected String instanceName; + @JsonProperty("instanceParams") + private List<Map<String, String>> instanceParams = new ArrayList<>(); + @JsonProperty("resources") + protected Resources resources; + + public ModelInfo getModelInfo() { + return modelInfo; + } + + public void setModelInfo(ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + + public CloudConfiguration getCloudConfiguration() { + return cloudConfiguration; + } + + public void setCloudConfiguration(CloudConfiguration cloudConfiguration) { + this.cloudConfiguration = cloudConfiguration; + } + + public String getInstanceName() { + return instanceName; + } + + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } + + public List<Map<String, String>> getInstanceParams() { + return instanceParams; + } + + public void setInstanceParams(List<Map<String, String>> instanceParams) { + this.instanceParams = instanceParams; + } + + public Resources getResources() { + return resources; + } + + public void setResources(Resources resources) { + this.resources = resources; + } + + @Override + public String toString() { + return "Service [modelInfo=" + modelInfo + + ", cloudConfiguration=" + cloudConfiguration + + ", instanceName=" + instanceName + + ", instanceParams=" + instanceParams + + ", resources=" + resources + "]"; + } +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceException.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceException.java new file mode 100644 index 0000000000..7efb7f0bff --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceException.java @@ -0,0 +1,62 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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========================================================= + */ + +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.7 +// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2016.03.30 at 02:48:23 PM CDT +// + + +package org.onap.so.serviceinstancebeans; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + +import com.fasterxml.jackson.annotation.JsonRootName; + + +/** + * <p>Java class for serviceException complex type. + * + * <p>The following schema fragment specifies the expected content contained within this class. + * + * <pre> + * <complexType name="serviceException"> + * <complexContent> + * <extension base="{http://org.onap/so/request/types/v1}exceptionType"> + * </extension> + * </complexContent> + * </complexType> + * </pre> + * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "serviceException") +@JsonRootName(value = "serviceException") +public class ServiceException + extends ExceptionType +{ + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesRequest.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesRequest.java new file mode 100644 index 0000000000..3ccf29127f --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesRequest.java @@ -0,0 +1,125 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ServiceInstancesRequest implements Serializable { + + private static final long serialVersionUID = -4959169541182257787L; + @JsonProperty("requestDetails") + private RequestDetails requestDetails; + @JsonProperty("serviceInstanceId") + private String serviceInstanceId; + @JsonProperty("vnfInstanceId") + private String vnfInstanceId; + @JsonProperty("networkInstanceId") + private String networkInstanceId; + @JsonProperty("volumeGroupInstanceId") + private String volumeGroupInstanceId; + @JsonProperty("vfModuleInstanceId") + private String vfModuleInstanceId; + @JsonProperty("configurationId") + private String configurationId; + @JsonProperty("correlationId") + private String correlationId; + + public RequestDetails getRequestDetails() { + return requestDetails; + } + + public void setRequestDetails(RequestDetails requestDetails) { + this.requestDetails = requestDetails; + } + + public String getServiceInstanceId() { + return serviceInstanceId; + } + + public void setServiceInstanceId(String serviceInstanceId) { + this.serviceInstanceId = serviceInstanceId; + } + + public String getVnfInstanceId() { + return vnfInstanceId; + } + + public void setVnfInstanceId(String vnfInstanceId) { + this.vnfInstanceId = vnfInstanceId; + } + + public String getNetworkInstanceId() { + return networkInstanceId; + } + + public void setNetworkInstanceId(String networkInstanceId) { + this.networkInstanceId = networkInstanceId; + } + + public String getVolumeGroupInstanceId() { + return volumeGroupInstanceId; + } + + public void setVolumeGroupInstanceId(String volumeGroupInstanceId) { + this.volumeGroupInstanceId = volumeGroupInstanceId; + } + + public String getVfModuleInstanceId() { + return vfModuleInstanceId; + } + + public void setVfModuleInstanceId(String vfModuleInstanceId) { + this.vfModuleInstanceId = vfModuleInstanceId; + } + + public String getConfigurationId() { + return configurationId; + } + + public void setConfigurationId(String configurationId) { + this.configurationId = configurationId; + } + + public String getCorrelationId() { + return correlationId; + } + + public void setCorrelationId(String correlationId) { + this.correlationId = correlationId; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("ServiceInstancesRequest{"); + sb.append("requestDetails=").append(requestDetails); + sb.append(", serviceInstanceId='").append(serviceInstanceId).append('\''); + sb.append(", vnfInstanceId='").append(vnfInstanceId).append('\''); + sb.append(", networkInstanceId='").append(networkInstanceId).append('\''); + sb.append(", volumeGroupInstanceId='").append(volumeGroupInstanceId).append('\''); + sb.append(", vfModuleInstanceId='").append(vfModuleInstanceId).append('\''); + sb.append(", configurationId='").append(configurationId).append('\''); + sb.append(", correlationId='").append(correlationId).append('\''); + sb.append('}'); + return sb.toString(); + } +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesResponse.java b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesResponse.java new file mode 100644 index 0000000000..db3add8d47 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/ServiceInstancesResponse.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +public class ServiceInstancesResponse { + + RequestReferences requestReferences; + + public RequestReferences getRequestReferences() { + return requestReferences; + } + + public void setRequestReferences(RequestReferences requestReferences) { + this.requestReferences = requestReferences; + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("requestReferences", requestReferences).toString(); + } + + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/SubscriberInfo.java b/common/src/main/java/org/onap/so/serviceinstancebeans/SubscriberInfo.java new file mode 100644 index 0000000000..03780231fc --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/SubscriberInfo.java @@ -0,0 +1,94 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.serviceinstancebeans; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonRootName(value = "subscriberInfo") +@JsonInclude(Include.NON_DEFAULT) +public class SubscriberInfo implements Serializable { + + private static final long serialVersionUID = -1750701712128104652L; + @JsonProperty("globalSubscriberId") + protected String globalSubscriberId; + @JsonProperty("subscriberName") + protected String subscriberName; + + /** + * Gets the value of the globalSubscriberId property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getGlobalSubscriberId() { + return globalSubscriberId; + } + + /** + * Sets the value of the globalSubscriberId property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setGlobalSubscriberId(String value) { + this.globalSubscriberId = value; + } + + /** + * Gets the value of the subscriberName property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getSubscriberName() { + return subscriberName; + } + + /** + * Sets the value of the subscriberName property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setSubscriberName(String value) { + this.subscriberName = value; + } + + @Override + public String toString() { + return "SubscriberInfo [globalSubscriberId=" + globalSubscriberId + + ", subscriberName=" + subscriberName + "]"; + } + +} diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java b/common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java new file mode 100644 index 0000000000..74f8af80a7 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/VfModules.java @@ -0,0 +1,99 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.so.serviceinstancebeans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +@JsonRootName(value = "vfmodules") +@JsonInclude(Include.NON_DEFAULT) +public class VfModules implements Serializable{ + + private static final long serialVersionUID = 8081495240474276501L; + @JsonProperty("modelInfo") + protected ModelInfo modelInfo; + @JsonProperty("cloudConfiguration") + protected CloudConfiguration cloudConfiguration; + @JsonProperty("instanceName") + protected String instanceName; + @JsonProperty("volumeGroupInstanceName") + protected String volumeGroupInstanceName; + @JsonProperty("instanceParams") + private List<Map<String, String>> instanceParams = new ArrayList<>(); + + + public ModelInfo getModelInfo() { + return modelInfo; + } + + public void setModelInfo(ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + + public CloudConfiguration getCloudConfiguration() { + return cloudConfiguration; + } + + public void setCloudConfiguration(CloudConfiguration cloudConfiguration) { + this.cloudConfiguration = cloudConfiguration; + } + + public String getInstanceName() { + return instanceName; + } + + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } + + public String getVolumeGroupInstanceName() { + return volumeGroupInstanceName; + } + + public void setVolumeGroupInstanceName(String volumeGroupInstanceName) { + this.volumeGroupInstanceName = volumeGroupInstanceName; + } + + public List<Map<String, String>> getInstanceParams() { + return instanceParams; + } + + public void setInstanceParams(List<Map<String, String>> instanceParams) { + this.instanceParams = instanceParams; + } + + @Override + public String toString() { + return "VfModules [modelInfo=" + modelInfo + + ", cloudConfiguration=" + cloudConfiguration + + ", instanceName=" + instanceName + ", volumeGroupInstanceName=" + + volumeGroupInstanceName + ", instanceParams=" + instanceParams + "]"; + } + +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java b/common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java new file mode 100644 index 0000000000..b55a528935 --- /dev/null +++ b/common/src/main/java/org/onap/so/serviceinstancebeans/Vnfs.java @@ -0,0 +1,131 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.so.serviceinstancebeans; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.annotation.JsonInclude.Include; + +@JsonRootName(value = "vnfs") +@JsonInclude(Include.NON_DEFAULT) +public class Vnfs implements Serializable{ + + private static final long serialVersionUID = 8081495240474276501L; + @JsonProperty("modelInfo") + protected ModelInfo modelInfo; + @JsonProperty("cloudConfiguration") + protected CloudConfiguration cloudConfiguration; + @JsonProperty("instanceName") + protected String instanceName; + @JsonProperty("platform") + protected Platform platform; + @JsonProperty("lineOfBusiness") + protected LineOfBusiness lineOfBusiness; + @JsonProperty("productFamilyId") + protected String productFamilyId; + @JsonProperty("instanceParams") + private List<Map<String, String>> instanceParams = new ArrayList<>(); + @JsonProperty("vfModules") + private List<VfModules> vfModules = new ArrayList<>(); + + + public ModelInfo getModelInfo() { + return modelInfo; + } + + public void setModelInfo(ModelInfo modelInfo) { + this.modelInfo = modelInfo; + } + + public CloudConfiguration getCloudConfiguration() { + return cloudConfiguration; + } + + public void setCloudConfiguration(CloudConfiguration cloudConfiguration) { + this.cloudConfiguration = cloudConfiguration; + } + + public String getInstanceName() { + return instanceName; + } + + public void setInstanceName(String instanceName) { + this.instanceName = instanceName; + } + + public Platform getPlatform() { + return platform; + } + + public void setPlatform(Platform platform) { + this.platform = platform; + } + + public LineOfBusiness getLineOfBusiness() { + return lineOfBusiness; + } + + public void setLineOfBusiness(LineOfBusiness lineOfBusiness) { + this.lineOfBusiness = lineOfBusiness; + } + + public String getProductFamilyId() { + return productFamilyId; + } + + public void setProductFamilyId(String productFamilyId) { + this.productFamilyId = productFamilyId; + } + + public List<Map<String, String>> getInstanceParams() { + return instanceParams; + } + + public void setInstanceParams(List<Map<String, String>> instanceParams) { + this.instanceParams = instanceParams; + } + + public List<VfModules> getVfModules() { + return vfModules; + } + + public void setVfModules(List<VfModules> vfModules) { + this.vfModules = vfModules; + } + + @Override + public String toString() { + return "Vnfs [modelInfo=" + modelInfo + + ", cloudConfiguration=" + cloudConfiguration + + ", instanceName=" + instanceName + ", platform=" + platform + ", " + + "lineOfBusiness=" + lineOfBusiness + + ", productFamilyId=" + productFamilyId + ", instanceParams=" + instanceParams + + ", vfModules=" + vfModules + "]"; + } + +}
\ No newline at end of file diff --git a/common/src/main/java/org/onap/so/test/categories/SlowTests.java b/common/src/main/java/org/onap/so/test/categories/SlowTests.java new file mode 100644 index 0000000000..58a14041d0 --- /dev/null +++ b/common/src/main/java/org/onap/so/test/categories/SlowTests.java @@ -0,0 +1,25 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.test.categories; + +public interface SlowTests { +/* category marker */ +} diff --git a/common/src/main/java/org/onap/so/utils/CheckResults.java b/common/src/main/java/org/onap/so/utils/CheckResults.java new file mode 100644 index 0000000000..4f6089d0e3 --- /dev/null +++ b/common/src/main/java/org/onap/so/utils/CheckResults.java @@ -0,0 +1,118 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.utils; + + + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "checkresults") +public class CheckResults { + + @XmlElement(name = "checkresult") + private List <CheckResult> results; + + public CheckResults () { + results = new ArrayList<>(); + } + + public List <CheckResult> getResults () { + return results; + } + + public void addHostCheckResult (String hostname, int state, String output) { + CheckResult newResult = new CheckResult (); + newResult.setType ("host"); + newResult.setHostname (hostname); + newResult.setState (state); + newResult.setOutput (output); + results.add (newResult); + } + + public void addServiceCheckResult (String hostname, String servicename, int state, String output) { + CheckResult newResult = new CheckResult (); + newResult.setType ("service"); + newResult.setHostname (hostname); + newResult.setServicename (servicename); + newResult.setState (state); + newResult.setOutput (output); + results.add (newResult); + } + + public static class CheckResult { + + private String type; + private String hostname; + private String servicename; + private int state; + private String output; + + @XmlAttribute(required = true) + public String getType () { + return type; + } + + public void setType (String type) { + this.type = type; + } + + @XmlElement(required = true) + public String getHostname () { + return hostname; + } + + public void setHostname (String hostname) { + this.hostname = hostname; + } + + @XmlElement(required = false) + public String getServicename () { + return servicename; + } + + public void setServicename (String servicename) { + this.servicename = servicename; + } + + @XmlElement(required = true) + public int getState () { + return state; + } + + public void setState (int state) { + this.state = state; + } + + @XmlElement(required = true) + public String getOutput () { + return output; + } + + public void setOutput (String output) { + this.output = output; + } + } +} diff --git a/common/src/main/java/org/onap/so/utils/CryptoUtils.java b/common/src/main/java/org/onap/so/utils/CryptoUtils.java new file mode 100644 index 0000000000..11d464a85c --- /dev/null +++ b/common/src/main/java/org/onap/so/utils/CryptoUtils.java @@ -0,0 +1,129 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.utils; + + + +import java.security.GeneralSecurityException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; + + +/** + * CryptoUtils adapted from RTTP client. + * + */ +public final class CryptoUtils { + + private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA, CryptoUtils.class); + + public static final String AES = "AES"; + private static final String CLOUD_KEY = "aa3871669d893c7fb8abbcda31b88b4f"; + /** + * encrypt a value and generate a keyfile + * if the keyfile is not found then a new one is created + * + * @throws GeneralSecurityException + */ + public static String encrypt (String value, String keyString) throws GeneralSecurityException { + SecretKeySpec sks = getSecretKeySpec (keyString); + Cipher cipher = Cipher.getInstance (CryptoUtils.AES); + cipher.init (Cipher.ENCRYPT_MODE, sks, cipher.getParameters ()); + byte[] encrypted = cipher.doFinal (value.getBytes ()); + return byteArrayToHexString (encrypted); + } + + /** + * decrypt a value + * + * @throws GeneralSecurityException + */ + public static String decrypt (String message, String keyString) throws GeneralSecurityException { + SecretKeySpec sks = getSecretKeySpec (keyString); + Cipher cipher = Cipher.getInstance (CryptoUtils.AES); + cipher.init (Cipher.DECRYPT_MODE, sks); + byte[] decrypted = cipher.doFinal (hexStringToByteArray (message)); + return new String (decrypted); + } + + /** + * decrypt a value or return defaultValue + * + */ + public static String decryptProperty (String prop, String defaultValue, String encryptionKey) { + try { + return CryptoUtils.decrypt(prop, encryptionKey); + } + catch (GeneralSecurityException e) { + LOGGER.debug("Security exception", e); + } + return defaultValue; + } + + public static String encryptCloudConfigPassword(String message) { + try { + return CryptoUtils.encrypt(message, CryptoUtils.CLOUD_KEY); + } catch (GeneralSecurityException e) { + LOGGER.error (MessageEnum.RA_GENERAL_EXCEPTION, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Exception in encryptPassword", e); + return null; + } + } + public static String decryptCloudConfigPassword(String message) { + try { + return CryptoUtils.decrypt(message, CryptoUtils.CLOUD_KEY); + } catch (GeneralSecurityException e) { + LOGGER.error (MessageEnum.RA_GENERAL_EXCEPTION, "", "", MsoLogger.ErrorCode.BusinessProcesssError, "Exception in encryptPassword", e); + return null; + } + } + private static SecretKeySpec getSecretKeySpec (String keyString) throws NoSuchAlgorithmException { + byte[] key = hexStringToByteArray (keyString); + SecretKeySpec sks = new SecretKeySpec (key, CryptoUtils.AES); + return sks; + } + + public static String byteArrayToHexString (byte[] b) { + StringBuilder sb = new StringBuilder(b.length * 2); + for (byte aB : b) { + int v = aB & 0xff; + if (v < 16) { + sb.append('0'); + } + sb.append(Integer.toHexString(v)); + } + return sb.toString ().toUpperCase (); + } + + private static byte[] hexStringToByteArray (String s) { + byte[] b = new byte[s.length () / 2]; + for (int i = 0; i < b.length; i++) { + int index = i * 2; + int v = Integer.parseInt (s.substring (index, index + 2), 16); + b[i] = (byte) v; + } + return b; + } +} diff --git a/common/src/main/java/org/onap/so/utils/TargetEntity.java b/common/src/main/java/org/onap/so/utils/TargetEntity.java new file mode 100644 index 0000000000..ad76e56a56 --- /dev/null +++ b/common/src/main/java/org/onap/so/utils/TargetEntity.java @@ -0,0 +1,32 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.utils; + + +public enum TargetEntity { + OPENSTACK_ADAPTER, BPMN, GRM ,AAI, DMAAP, POLICY, CATALOG_DB, REQUEST_DB, VNF_ADAPTER, SDNC_ADAPTER, NARAD; + + private static final String PREFIX = "MSO"; + @Override + public String toString(){ + return TargetEntity.PREFIX + "." + this.name(); + } +} diff --git a/common/src/main/java/org/onap/so/utils/UUIDChecker.java b/common/src/main/java/org/onap/so/utils/UUIDChecker.java new file mode 100644 index 0000000000..fac73e84f9 --- /dev/null +++ b/common/src/main/java/org/onap/so/utils/UUIDChecker.java @@ -0,0 +1,80 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017 Huawei Technologies Co., Ltd. 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.so.utils; + +import java.util.UUID; + +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; + +/** + */ +public class UUIDChecker { + + private static final MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.GENERAL, UUIDChecker.class); + + private UUIDChecker() { + + } + + public static boolean isValidUUID (String id) { + try { + if (null == id) { + return false; + } + UUID uuid = UUID.fromString(id); + return uuid.toString().equalsIgnoreCase(id); + } catch (IllegalArgumentException iae) { + LOGGER.debug("IllegalArgumentException", iae); + return false; + } + } + + public static String getUUID () { + return UUID.randomUUID().toString(); + } + + public static String verifyOldUUID (String oldId, MsoLogger msoLogger) { + if (!UUIDChecker.isValidUUID(oldId)) { + String newId = UUIDChecker.getUUID(); + MsoLogger.setLogContext(newId, null); + msoLogger.info(MessageEnum.APIH_REPLACE_REQUEST_ID, oldId, "", ""); + return newId; + } + MsoLogger.setLogContext(oldId, null); + return oldId; + } + + public static String generateUUID (MsoLogger msoLogger) { + String newId = UUIDChecker.getUUID(); + MsoLogger.setLogContext(newId, null); + msoLogger.info(MessageEnum.APIH_GENERATED_REQUEST_ID, newId, "", ""); + return newId; + } + + public static String generateServiceInstanceID (MsoLogger msoLogger) { + String newId = UUIDChecker.getUUID(); + MsoLogger.setLogContext(null, newId); + msoLogger.info(MessageEnum.APIH_GENERATED_SERVICE_INSTANCE_ID, newId, "", ""); + return newId; + } +} diff --git a/common/src/main/java/org/onap/so/utils/XmlMarshaller.java b/common/src/main/java/org/onap/so/utils/XmlMarshaller.java new file mode 100644 index 0000000000..903d055548 --- /dev/null +++ b/common/src/main/java/org/onap/so/utils/XmlMarshaller.java @@ -0,0 +1,84 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T 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.so.utils; + + +import java.io.StringReader; +import java.io.StringWriter; + +import javax.xml.XMLConstants; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.Unmarshaller; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.sax.SAXSource; + +import org.onap.so.exceptions.MarshallerException; +import org.onap.so.logger.MessageEnum; +import org.onap.so.logger.MsoLogger; +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; + +public class XmlMarshaller { + + private static MsoLogger logger = MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL, XmlMarshaller.class); + + public static String marshal(Object object) throws MarshallerException { + + StringWriter stringWriter = new StringWriter(); + try { + JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass()); + Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); + jaxbMarshaller.marshal(object, stringWriter); + } catch (JAXBException e) { + logger.error(MessageEnum.GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.SchemaError, e.getMessage(), e); + throw new MarshallerException(e.getMessage(), MsoLogger.ErrorCode.SchemaError.getValue(), e); + } + + return stringWriter.toString(); + } + + public static Object unMarshal(String input, Object object) throws MarshallerException { + + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + spf.setFeature("http://xml.org/sax/features/external-general-entities", false); + spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + spf.setNamespaceAware(true); + XMLReader xmlReader = spf.newSAXParser().getXMLReader(); + + JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass()); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + + InputSource inputSource = new InputSource(new StringReader(input)); + SAXSource source = new SAXSource(xmlReader, inputSource); + object = jaxbUnmarshaller.unmarshal(source, object.getClass()).getValue(); + } catch (Exception e) { + logger.error(MessageEnum.GENERAL_EXCEPTION, "", "", "", MsoLogger.ErrorCode.SchemaError, e.getMessage(), e); + throw new MarshallerException(e.getMessage(), MsoLogger.ErrorCode.SchemaError.getValue(), e); + } + + return object; + } + +} diff --git a/common/src/main/java/org/onap/so/web/exceptions/ExceptionResponse.java b/common/src/main/java/org/onap/so/web/exceptions/ExceptionResponse.java new file mode 100644 index 0000000000..048634190a --- /dev/null +++ b/common/src/main/java/org/onap/so/web/exceptions/ExceptionResponse.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.web.exceptions; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "message" +}) +public class ExceptionResponse { + @JsonProperty("message") + private String message; + + public ExceptionResponse(String message) { + this.message = message; + } + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + +} diff --git a/common/src/main/java/org/onap/so/web/exceptions/RuntimeExceptionMapper.java b/common/src/main/java/org/onap/so/web/exceptions/RuntimeExceptionMapper.java new file mode 100644 index 0000000000..72e609acbd --- /dev/null +++ b/common/src/main/java/org/onap/so/web/exceptions/RuntimeExceptionMapper.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2018 AT&T 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.so.web.exceptions; + +import javax.ws.rs.NotFoundException; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.ext.ExceptionMapper; + +import org.onap.so.logger.MsoAlarmLogger; +import org.onap.so.logger.MsoLogger; + +public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> { + + private static MsoLogger logger = MsoLogger.getMsoLogger(MsoLogger.Catalog.GENERAL, RuntimeExceptionMapper.class); + private static MsoAlarmLogger alarmLogger = new MsoAlarmLogger(); + @Override + public Response toResponse(RuntimeException exception) { + + if (exception instanceof NotFoundException) { + return Response.status(Status.NOT_FOUND).build(); + } else { + alarmLogger.sendAlarm("MsoApplicationError", MsoAlarmLogger.CRITICAL, exception.getMessage()); + logger.error(exception); + return Response.status(Status.INTERNAL_SERVER_ERROR).entity(new ExceptionResponse("Unexpected Internal Exception")).build(); + } + } +} |