summaryrefslogtreecommitdiffstats
path: root/cloudify-client/src/main/java/org/openecomp/mso/cloudify/base/client/CloudifyClient.java
blob: 03f5a9907bad2a6579bbbb191ae7b8e01b59c271 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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);
	}
	
}