diff options
author | Seshu Kumar M <seshu.kumar.m@huawei.com> | 2018-03-14 09:22:15 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2018-03-14 09:22:15 +0000 |
commit | 09f3630ea990197e9d7b669aa2d6a63ec397bf3e (patch) | |
tree | 6625d3e9ac31600d86bf54a50e75dba61cc2c82a /cloudify-client | |
parent | a56de0e221751debd038aca5b6d20d8f9325d294 (diff) | |
parent | 38f720752af4d4aad8c4e467a288d9048659f688 (diff) |
Merge "AT&T 1712 and 1802 release code"
Diffstat (limited to 'cloudify-client')
43 files changed, 3776 insertions, 0 deletions
diff --git a/cloudify-client/pom.xml b/cloudify-client/pom.xml new file mode 100644 index 0000000000..f87ee3ccd9 --- /dev/null +++ b/cloudify-client/pom.xml @@ -0,0 +1,53 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.onap.so</groupId> + <artifactId>so</artifactId> + <version>1.2.0-SNAPSHOT</version> + </parent> + + <groupId>org.onap.so</groupId> + <artifactId>cloudify-client</artifactId> + <packaging>jar</packaging> + <name>Cloudify Rest Client</name> + <description>Java client for Cloudify REST interface</description> + + <build> + <finalName>${project.artifactId}-${project.version}</finalName> + <plugins> + <plugin> + <artifactId>maven-jar-plugin</artifactId> + <version>2.6</version> + <configuration> + <classesDirectory>target/classes</classesDirectory> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.onap.so</groupId> + <artifactId>common</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpcore</artifactId> + <version>4.3.1</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>4.3.1</version> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.6</version> + </dependency> + </dependencies> + + +</project> diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyBaseException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyBaseException.java new file mode 100644 index 0000000000..1fe933b174 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyBaseException.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.openecomp.mso.cloudify.base.client; + +/** + * A common abstract parent of all Openstack Exception types, allowing + * calling classes the choice to catch all error exceptions together. + */ +public abstract class CloudifyBaseException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + /* + * Implement only the basic constructors + */ + public CloudifyBaseException () {} + + public CloudifyBaseException(String message) { + super(message); + } + + public CloudifyBaseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java new file mode 100644 index 0000000000..03f5a9907b --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java @@ -0,0 +1,130 @@ +/*- + * ============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.openecomp.mso.cloudify.base.client; + +import java.util.Properties; + +import org.openecomp.mso.cloudify.connector.http.HttpClientConnector; + +public class CloudifyClient { + + protected String managerEndpoint; + protected String tenant = "default_tenant"; // Note - only default_tenant supported in community edition + + protected CloudifyTokenProvider tokenProvider; + + protected static int AUTHENTICATION_RETRIES = 1; + + protected CloudifyClientConnector connector; + + protected Properties properties = new Properties(); + + public CloudifyClient(String managerEndpoint) { + this.managerEndpoint = managerEndpoint; + this.connector = new HttpClientConnector(); + } + + public CloudifyClient(String managerEndpoint, String tenant) { + this.managerEndpoint = managerEndpoint; + this.tenant = tenant; + this.connector = new HttpClientConnector(); + } + + public CloudifyClient(String managerEndpoint, CloudifyClientConnector connector) { + this.managerEndpoint = managerEndpoint; + this.connector = connector; + } + + /** + * Execute a Cloudify request by making the REST API call. Return the + * complete CloudifyResponse structure, which includes the complete + * HTTP response. + * @param request a CloudifyRequest object + * @return a CloudifyResponse object + */ + public <T> CloudifyResponse request(CloudifyRequest<T> request) { + CloudifyResponseException authException = null; + + for (int i = 0; i <= AUTHENTICATION_RETRIES; i++) { + request.endpoint(managerEndpoint); + request.header("Tenant", tenant); + if (tokenProvider != null) + request.header("Authentication-Token", tokenProvider.getToken()); + + try { + return connector.request(request); + } catch (CloudifyResponseException e) { + if (e.getStatus() != CloudifyResponseStatus.NOT_AUTHORIZED + || tokenProvider == null) { + throw e; + } + authException = e; + tokenProvider.expireToken(); + } + } + + throw authException; + } + + /** + * Execute a CloudifyRequest by sending the REST API call to the Cloudify + * Manager endpoint. The return type is a JSON POJO object containing the + * response body entity. + * @param request + * @return a JSON POJO object specific to the request type + */ + public <T> T execute(CloudifyRequest<T> request) { + CloudifyResponse response = request(request); + return (request.returnType() != null && request.returnType() != Void.class) ? response.getEntity(request.returnType()) : null; + } + + public void property(String property, String value) { + properties.put(property, value); + } + + /** + * Set a Token Provider. This class should be able to produce an + * authentication token on-demand. + * @param tokenProvider + */ + public void setTokenProvider(CloudifyTokenProvider tokenProvider) { + this.tokenProvider = tokenProvider; + } + + /** + * Manually set the authentication token to use for this client. + * @param token + */ + public void setToken(String token) { + setTokenProvider(new CloudifySimpleTokenProvider(token)); + } + + /** + * Perform a simple GET request with no request message body + * @param path + * @param returnType + * @return An object of Class <R> + */ + public <R> CloudifyRequest<R> get(String path, Class<R> returnType) { + return new CloudifyRequest<R>(this, HttpMethod.GET, path, null, returnType); + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientConnector.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientConnector.java new file mode 100644 index 0000000000..12162c3d4f --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientConnector.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.openecomp.mso.cloudify.base.client; + + +public interface CloudifyClientConnector { + + public <T> CloudifyResponse request(CloudifyRequest<T> request); + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientTokenProvider.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientTokenProvider.java new file mode 100644 index 0000000000..946720bb45 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClientTokenProvider.java @@ -0,0 +1,85 @@ +/*- + * ============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.openecomp.mso.cloudify.base.client; + +import java.util.Date; + +import org.apache.commons.lang.time.DateUtils; + +import org.openecomp.mso.cloudify.v3.client.Cloudify; +import org.openecomp.mso.cloudify.v3.client.TokensResource.GetToken; +import org.openecomp.mso.cloudify.v3.model.Token; + +/** + * Cloudify Token Provider that uses the Cloudify client API itself to obtain a token + * + * @author JC1348 + * + */ +public class CloudifyClientTokenProvider implements CloudifyTokenProvider { + + String user; + String password; + String token; + Date expiration; + Cloudify cloudify = null; + + public CloudifyClientTokenProvider(String cloudifyEndpoint, String user, String password) { + this.user = user; + this.password = password; + + cloudify = new Cloudify (cloudifyEndpoint); + } + + @Override + public String getToken() { + Date now = new Date(); + if (token != null && expiration != null && expiration.after(now)) { + return token; + } + + // Create a "Get Token" request. Force basic authentication to acquire the token itself. + GetToken tokenRequest = cloudify.tokens().token(); + tokenRequest.setBasicAuthentication(user, password); + Token newToken = tokenRequest.execute(); + + token = newToken.getValue(); + + if (expiration == null) { + expiration = new Date(); + } + // TODO: Make this property driven (or see if it comes back somehow in response) + expiration = DateUtils.addMinutes(expiration, 10); + + return token; + } + + @Override + /** + * This doesn't actually expire the token in Cloudify. It just prevents this token provider + * from using it. + */ + public void expireToken() { + expiration = null; + token = null; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyConnectException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyConnectException.java new file mode 100644 index 0000000000..3b28b6e3f9 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyConnectException.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.openecomp.mso.cloudify.base.client; + +/** + * Custom RuntimeException to report connection errors to Openstack endpoints. + * Must be a RuntimeException to conform with OpenstackClient interface, which + * does not declare specific Exceptions. + */ +public class CloudifyConnectException extends CloudifyBaseException { + + private static final long serialVersionUID = 7294957362769575271L; + + public CloudifyConnectException(String message) { + super(message); + } + + public CloudifyConnectException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyRequest.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyRequest.java new file mode 100644 index 0000000000..6b0a4c1d13 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyRequest.java @@ -0,0 +1,188 @@ +/*- + * ============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.openecomp.mso.cloudify.base.client; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; + +public class CloudifyRequest<R> { + + private CloudifyClient client; + + public CloudifyRequest() { + + } + + public CloudifyRequest(CloudifyClient client, HttpMethod method, CharSequence path, Entity<?> entity, Class<R> returnType) { + this.client = client; + this.method = method; + this.path = new StringBuilder(path); + this.entity = entity; + this.returnType = returnType; + header("Accept", "application/json"); + } + + private String endpoint; + + private HttpMethod method; + + private StringBuilder path = new StringBuilder(); + + private Map<String, List<Object>> headers = new HashMap<String, List<Object>>(); + + private Entity<?> entity; + + private Class<R> returnType; + + private boolean basicAuth = false; + private String user = null; + private String password = null; + + public CloudifyRequest<R> endpoint(String endpoint) { + this.endpoint = endpoint; + return this; + } + + public String endpoint() { + return endpoint; + } + + public CloudifyRequest<R> method(HttpMethod method) { + this.method = method; + return this; + } + + public HttpMethod method() { + return method; + } + + public CloudifyRequest<R> path(String path) { + this.path.append(path); + return this; + } + + public String path() { + return path.toString(); + } + + public CloudifyRequest<R> header(String name, Object value) { + if(value != null) { + headers.put(name, Arrays.asList(value)); + } + return this; + } + + public Map<String, List<Object>> headers() { + return headers; + } + + public <T> Entity<T> entity(T entity, String contentType) { + return new Entity<T>(entity, contentType); + } + + public Entity<?> entity() { + return entity; + } + + public <T> Entity<T> json(T entity) { + return entity(entity, "application/json"); + } + + public void returnType(Class<R> returnType) { + this.returnType = returnType; + } + + public Class<R> returnType() { + return returnType; + } + + /* + * Use Basic Authentication for this request. If not set, the client will use Token authentication + * if a token provider is defined. Otherwise, no authentication will be applied. + */ + public void setBasicAuthentication (String user, String password) { + this.basicAuth = true; + this.user = user; + this.password= password; + } + + public boolean isBasicAuth () { + return this.basicAuth; + } + + public String getUser() { + return user; + } + + public String getPassword() { + return password; + } + + public R execute() { + return client.execute(this); + } + + public CloudifyResponse request() { + return client.request(this); + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return "CloudifyRequest [endpoint=" + endpoint + ", method=" + method + + ", path=" + path + ", headers=" + headers + ", entity=" + + entity + ", returnType=" + returnType + "]"; + } + + private Map<String, List<Object> > queryParams = new LinkedHashMap<String, List<Object> >(); + + public Map<String, List<Object> > queryParams() { + return queryParams; + } + + public CloudifyRequest<R> queryParam(String key, Object value) { + if (queryParams.containsKey(key)) { + List<Object> values = queryParams.get(key); + values.add(value); + } else { + List<Object> values = new ArrayList<Object>(); + values.add(value); + queryParams.put(key, values); + } + + return this; + } + + protected static String buildPath(String ... elements) { + StringBuilder stringBuilder = new StringBuilder(); + for (String element : elements) { + stringBuilder.append(element); + } + + return stringBuilder.toString(); + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponse.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponse.java new file mode 100644 index 0000000000..7ddeaa8c4b --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponse.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.openecomp.mso.cloudify.base.client; + +import java.io.InputStream; +import java.util.Map; + +public interface CloudifyResponse { + + public <T> T getEntity(Class<T> returnType); + + public <T> T getErrorEntity(Class<T> returnType); + + public InputStream getInputStream(); + + public String getHeader(String name); + + public Map<String, String> headers(); + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseException.java new file mode 100644 index 0000000000..27e61f9581 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseException.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.openecomp.mso.cloudify.base.client; + +import org.openecomp.mso.cloudify.v3.model.CloudifyError; + +public class CloudifyResponseException extends CloudifyBaseException { + + private static final long serialVersionUID = 7294957362769575271L; + + protected String message; + protected int status; + + // Make the response available for exception handling (includes body) + protected CloudifyResponse response; + + public CloudifyResponseException(String message, int status) { + this.message = message; + this.status = status; + this.response = null; + } + + // Include the response message itself. The body is a CloudifyError JSON structure. + public CloudifyResponseException(String message, int status, CloudifyResponse response) { + CloudifyError error = response.getErrorEntity(CloudifyError.class); + this.message = message + ": " + error.getErrorCode(); + this.status = status; + this.response = response; + } + + public String getMessage() { + return message; + } + + public int getStatus() { + return status; + } + + public CloudifyResponse getResponse() { + return response; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseStatus.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseStatus.java new file mode 100644 index 0000000000..38079d6f26 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyResponseStatus.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.openecomp.mso.cloudify.base.client; + +public class CloudifyResponseStatus { + + public static final int OK = 200; + + public static final int ACCEPTED = 201; + + public static final int BAD_REQUEST = 400; + + public static final int NOT_AUTHORIZED = 401; + + public static final int NOT_FOUND = 404; + + public static final int CONFLICT = 409; + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifySimpleTokenProvider.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifySimpleTokenProvider.java new file mode 100644 index 0000000000..8f37e069d9 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifySimpleTokenProvider.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.openecomp.mso.cloudify.base.client; + +public class CloudifySimpleTokenProvider implements CloudifyTokenProvider { + + String token; + + public CloudifySimpleTokenProvider(String token) { + this.token = token; + } + + @Override + public String getToken() { + return this.token; + } + + @Override + public void expireToken() { + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyTokenProvider.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyTokenProvider.java new file mode 100644 index 0000000000..ee32f9321d --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyTokenProvider.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.openecomp.mso.cloudify.base.client; + +public interface CloudifyTokenProvider { + + String getToken(); + + void expireToken(); + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/Entity.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/Entity.java new file mode 100644 index 0000000000..db2587937b --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/Entity.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.openecomp.mso.cloudify.base.client; + +public class Entity<T> { + + private T entity; + + private String contentType; + + public static <T> Entity<T> json(T entity) { + return new Entity<T>(entity, "application/json"); + } + + public static <T> Entity<T> stream(T entity) { + return new Entity<T>(entity, "application/octet-stream"); + } + + public Entity(T entity, String contentType) { + super(); + this.entity = entity; + this.contentType = contentType; + } + + /** + * @return the entity + */ + public T getEntity() { + return entity; + } + + /** + * @param entity the entity to set + */ + public void setEntity(T entity) { + this.entity = entity; + } + + /** + * @return the contentType + */ + public String getContentType() { + return contentType; + } + + /** + * @param contentType the contentType to set + */ + public void setContentType(String contentType) { + this.contentType = contentType; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/HttpMethod.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/HttpMethod.java new file mode 100644 index 0000000000..a8c0cab2d8 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/HttpMethod.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.openecomp.mso.cloudify.base.client; + +public enum HttpMethod { + HEAD, GET, POST, PUT, PATCH, DELETE, OPTIONS, TRACE +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientConnector.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientConnector.java new file mode 100644 index 0000000000..421f62a437 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientConnector.java @@ -0,0 +1,245 @@ +/*- + * ============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.openecomp.mso.cloudify.connector.http; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpStatus; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpResponseException; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.InputStreamEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.openecomp.mso.cloudify.base.client.CloudifyClientConnector; +import org.openecomp.mso.cloudify.base.client.CloudifyConnectException; +import org.openecomp.mso.cloudify.base.client.CloudifyRequest; +import org.openecomp.mso.cloudify.base.client.CloudifyResponse; +import org.openecomp.mso.cloudify.base.client.CloudifyResponseException; +import org.openecomp.mso.logger.MsoLogger; + +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.annotation.JsonRootName; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; + +public class HttpClientConnector implements CloudifyClientConnector { + + public static ObjectMapper DEFAULT_MAPPER; + public static ObjectMapper WRAPPED_MAPPER; + + private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA); + + static { + DEFAULT_MAPPER = new ObjectMapper(); + + DEFAULT_MAPPER.setSerializationInclusion(Include.NON_NULL); + DEFAULT_MAPPER.disable(SerializationFeature.INDENT_OUTPUT); + DEFAULT_MAPPER.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + DEFAULT_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + + WRAPPED_MAPPER = new ObjectMapper(); + + WRAPPED_MAPPER.setSerializationInclusion(Include.NON_NULL); + WRAPPED_MAPPER.disable(SerializationFeature.INDENT_OUTPUT); + WRAPPED_MAPPER.enable(SerializationFeature.WRAP_ROOT_VALUE); + WRAPPED_MAPPER.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); + WRAPPED_MAPPER.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); + WRAPPED_MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + } + + protected static <T> ObjectMapper getObjectMapper (Class<T> type) { + return type.getAnnotation(JsonRootName.class) == null ? DEFAULT_MAPPER : WRAPPED_MAPPER; + } + + public <T> CloudifyResponse request(CloudifyRequest<T> request) { + + CloseableHttpClient httpClient = null; //HttpClients.createDefault(); + + if (request.isBasicAuth()) { + // Use Basic Auth for this request. + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, + new UsernamePasswordCredentials (request.getUser(), request.getPassword())); + + httpClient = HttpClients.custom().setRedirectStrategy(new HttpClientRedirectStrategy()).setDefaultCredentialsProvider(credentialsProvider).build(); + } + else { + // Don't use basic authentication. The Client will attempt Token-based authentication + httpClient = HttpClients.custom().setRedirectStrategy(new HttpClientRedirectStrategy()).build(); + } + + URI uri = null; + + // Build the URI with query params + try { + URIBuilder uriBuilder = new URIBuilder(request.endpoint() + request.path()); + + for(Map.Entry<String, List<Object> > entry : request.queryParams().entrySet()) { + for (Object o : entry.getValue()) { + uriBuilder.setParameter(entry.getKey(), String.valueOf(o)); + } + } + + uri = uriBuilder.build(); + } catch (URISyntaxException e) { + throw new HttpClientException (e); + } + + HttpEntity entity = null; + if (request.entity() != null) { + // Special handling for streaming input + if (request.entity().getEntity() instanceof InputStream) { + // Entity is an InputStream + entity = new InputStreamEntity ((InputStream) request.entity().getEntity()); + } + else { + // Assume to be JSON. Flatten the entity to a Json string + try { + // Get appropriate mapper, based on existence of a root element in Entity class + ObjectMapper mapper = getObjectMapper (request.entity().getEntity().getClass()); + + String entityJson = mapper.writeValueAsString (request.entity().getEntity()); + entity = new StringEntity(entityJson, ContentType.create(request.entity().getContentType())); + + LOGGER.debug ("Request JSON Body: " + entityJson.replaceAll("\"password\":\"[^\"]*\"", "\"password\":\"***\"")); + + } catch (JsonProcessingException e) { + throw new HttpClientException ("Json processing error on request entity", e); + } catch (IOException e) { + throw new HttpClientException ("Json IO error on request entity", e); + } + } + } + + // Determine the HttpRequest class based on the method + HttpUriRequest httpRequest; + + switch (request.method()) { + case POST: + HttpPost post = new HttpPost(uri); + post.setEntity (entity); + httpRequest = post; + break; + + case GET: + httpRequest = new HttpGet(uri); + break; + + case PUT: + HttpPut put = new HttpPut(uri); + put.setEntity (entity); + httpRequest = put; + break; + + case DELETE: + httpRequest = new HttpDelete(uri); + break; + + default: + throw new HttpClientException ("Unrecognized HTTP Method: " + request.method()); + } + + for (Entry<String, List<Object>> h : request.headers().entrySet()) { + StringBuilder sb = new StringBuilder(); + for (Object v : h.getValue()) { + sb.append(String.valueOf(v)); + } + httpRequest.addHeader(h.getKey(), sb.toString()); + } + + // Get the Response. But don't get the body entity yet, as this response + // will be wrapped in an HttpClientResponse. The HttpClientResponse + // buffers the body in constructor, so can close the response here. + HttpClientResponse httpClientResponse = null; + CloseableHttpResponse httpResponse = null; + + // Catch known HttpClient exceptions, and wrap them in OpenStack Client Exceptions + // so calling functions can distinguish. Only RuntimeExceptions are allowed. + try { + httpResponse = httpClient.execute(httpRequest); + + LOGGER.debug ("Response status: " + httpResponse.getStatusLine().getStatusCode()); + + httpClientResponse = new HttpClientResponse (httpResponse); + + int status = httpResponse.getStatusLine().getStatusCode(); + if (status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED || + status == HttpStatus.SC_NO_CONTENT || status == HttpStatus.SC_ACCEPTED) + { + return httpClientResponse; + } + } + catch (HttpResponseException e) { + // What exactly does this mean? It does not appear to get thrown for + // non-2XX responses as documented. + throw new CloudifyResponseException(e.getMessage(), e.getStatusCode()); + } + catch (UnknownHostException e) { + throw new CloudifyConnectException("Unknown Host: " + e.getMessage()); + } + catch (IOException e) { + // Catch all other IOExceptions and throw as OpenStackConnectException + throw new CloudifyConnectException(e.getMessage()); + } + catch (Exception e) { + // Catchall for anything else, must throw as a RuntimeException + e.printStackTrace(); + throw new RuntimeException("Unexpected client exception", e); + } + finally { + // Have the body. Close the stream + if (httpResponse != null) + try { + httpResponse.close(); + } catch (IOException e) { + LOGGER.debug("Unable to close HTTP Response: " + e); + } + } + + // Get here on an error response (4XX-5XX) + throw new CloudifyResponseException(httpResponse.getStatusLine().getReasonPhrase(), + httpResponse.getStatusLine().getStatusCode(), + httpClientResponse); + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientException.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientException.java new file mode 100644 index 0000000000..d5eb675257 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientException.java @@ -0,0 +1,42 @@ +/*- + * ============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.openecomp.mso.cloudify.connector.http; + +/* + * Declare a RuntimeException since the Interface does not declare any + * throwables. Any caught exception will be wrapped in HttpClientException + */ +public class HttpClientException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public HttpClientException (String s) { + super (s); + } + + public HttpClientException (Exception e) { + super ("Caught nested exception in HttpClient", e); + } + + public HttpClientException (String s, Exception e) { + super (s, e); + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientRedirectStrategy.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientRedirectStrategy.java new file mode 100644 index 0000000000..809c5d0175 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientRedirectStrategy.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.openecomp.mso.cloudify.connector.http; + +import java.net.URI; + +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.ProtocolException; +import org.apache.http.annotation.Immutable; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpHead; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.impl.client.DefaultRedirectStrategy; +import org.apache.http.protocol.HttpContext; + +/** + * Custom {@link org.apache.http.client.RedirectStrategy} implementation + * that automatically redirects all HEAD, GET and DELETE requests. + * The {@link org.apache.http.client.DefaultRedirectStrategy} only + * redirects GET and HEAD automatically, per the HTTP specification + * (POST and PUT typically have bodies and thus cannot be redirected). + * + * A custom strategy is needed for the Openstack API, which can also send + * 302 on a DELETE (by name) request, expecting the client to follow the + * redirect to perform the actual deletion. + */ +@Immutable +public class HttpClientRedirectStrategy extends DefaultRedirectStrategy { + + /** + * Redirectable methods. + */ + private static final String[] REDIRECT_METHODS = new String[] { + HttpGet.METHOD_NAME, + HttpDelete.METHOD_NAME, + HttpHead.METHOD_NAME + }; + + /** + * Determine if the request should be redirected. + * This may not actually be needed, since the REDIRECT_METHODS + * array has been updated with the DELETE. + */ + @Override + protected boolean isRedirectable(final String method) { + for (final String m: REDIRECT_METHODS) { + if (m.equalsIgnoreCase(method)) { + return true; + } + } + return false; + } + + /** + * Override the default redirect handling method. As implemented + * in HttpClient, it does not preserve the method on 301 or 302 + * responses, always redirecting to a GET. + */ + @Override + public HttpUriRequest getRedirect( + final HttpRequest request, + final HttpResponse response, + final HttpContext context) throws ProtocolException { + + final URI uri = getLocationURI(request, response, context); + final String method = request.getRequestLine().getMethod(); + if (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) { + return new HttpHead(uri); + } else if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) { + return new HttpGet(uri); + } else { + + final int status = response.getStatusLine().getStatusCode(); + + HttpUriRequest newRequest = null; + if (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_TEMPORARILY) { + newRequest = RequestBuilder.copy(request).setUri(uri).build(); + } else { + newRequest = new HttpGet(uri); + } + return newRequest; + } + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientResponse.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientResponse.java new file mode 100644 index 0000000000..a49f96cf0d --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/connector/http/HttpClientResponse.java @@ -0,0 +1,107 @@ +/*- + * ============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.openecomp.mso.cloudify.connector.http; + +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.openecomp.mso.cloudify.base.client.CloudifyResponse; +import org.openecomp.mso.logger.MsoLogger; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +public class HttpClientResponse implements CloudifyResponse { + + private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA); + + private HttpResponse response = null; + private String entityBody = null; + + public HttpClientResponse(HttpResponse response) + { + this.response = response; + + // Read the body so InputStream can be closed + if (response.getEntity() == null) { + // No body + LOGGER.debug ("No Response Body"); + return; + } + + ByteArrayOutputStream responseBody = new ByteArrayOutputStream(); + try { + response.getEntity().writeTo(responseBody); + } catch (IOException e) { + throw new HttpClientException ("Error Reading Response Body", e); + } + entityBody = responseBody.toString(); + LOGGER.debug (entityBody); + } + + + @Override + public <T> T getEntity (Class<T> returnType) { + // Get appropriate mapper, based on existence of a root element + ObjectMapper mapper = HttpClientConnector.getObjectMapper (returnType); + + T resp = null; + try { + resp = mapper.readValue(entityBody, returnType); + } catch (Exception e) { + throw new HttpClientException ("Caught exception in getEntity", e); + } + return resp; + } + + @Override + public <T> T getErrorEntity(Class<T> returnType) { + return getEntity(returnType); + } + + @Override + public InputStream getInputStream() { + return new ByteArrayInputStream (entityBody.getBytes()); + } + + @Override + public String getHeader(String name) { + return response.getFirstHeader(name).getValue(); + } + + @Override + public Map<String, String> headers() { + Map<String, String> headers = new HashMap<String, String>(); + + Header responseHeaders[] = response.getAllHeaders(); + for (Header h : responseHeaders) { + headers.put(h.getName(), h.getValue()); + } + + return headers; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/BlueprintsResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/BlueprintsResource.java new file mode 100644 index 0000000000..988f8214d1 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/BlueprintsResource.java @@ -0,0 +1,103 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.client; + +import java.io.InputStream; + +import org.openecomp.mso.cloudify.v3.model.Blueprint; +import org.openecomp.mso.cloudify.v3.model.Blueprints; +import org.openecomp.mso.cloudify.base.client.Entity; +import org.openecomp.mso.cloudify.base.client.HttpMethod; +import org.openecomp.mso.cloudify.base.client.CloudifyClient; +import org.openecomp.mso.cloudify.base.client.CloudifyRequest; + +public class BlueprintsResource { + + private final CloudifyClient client; + + public BlueprintsResource(CloudifyClient client) { + this.client = client; + } + + /* + * Upload a blueprint package directly. The blueprint must be a ZIP archive. + * However, this method will not validate this. + */ + public UploadBlueprint uploadFromStream (String blueprintId, String mainFileName, InputStream blueprint) { + return new UploadBlueprint (blueprintId, mainFileName, blueprint, null); + } + + public UploadBlueprint uploadFromUrl (String blueprintId, String mainFileName, String blueprintUrl) { + return new UploadBlueprint (blueprintId, mainFileName, null, blueprintUrl); + } + + public ListBlueprints list() { + return new ListBlueprints(); + } + + public GetBlueprint getById(String id) { + return new GetBlueprint(id, null); + } + + // Return all of the metadata, but not the plan + public GetBlueprint getMetadataById(String id) { + return new GetBlueprint(id, "?_include=id,main_file_name,description,tenant_name,created_at,updated_at"); + } + + public DeleteBlueprint deleteById(String id) { + return new DeleteBlueprint(id); + } + + public class UploadBlueprint extends CloudifyRequest<Blueprint> { + public UploadBlueprint(String blueprintId, String mainFileName, InputStream blueprint, String blueprintUrl) { + // Initialize the request elements dynamically. + // Either a blueprint input stream or a URL will be provided. + // If a URL is provided, add it to the query string + // If a Stream is provided, set it as the Entity body + super(client, HttpMethod.PUT, + "/api/v3/blueprints/" + blueprintId + "?application_file_name=" + mainFileName + ((blueprintUrl != null) ? "&blueprint_archive=" + blueprintUrl : ""), + ((blueprint != null) ? Entity.stream(blueprint) : null), + Blueprint.class); + } + } + + public class DeleteBlueprint extends CloudifyRequest<Blueprint> { + public DeleteBlueprint(String blueprintId) { + super(client, HttpMethod.DELETE, "/api/v3/blueprints/" + blueprintId, null, Blueprint.class); + } + } + + public class GetBlueprint extends CloudifyRequest<Blueprint> { + public GetBlueprint(String id, String queryArgs) { + super(client, HttpMethod.GET, "/api/v3/blueprints/" + id + queryArgs, null, Blueprint.class); + } + } + + public class ListBlueprints extends CloudifyRequest<Blueprints> { + public ListBlueprints() { + super(client, HttpMethod.GET, "/api/v3/blueprints", null, Blueprints.class); + } + } + + // TODO: DownloadBlueprint is not supported, as it needs to return an input stream + // containing the full blueprint ZIP. + // For a full client library, this will require returning an open stream as the entity... +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/Cloudify.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/Cloudify.java new file mode 100644 index 0000000000..c0669b9919 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/Cloudify.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.openecomp.mso.cloudify.v3.client; + +import org.openecomp.mso.cloudify.base.client.CloudifyClient; +import org.openecomp.mso.cloudify.base.client.CloudifyClientConnector; + +/** + * Reference: http://docs.getcloudify.org/api/v3/ + */ +public class Cloudify extends CloudifyClient { + + private final DeploymentsResource deployments; + private final BlueprintsResource blueprints; + private final TokensResource tokens; + private final NodeInstancesResource nodeInstances; + private final ExecutionsResource executions; + +/* Not supporting dynamic connectors + public Cloudify(String endpoint, CloudifyClientConnector connector) { + super(endpoint, connector); + deployments = new DeploymentsResource(this); + blueprints = new BlueprintsResource(this); + nodeInstances = new NodeInstancesResource(this); + tokens = new TokensResource(this); + } +*/ + public Cloudify(String endpoint, String tenant) { + super(endpoint, tenant); + deployments = new DeploymentsResource(this); + blueprints = new BlueprintsResource(this); + nodeInstances = new NodeInstancesResource(this); + executions = new ExecutionsResource(this); + tokens = new TokensResource(this); + } + + public Cloudify(String endpoint) { + super(endpoint); + deployments = new DeploymentsResource(this); + blueprints = new BlueprintsResource(this); + nodeInstances = new NodeInstancesResource(this); + executions = new ExecutionsResource(this); + tokens = new TokensResource(this); + } + + public DeploymentsResource deployments() { + return this.deployments; + } + + public BlueprintsResource blueprints() { + return this.blueprints; + } + + public NodeInstancesResource nodeInstances() { + return this.nodeInstances; + } + + public ExecutionsResource executions() { + return this.executions; + } + + public TokensResource tokens() { + return this.tokens; + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/DeploymentsResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/DeploymentsResource.java new file mode 100644 index 0000000000..e115370243 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/DeploymentsResource.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.openecomp.mso.cloudify.v3.client; + +import org.openecomp.mso.cloudify.v3.model.CreateDeploymentParams; +import org.openecomp.mso.cloudify.v3.model.Deployment; +import org.openecomp.mso.cloudify.v3.model.DeploymentOutputs; +import org.openecomp.mso.cloudify.v3.model.Deployments; +import org.openecomp.mso.cloudify.base.client.Entity; +import org.openecomp.mso.cloudify.base.client.HttpMethod; +import org.openecomp.mso.cloudify.base.client.CloudifyClient; +import org.openecomp.mso.cloudify.base.client.CloudifyRequest; + +public class DeploymentsResource { + + private final CloudifyClient client; + + public DeploymentsResource(CloudifyClient client) { + this.client = client; + } + + public CreateDeployment create(String deploymentId, CreateDeploymentParams body) { + return new CreateDeployment(deploymentId, body); + } + + public ListDeployments list() { + return new ListDeployments(); + } + + public GetDeployment byId(String id) { + return new GetDeployment(id); + } + + public GetDeploymentOutputs outputsById(String id) { + return new GetDeploymentOutputs(id); + } + + public DeleteDeployment deleteByName(String name) { + return new DeleteDeployment(name); + } + + public class CreateDeployment extends CloudifyRequest<Deployment> { + public CreateDeployment(String deploymentId, CreateDeploymentParams body) { + super(client, HttpMethod.PUT, "/api/v3/deployments/" + deploymentId, Entity.json(body), Deployment.class); + } + } + + public class DeleteDeployment extends CloudifyRequest<Deployment> { + public DeleteDeployment(String deploymentId) { + super(client, HttpMethod.DELETE, "/api/v3/deployments/" + deploymentId, null, Deployment.class); + } + } + + public class GetDeployment extends CloudifyRequest<Deployment> { + public GetDeployment(String id) { + super(client, HttpMethod.GET, "/api/v3/deployments/" + id, null, Deployment.class); + } + } + + public class GetDeploymentOutputs extends CloudifyRequest<DeploymentOutputs> { + public GetDeploymentOutputs(String id) { + super(client, HttpMethod.GET, "/api/v3/deployments/" + id + "/outputs", null, DeploymentOutputs.class); + } + } + + public class ListDeployments extends CloudifyRequest<Deployments> { + public ListDeployments() { + super(client, HttpMethod.GET, "/api/v3/deployments", null, Deployments.class); + } + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/ExecutionsResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/ExecutionsResource.java new file mode 100644 index 0000000000..43bc82b0b3 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/ExecutionsResource.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.openecomp.mso.cloudify.v3.client; + +import org.openecomp.mso.cloudify.v3.model.CancelExecutionParams; +import org.openecomp.mso.cloudify.v3.model.Execution; +import org.openecomp.mso.cloudify.v3.model.Executions; +import org.openecomp.mso.cloudify.v3.model.StartExecutionParams; +import org.openecomp.mso.cloudify.v3.model.UpdateExecutionParams; +import org.openecomp.mso.cloudify.base.client.Entity; +import org.openecomp.mso.cloudify.base.client.HttpMethod; +import org.openecomp.mso.cloudify.base.client.CloudifyClient; +import org.openecomp.mso.cloudify.base.client.CloudifyRequest; + +public class ExecutionsResource { + + private final CloudifyClient client; + + public ExecutionsResource(CloudifyClient client) { + this.client = client; + } + + public ListExecutions list() { + return new ListExecutions(null); + } + + public ListExecutions listSorted (String sortBy) { + return new ListExecutions("?_sort=" + sortBy); + } + + // Return a filtered list. + // The filter parameter should be a query string of filter criteria (without leading "?") + public ListExecutions listFiltered (String filter, String sortBy) { + String listParams = "?" + filter; + if (sortBy != null) listParams += "&_sort=" + sortBy; + return new ListExecutions(listParams); + } + + public GetExecution byId(String id) { + return new GetExecution(id); + } + + public StartExecution start(StartExecutionParams params) { + return new StartExecution(params); + } + + public UpdateExecution updateStatus(String id, String status) { + UpdateExecutionParams params = new UpdateExecutionParams(); + params.setStatus(status); + return new UpdateExecution(id, params); + } + + public CancelExecution cancel(String executionId, CancelExecutionParams params) { + return new CancelExecution(executionId, params); + } + + + public class GetExecution extends CloudifyRequest<Execution> { + public GetExecution (String id) { + super(client, HttpMethod.GET, "/api/v3/executions/" + id, null, Execution.class); + } + } + + public class ListExecutions extends CloudifyRequest<Executions> { + public ListExecutions(String listParams) { + super(client, HttpMethod.GET, "/api/v3/executions" + ((listParams!=null) ? listParams : ""), null, Executions.class); + } + } + + public class StartExecution extends CloudifyRequest<Execution> { + public StartExecution(StartExecutionParams body) { + super(client, HttpMethod.POST, "/api/v3/executions", Entity.json(body), Execution.class); + } + } + + public class UpdateExecution extends CloudifyRequest<Execution> { + public UpdateExecution(String executionId, UpdateExecutionParams body) { + super(client, HttpMethod.PATCH, "/api/v3/executions/" + executionId, Entity.json(body), Execution.class); + } + } + + public class CancelExecution extends CloudifyRequest<Execution> { + public CancelExecution(String executionId, CancelExecutionParams body) { + super(client, HttpMethod.POST, "/api/v3/executions/" + executionId, Entity.json(body), Execution.class); + } + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/NodeInstancesResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/NodeInstancesResource.java new file mode 100644 index 0000000000..19f7958434 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/NodeInstancesResource.java @@ -0,0 +1,70 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.client; + +import org.openecomp.mso.cloudify.v3.model.UpdateNodeInstanceParams; +import org.openecomp.mso.cloudify.v3.model.NodeInstance; +import org.openecomp.mso.cloudify.v3.model.NodeInstances; +import org.openecomp.mso.cloudify.base.client.Entity; +import org.openecomp.mso.cloudify.base.client.HttpMethod; +import org.openecomp.mso.cloudify.base.client.CloudifyClient; +import org.openecomp.mso.cloudify.base.client.CloudifyRequest; + +public class NodeInstancesResource { + + private final CloudifyClient client; + + public NodeInstancesResource(CloudifyClient client) { + this.client = client; + } + + public ListNodeInstances list() { + return new ListNodeInstances(); + } + + public GetNodeInstance byId(String id) { + return new GetNodeInstance(id); + } + + public UpdateNodeInstance update(String id, UpdateNodeInstanceParams params) { + return new UpdateNodeInstance(id, params); + } + + + public class GetNodeInstance extends CloudifyRequest<NodeInstance> { + public GetNodeInstance (String id) { + super(client, HttpMethod.GET, "/api/v3/node-instances/" + id, null, NodeInstance.class); + } + } + + public class ListNodeInstances extends CloudifyRequest<NodeInstances> { + public ListNodeInstances() { + super(client, HttpMethod.GET, "/api/v3/node-instances", null, NodeInstances.class); + } + } + + public class UpdateNodeInstance extends CloudifyRequest<NodeInstance> { + public UpdateNodeInstance(String nodeInstanceId, UpdateNodeInstanceParams body) { + super(client, HttpMethod.PATCH, "/api/v3/node-instances/" + nodeInstanceId, Entity.json(body), NodeInstance.class); + } + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/TokensResource.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/TokensResource.java new file mode 100644 index 0000000000..80e5fb0065 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/client/TokensResource.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.openecomp.mso.cloudify.v3.client; + +import org.openecomp.mso.cloudify.v3.model.Token; +import org.openecomp.mso.cloudify.base.client.HttpMethod; +import org.openecomp.mso.cloudify.base.client.CloudifyClient; +import org.openecomp.mso.cloudify.base.client.CloudifyRequest; + +public class TokensResource { + + private final CloudifyClient client; + + public TokensResource(CloudifyClient client) { + this.client = client; + } + + /* + * Get a new token for a user + * TODO: User ID/Password logic need to be in the Client. + * Results of a token query should also be able to add to the Client + */ + public GetToken token() { + return new GetToken(); + } + + public class GetToken extends CloudifyRequest<Token> { + public GetToken() { + super(client, HttpMethod.GET, "/api/v3/tokens", null, Token.class); + } + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprint.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprint.java new file mode 100644 index 0000000000..a33c5206f2 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprint.java @@ -0,0 +1,160 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.model; + +import java.io.IOException; +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; + +@JsonIgnoreProperties(ignoreUnknown = true) +//@JsonRootName("blueprint") +public class Blueprint implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("created_at") + private Date createdAt; + + @JsonProperty("description") + private String description; + + @JsonProperty("id") + private String id; + + @JsonProperty("main_file_name") + private String mainFileName; + + @JsonProperty("plan") + private Map<String, Object> plan = null; + + @JsonProperty("tenant_name") + private String tenantName; + + @JsonProperty("updated_at") + private Date updatedAt; + + // ObjectMapper instance to parse Json stack outputs + @JsonIgnore + private static ObjectMapper mapper = new ObjectMapper(); + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMainFileName() { + return mainFileName; + } + + public void setMainFileName(String mainFileName) { + this.mainFileName = mainFileName; + } + + public Map<String, Object> getPlan() { + return this.plan; + } + + public void setPlan(Map<String, Object> plan) { + this.plan = plan; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + + /* + * Return an output as a Json-mapped Object of the provided type. + * This is useful for json-object outputs. + */ + public <T> T getMapValue (Map<String,Object> map, String key, Class<T> type) + { + if (map.containsKey(key)) { + try { + String s = mapper.writeValueAsString(map.get(key)); + return (mapper.readValue(s, type)); + } + catch (IOException e) { + return null; + } + } + return null; + } + + @Override + public String toString() { + return "Deployment{" + + "id='" + id + '\'' + + ", description='" + description + '\'' + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + ", mainFileName='" + mainFileName + '\'' + + ", tenantName='" + tenantName + '\'' + + '}'; + } + + /* Add a definition of the Cloudify "plan" attribute once we know what it is. + + @JsonIgnoreProperties(ignoreUnknown=true) + public static final class Plan { + } + +*/ + + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprints.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprints.java new file mode 100644 index 0000000000..bf9b376eaa --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Blueprints.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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Blueprints implements Serializable{ + + private static final long serialVersionUID = 1L; + + @JsonProperty("items") + private List<Blueprint> items; + + @JsonProperty("metadata") + private Metadata metadata; + + public List<Blueprint> getItems() { + return items; + } + + public void setItems(List<Blueprint> items) { + this.items = items; + } + + public Metadata getMetadata() { + return metadata; + } + + public void setMetadata(Metadata metadata) { + this.metadata = metadata; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CancelExecutionParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CancelExecutionParams.java new file mode 100644 index 0000000000..5d7672549b --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CancelExecutionParams.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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CancelExecutionParams implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("action") + private String action; + + public final static String CANCEL_ACTION = "cancel"; + public final static String FORCE_CANCEL_ACTION = "force-cancel"; + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + + @Override + public String toString() { + return "CancelExecutionParams{" + + "action='" + action + '\'' + + '}'; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CloudifyError.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CloudifyError.java new file mode 100644 index 0000000000..fcd9120c78 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CloudifyError.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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * This class represents a generic Cloudify error response body. + * These responses have a common format: + * { + * "message": "<error message>", + * "error_code": "<cloudify error id string>". + * "server_traceback": "<Python traceback>" + * } + * + * @author jc1348 + */ +public class CloudifyError implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("message") + private String message; + + @JsonProperty("error_code") + private String errorCode; + + @JsonProperty("server_traceback") + private String serverTraceback; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + public String getServerTraceback() { + return serverTraceback; + } + + public void setServerTraceback(String serverTraceback) { + this.serverTraceback = serverTraceback; + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CreateDeploymentParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CreateDeploymentParams.java new file mode 100644 index 0000000000..f33b7afe4c --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/CreateDeploymentParams.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.openecomp.mso.cloudify.v3.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; +import java.util.Map; + +public class CreateDeploymentParams implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("blueprint_id") + private String blueprintId; + + @JsonProperty("inputs") + private Map<String, Object> inputs; + + public String getBlueprintId() { + return blueprintId; + } + + public void setBlueprintId(String blueprintId) { + this.blueprintId = blueprintId; + } + + public Map<String, Object> getInputs() { + return inputs; + } + + public void setInputs(Map<String, Object> inputs) { + this.inputs = inputs; + } + + @Override + public String toString() { + return "CreateDeploymentBody{" + + "blueprintId='" + blueprintId + '\'' + + ", inputs=" + inputs + + '}'; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployment.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployment.java new file mode 100644 index 0000000000..453dd3f692 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployment.java @@ -0,0 +1,351 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.model; + +import java.io.IOException; +import java.io.Serializable; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; + +@JsonIgnoreProperties(ignoreUnknown = true) +//@JsonRootName("deployment") +public class Deployment implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("blueprint_id") + private String blueprintId; + + @JsonProperty("created_at") + private Date createdAt; + + @JsonProperty("created_by") + private String createdBy; + + @JsonProperty("description") + private String description; + + @JsonProperty("groups") + private Map<String, Group> groups = null; + + @JsonProperty("id") + private String id; + + @JsonProperty("inputs") + private Map<String, Object> inputs = null; + + // TODO: Expand the definition of a PolicyTrigger + @JsonProperty("policy_triggers") + private List<Object> policyTriggers; + + // TODO: Expand the definition of a PolicyType + @JsonProperty("policy_types") + private List<Object> policyTypes; + + @JsonProperty("scaling_groups") + private Map<String, ScalingGroup> scalingGroups = null; + + @JsonProperty("tenant_name") + private String tenantName; + + @JsonProperty("updated_at") + private Date updatedAt; + + @JsonProperty("workflows") + private List<Workflow> workflows; + + // ObjectMapper instance to parse Json object outputs + @JsonIgnore + private static ObjectMapper mapper = new ObjectMapper(); + + public String getBlueprintId() { + return blueprintId; + } + + public void setBlueprintId(String blueprintId) { + this.blueprintId = blueprintId; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Map<String, Group> getGroups() { + return this.groups; + } + + public void setGroups(Map<String, Group> groups) { + this.groups = groups; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Map<String, Object> getInputs() { + return this.inputs; + } + public void setInputs(Map<String, Object> inputs) { + this.inputs = inputs; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public Map<String, ScalingGroup> getScalingGroups() { + return scalingGroups; + } + + public void setScalingGroups(Map<String, ScalingGroup> scalingGroups) { + this.scalingGroups = scalingGroups; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + } + + public List<Workflow> getWorkflows() { + return workflows; + } + + public void setWorkflows(List<Workflow> workflows) { + this.workflows = workflows; + } + + /* + * Nested subclasses for Group definitions + */ + public static final class Group { + @JsonProperty ("policies") + Object policies; + + @JsonProperty("members") + List<String> members; + + public Object getPolicies() { + return policies; + } + + public void setPolicies(Object policies) { + this.policies = policies; + } + + public List<String> getMembers() { + return members; + } + + public void setMembers(List<String> members) { + this.members = members; + } + } + + /* + * Nested subclasses for Scaling Group definitions + */ + public static final class ScalingGroup { + @JsonProperty ("properties") + ScalingGroupProperties properties; + + @JsonProperty("members") + List<String> members; + + public ScalingGroupProperties getProperties() { + return properties; + } + + public void setProperties(ScalingGroupProperties properties) { + this.properties = properties; + } + + public List<String> getMembers() { + return members; + } + + public void setMembers(List<String> members) { + this.members = members; + } + } + + public static final class ScalingGroupProperties { + @JsonProperty("current_instances") + int currentInstances; + + @JsonProperty("default_instances") + int defaultInstances; + + @JsonProperty("max_instances") + int maxInstances; + + @JsonProperty("min_instances") + int minInstances; + + @JsonProperty("planned_instances") + int plannedInstances; + + public int getCurrentInstances() { + return currentInstances; + } + + public void setCurrentInstances(int currentInstances) { + this.currentInstances = currentInstances; + } + + public int getDefaultInstances() { + return defaultInstances; + } + + public void setDefaultInstances(int defaultInstances) { + this.defaultInstances = defaultInstances; + } + + public int getMaxInstances() { + return maxInstances; + } + + public void setMaxInstances(int maxInstances) { + this.maxInstances = maxInstances; + } + + public int getMinInstances() { + return minInstances; + } + + public void setMinInstances(int minInstances) { + this.minInstances = minInstances; + } + + public int getPlannedInstances() { + return plannedInstances; + } + + public void setPlannedInstances(int plannedInstances) { + this.plannedInstances = plannedInstances; + } + } + + /* + * Nested subclass for Deployment Workflow entities. + * Note that Blueprint class also contains a slightly different Workflow structure. + */ + public static final class Workflow { + @JsonProperty("name") + private String name; + @JsonProperty("created_at") + private Date createdAt; + @JsonProperty("parameters") + private Map<String,ParameterDefinition> parameters; + + public Workflow() {} + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Date getCreatedAt() { + return createdAt; + } + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + public Map<String, ParameterDefinition> getParameters() { + return parameters; + } + public void setParameters(Map<String, ParameterDefinition> parameters) { + this.parameters = parameters; + } + } + + /* + * Return an output as a Json-mapped Object of the provided type. + * This is useful for json-object outputs. + */ + public <T> T getMapValue (Map<String,Object> map, String key, Class<T> type) + { + if (map.containsKey(key)) { + try { + String s = mapper.writeValueAsString(map.get(key)); + return (mapper.readValue(s, type)); + } + catch (IOException e) { + return null; + } + } + return null; + } + + @Override + public String toString() { + return "Deployment{" + + "id='" + id + '\'' + + ", description='" + description + '\'' + + ", blueprintId='" + blueprintId + '\'' + + ", createdBy='" + createdBy + '\'' + + ", tenantName='" + tenantName + '\'' + + ", createdAt=" + createdAt + + ", updatedAt=" + updatedAt + + ", inputs='" + inputs + '\'' + + ", workflows=" + workflows + + ", groups=" + groups + + '}'; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/DeploymentOutputs.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/DeploymentOutputs.java new file mode 100644 index 0000000000..11fe7faae0 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/DeploymentOutputs.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.openecomp.mso.cloudify.v3.model; + +import java.io.IOException; +import java.io.Serializable; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; + +@JsonIgnoreProperties(ignoreUnknown = true) +//@JsonRootName("outputs") +public class DeploymentOutputs implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("deployment_id") + private String deploymentId; + + @JsonProperty("outputs") + private Map<String, Object> outputs = null; + + + // ObjectMapper instance to parse Json object outputs + @JsonIgnore + private static ObjectMapper mapper = new ObjectMapper(); + + + public Map<String, Object> getOutputs() { + return this.outputs; + } + public void setOutputs(Map<String, Object> outputs) { + this.outputs = outputs; + } + + public String getDeploymentId() { + return deploymentId; + } + public void setDeploymentId(String deploymentId) { + this.deploymentId = deploymentId; + } + + /* + * Return an output as a Json-mapped Object of the provided type. + * This is useful for json-object outputs. + */ + public <T> T getMapValue (Map<String,Object> map, String key, Class<T> type) + { + if (map.containsKey(key)) { + try { + String s = mapper.writeValueAsString(map.get(key)); + return (mapper.readValue(s, type)); + } + catch (IOException e) { + return null; + } + } + return null; + } + + @Override + public String toString() { + return "DeploymentOutputs{" + + "deploymentId='" + deploymentId + '\'' + + ", outputs='" + outputs + '\'' + + '}'; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployments.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployments.java new file mode 100644 index 0000000000..eb49848869 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Deployments.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.openecomp.mso.cloudify.v3.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; +import java.util.List; + +public class Deployments implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("items") + private List<Deployment> items; + + @JsonProperty("metadata") + private Metadata metadata; + + public List<Deployment> getItems() { + return items; + } + + public void setItems(List<Deployment> items) { + this.items = items; + } + + public Metadata getMetadata() { + return metadata; + } + + public void setMetadata(Metadata metadata) { + this.metadata = metadata; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Execution.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Execution.java new file mode 100644 index 0000000000..65a1015539 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Execution.java @@ -0,0 +1,174 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; +import java.util.Date; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +// @JsonRootName("execution") +public class Execution implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("blueprint_id") + private String blueprintId; + + @JsonProperty("created_at") + private Date createdAt; + + @JsonProperty("created_by") + private String createdBy; + + @JsonProperty("deployment_id") + private String deploymentId; + + @JsonProperty("error") + private String error; + + @JsonProperty("id") + private String id; + + @JsonProperty("is_system_workflow") + private boolean isSystemWorkflow; + + @JsonProperty("parameters") + private Map<String, Object> parameters; + + @JsonProperty("status") + private String status; + + @JsonProperty("tenant_name") + private String tenantName; + + @JsonProperty("workflow_id") + private String workflowId; + + public String getBlueprintId() { + return blueprintId; + } + + public void setBlueprintId(String blueprintId) { + this.blueprintId = blueprintId; + } + + public Date getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getDeploymentId() { + return deploymentId; + } + + public void setDeploymentId(String deploymentId) { + this.deploymentId = deploymentId; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isSystemWorkflow() { + return isSystemWorkflow; + } + + public void setSystemWorkflow(boolean isSystemWorkflow) { + this.isSystemWorkflow = isSystemWorkflow; + } + + public Map<String, Object> getParameters() { + return parameters; + } + + public void setParameters(Map<String, Object> parameters) { + this.parameters = parameters; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getWorkflowId() { + return workflowId; + } + + public void setWorkflowId(String workflowId) { + this.workflowId = workflowId; + } + + @Override + public String toString() { + return "Execution{" + + "id='" + id + '\'' + + ", blueprintId='" + blueprintId + '\'' + + ", createdBy='" + createdBy + '\'' + + ", createdAt=" + createdAt + + ", deploymentId='" + deploymentId + '\'' + + ", error=" + error + + ", isSystemWorkflow=" + isSystemWorkflow + + ", status=" + status + + ", tenantName='" + tenantName + '\'' + + ", parameters=" + parameters + + '}'; + } + + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Executions.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Executions.java new file mode 100644 index 0000000000..a1d9077864 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Executions.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.openecomp.mso.cloudify.v3.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; +import java.util.List; + +public class Executions implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("items") + private List<Execution> items; + + @JsonProperty("metadata") + private Metadata metadata; + + public List<Execution> getItems() { + return items; + } + + public void setItems(List<Execution> items) { + this.items = items; + } + + public Metadata getMetadata() { + return metadata; + } + + public void setMetadata(Metadata metadata) { + this.metadata = metadata; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Metadata.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Metadata.java new file mode 100644 index 0000000000..d44e92b1bc --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Metadata.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.openecomp.mso.cloudify.v3.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; + +/** + * This class represents a generic Cloudify response to a GET command. + * These responses have a common format: + * { + * "items": [ + * List of objects of the requested type + * ], + * "metadata": { + * } + * } + * + * @author jc1348 + * + */ +public class Metadata implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("pagination") + private Pagination pagination; + + + public Pagination getPagination() { + return pagination; + } + + public void setPagination(Pagination pagination) { + this.pagination = pagination; + } + + public class Pagination { + @JsonProperty("total") + private int total; + @JsonProperty("offset") + private int offset; + @JsonProperty("size") + private int size; + + public int getTotal() { + return total; + } + public void setTotal(int total) { + this.total = total; + } + public int getOffset() { + return offset; + } + public void setOffset(int offset) { + this.offset = offset; + } + public int getSize() { + return size; + } + public void setSize(int size) { + this.size = size; + } + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstance.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstance.java new file mode 100644 index 0000000000..f23d9bebd5 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstance.java @@ -0,0 +1,205 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonRootName("node_instance") +public class NodeInstance implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("created_by") + private String createdBy; + + @JsonProperty("deployment_id") + private String deploymentId; + + @JsonProperty("host_id") + private String hostId; + + @JsonProperty("id") + private String id; + + @JsonProperty("node_id") + private String nodeId; + + @JsonProperty("relationships") + private List<Object> relationships = null; + + @JsonProperty("runtime_properties") + private Map<String, Object> runtimeProperties = null; + + @JsonProperty("scaling_groups") + private List<ScalingGroupIdentifier> scalingGroups; + + @JsonProperty("state") + private String state; + + @JsonProperty("tenant_name") + private String tenantName; + + @JsonProperty("version") + private String version; + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getDeploymentId() { + return deploymentId; + } + + public void setDeploymentId(String deploymentId) { + this.deploymentId = deploymentId; + } + + public String getHostId() { + return hostId; + } + + public void setHostId(String hostId) { + this.hostId = hostId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public List<Object> getRelationships() { + return relationships; + } + + public void setRelationships(List<Object> relationships) { + this.relationships = relationships; + } + + public Map<String, Object> getRuntimeProperties() { + return runtimeProperties; + } + + public void setRuntimeProperties(Map<String, Object> runtimeProperties) { + this.runtimeProperties = runtimeProperties; + } + + public List<ScalingGroupIdentifier> getScalingGroups() { + return scalingGroups; + } + + public void setScalingGroups(List<ScalingGroupIdentifier> scalingGroups) { + this.scalingGroups = scalingGroups; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + /* + * Nested structure representing scaling groups in which this node is a member + */ + public static final class ScalingGroupIdentifier + { + @JsonProperty("name") + private String name; + + @JsonProperty("id") + private String id; + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + + public String toString() { + return "Scaling Group{ name=" + name + ", id=" + id + "}"; + } + } + + @Override + public String toString() { + return "Deployment{" + + "id='" + id + '\'' + + "nodeId='" + nodeId + '\'' + + ", createdBy='" + createdBy + '\'' + + ", tenantName='" + tenantName + '\'' + + ", state=" + state + + ", deploymentId=" + deploymentId + + ", hostId='" + hostId + '\'' + + ", version='" + version + '\'' + + ", relationships=" + relationships + + ", runtimeProperties=" + runtimeProperties + + ", scalingGroups=" + scalingGroups + + '}'; + } + + // TODO: Need an object structure for Relationships +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstances.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstances.java new file mode 100644 index 0000000000..bac826cda0 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/NodeInstances.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.openecomp.mso.cloudify.v3.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; +import java.util.List; + +public class NodeInstances implements Serializable{ + + private static final long serialVersionUID = 1L; + + @JsonProperty("items") + private List<NodeInstance> items; + + @JsonProperty("metadata") + private Metadata metadata; + + public List<NodeInstance> getItems() { + return items; + } + + public void setItems(List<NodeInstance> items) { + this.items = items; + } + + public Metadata getMetadata() { + return metadata; + } + + public void setMetadata(Metadata metadata) { + this.metadata = metadata; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/OpenstackConfig.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/OpenstackConfig.java new file mode 100644 index 0000000000..2d927e64e6 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/OpenstackConfig.java @@ -0,0 +1,89 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class OpenstackConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("username") + String username; + + @JsonProperty("password") + String password; + + @JsonProperty("tenant_name") + String tenantName; + + @JsonProperty("auth_url") + String authUrl; + + @JsonProperty("region") + String region; + + // NOTE: Not supporting "custom_configuration" + + 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 getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getAuthUrl() { + return authUrl; + } + + public void setAuthUrl(String authUrl) { + this.authUrl = authUrl; + } + + public String getRegion() { + return region; + } + + public void setRegion(String region) { + this.region = region; + } + + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/ParameterDefinition.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/ParameterDefinition.java new file mode 100644 index 0000000000..677c982621 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/ParameterDefinition.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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +public class ParameterDefinition implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("type") + private String type; + @JsonProperty("description") + private String description; + @JsonProperty("default") + private Object defaultValue; + + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + public Object getDefaultValue() { + return defaultValue; + } + public void setDefaultValue(Object defaultValue) { + this.defaultValue = defaultValue; + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/StartExecutionParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/StartExecutionParams.java new file mode 100644 index 0000000000..397f867e7d --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/StartExecutionParams.java @@ -0,0 +1,98 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class StartExecutionParams implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("workflow_id") + private String workflowId; + + @JsonProperty("deployment_id") + private String deploymentId; + + @JsonProperty("allow_custom_parameters") + private boolean allowCustomParameters; + + @JsonProperty("force") + private boolean force; + + @JsonProperty("parameters") + private Map<String, Object> parameters; + + public String getWorkflowId() { + return workflowId; + } + + public void setWorkflowId(String workflowId) { + this.workflowId = workflowId; + } + + public String getDeploymentId() { + return deploymentId; + } + + public void setDeploymentId(String deploymentId) { + this.deploymentId = deploymentId; + } + + public boolean isAllowCustomParameters() { + return allowCustomParameters; + } + + public void setAllowCustomParameters(boolean allowCustomParameters) { + this.allowCustomParameters = allowCustomParameters; + } + + public boolean isForce() { + return force; + } + + public void setForce(boolean force) { + this.force = force; + } + + public Map<String, Object> getParameters() { + return parameters; + } + + public void setParameters(Map<String, Object> parameters) { + this.parameters = parameters; + } + + @Override + public String toString() { + return "UpdateExecutionParams{" + + "workflowId='" + workflowId + '\'' + + "deploymentId='" + deploymentId + '\'' + + "allowCustomParameters='" + allowCustomParameters + '\'' + + "force='" + force + '\'' + + "parameters='" + parameters + '\'' + + '}'; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Token.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Token.java new file mode 100644 index 0000000000..ddf264c290 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/Token.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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +//@JsonRootName("token") +// The Token object is returned without a root element +public class Token implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("role") + private String role; + + @JsonProperty("value") + private String value; + + // Any expiration? Maybe something in the Headers? + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + + @Override + public String toString() { + return "Token{" + + "role='" + role + '\'' + + ", value='" + value + '\'' + + '}'; + } +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateExecutionParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateExecutionParams.java new file mode 100644 index 0000000000..db827e9761 --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateExecutionParams.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.openecomp.mso.cloudify.v3.model; + +import java.io.Serializable; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class UpdateExecutionParams implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("status") + private String status; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + + @Override + public String toString() { + return "UpdateExecutionParams{" + + "status='" + status + '\'' + + '}'; + } + +} diff --git a/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateNodeInstanceParams.java b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateNodeInstanceParams.java new file mode 100644 index 0000000000..c7f6557f7c --- /dev/null +++ b/cloudify-client/src/main/java/org/openecomp/mso/cloudify/v3/model/UpdateNodeInstanceParams.java @@ -0,0 +1,76 @@ +/*- + * ============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.openecomp.mso.cloudify.v3.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.io.Serializable; +import java.util.Map; + +public class UpdateNodeInstanceParams implements Serializable { + + private static final long serialVersionUID = 1L; + + @JsonProperty("state") + private String state; + + @JsonProperty("version") + private String version; + + @JsonProperty("runtime_properties") + private Map<String, Object> runtimeProperties; + + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public Map<String, Object> getRuntimeProperties() { + return runtimeProperties; + } + + public void setRuntimeProperties(Map<String, Object> runtimeProperties) { + this.runtimeProperties = runtimeProperties; + } + + + @Override + public String toString() { + return "UpdateNodeInstanceParams{" + + "state='" + state + '\'' + + "version='" + version + '\'' + + ", runtimeProperties=" + runtimeProperties + + '}'; + } + +} |