package io.fathom.cloud.openstack.client; import io.fathom.cloud.openstack.client.dns.OpenstackDnsClient; import io.fathom.cloud.openstack.client.identity.OpenstackIdentityClient; import io.fathom.cloud.openstack.client.identity.TokenProvider; import io.fathom.cloud.openstack.client.keystore.OpenstackKeystoreClient; import io.fathom.cloud.openstack.client.storage.OpenstackStorageClient; import java.net.URI; public class OpenstackClient { final TokenProvider tokenProvider; public OpenstackClient(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; } OpenstackDnsClient dns; public OpenstackDnsClient getDns() throws RestClientException { if (dns == null) { URI uri = getEndpoint(OpenstackDnsClient.SERVICE_TYPE); dns = new OpenstackDnsClient(tokenProvider.getHttpClient(), uri, tokenProvider); } return dns; } OpenstackKeystoreClient keystore; public OpenstackKeystoreClient getKeystore() throws RestClientException { if (keystore == null) { URI uri = getEndpoint(OpenstackKeystoreClient.SERVICE_TYPE); keystore = new OpenstackKeystoreClient(tokenProvider.getHttpClient(), uri, tokenProvider); } return keystore; } OpenstackStorageClient storage; public OpenstackStorageClient getStorage() throws RestClientException { if (storage == null) { URI uri = getEndpoint(OpenstackStorageClient.SERVICE_TYPE); storage = new OpenstackStorageClient(tokenProvider.getHttpClient(), uri, tokenProvider); } return storage; } OpenstackIdentityClient identity; public OpenstackIdentityClient getIdentity() throws RestClientException { if (identity == null) { URI uri = getEndpoint(OpenstackIdentityClient.SERVICE_TYPE); // Remove /v2.0, if it is there // (we are supposed to expose it in the service catalog, but that is technically wrong) String uriString = uri.toString(); if (!uriString.endsWith("/")) { uriString += "/"; } if (uriString.endsWith("/v2.0/")) { uriString = uriString.substring(0, uriString.length() - 5); } uri = URI.create(uriString); identity = new OpenstackIdentityClient(tokenProvider.getHttpClient(), uri, tokenProvider); } return identity; } private URI getEndpoint(String serviceType) throws RestClientException { String endpoint = tokenProvider.findEndpoint(serviceType); if (endpoint == null) { throw new RestClientException("Cannot find service for " + serviceType); } String url = endpoint; if (!url.endsWith("/")) { url += "/"; } return URI.create(url); } public static OpenstackClient build(TokenProvider tokenProvider) { return new OpenstackClient(tokenProvider); } }