All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.openstack4j.openstack.internal.OSClientSession Maven / Gradle / Ivy

The newest version!
package org.openstack4j.openstack.internal;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import org.openstack4j.api.Apis;
import org.openstack4j.api.EndpointTokenProvider;
import org.openstack4j.api.OSClient;
import org.openstack4j.api.OSClient.OSClientV2;
import org.openstack4j.api.OSClient.OSClientV3;
import org.openstack4j.api.artifact.ArtifactService;
import org.openstack4j.api.barbican.BarbicanService;
import org.openstack4j.api.client.CloudProvider;
import org.openstack4j.api.compute.ComputeService;
import org.openstack4j.api.dns.v2.DNSService;
import org.openstack4j.api.gbp.GbpService;
import org.openstack4j.api.heat.HeatService;
import org.openstack4j.api.identity.EndpointURLResolver;
import org.openstack4j.api.image.ImageService;
import org.openstack4j.api.magnum.MagnumService;
import org.openstack4j.api.manila.ShareService;
import org.openstack4j.api.murano.v1.AppCatalogService;
import org.openstack4j.api.networking.NetworkingService;
import org.openstack4j.api.networking.ext.ServiceFunctionChainService;
import org.openstack4j.api.octavia.OctaviaService;
import org.openstack4j.api.sahara.SaharaService;
import org.openstack4j.api.senlin.SenlinService;
import org.openstack4j.api.storage.BlockStorageService;
import org.openstack4j.api.storage.ObjectStorageService;
import org.openstack4j.api.tacker.TackerService;
import org.openstack4j.api.telemetry.TelemetryAodhService;
import org.openstack4j.api.telemetry.TelemetryService;
import org.openstack4j.api.trove.TroveService;
import org.openstack4j.api.types.Facing;
import org.openstack4j.api.types.ServiceType;
import org.openstack4j.api.workflow.WorkflowService;
import org.openstack4j.core.transport.Config;
import org.openstack4j.model.identity.AuthVersion;
import org.openstack4j.model.identity.URLResolverParams;
import org.openstack4j.model.identity.v2.Access;
import org.openstack4j.model.identity.v3.Token;
import org.openstack4j.openstack.identity.internal.DefaultEndpointURLResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.Set;

/**
 * A client which has been identified. Any calls spawned from this session will
 * automatically utilize the original authentication that was successfully
 * validated and authorized
 *
 * @author Jeremy Unruh
 */
public abstract class OSClientSession> implements EndpointTokenProvider {
    
    private static final Logger LOG = LoggerFactory.getLogger(OSClientSession.class);    
    @SuppressWarnings("rawtypes")
    private static final ThreadLocal sessions = new ThreadLocal();

    Config config;
    Facing perspective;
    String region;
    Set supports;
    CloudProvider provider;
    Map headers;
    EndpointURLResolver fallbackEndpointUrlResolver = new DefaultEndpointURLResolver();

    @SuppressWarnings("rawtypes")
    public static OSClientSession getCurrent() {
        return sessions.get();
    }

    @SuppressWarnings("unchecked")
    @VisibleForTesting
    public R useConfig(Config config) {
        this.config = config;
        return (R) this;
    }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public T useRegion(String region) {
        this.region = region;
        return (T) this;
    }

    /**
     * {@inheritDoc}
     */
    public T removeRegion() {
        return useRegion(null);
    }

    /**
     * @return the current perspective
     */
    public Facing getPerspective() {
        return perspective;
    }

    /**
     * @return the original client configuration associated with this session
     */
    public Config getConfig() {
        return config;
    }

    /**
     * {@inheritDoc}
     */
    public ComputeService compute() {
        return Apis.getComputeServices();
    }

    /**
     * {@inheritDoc}
     */
    public NetworkingService networking() {
        return Apis.getNetworkingServices();
    }

    /**
     * {@inheritDoc}
     */
    public ServiceFunctionChainService sfc() {
        return Apis.getSfcServices();
    }

    /**
     * {@inheritDoc}
     */
    public OctaviaService octavia() {
        return Apis.getOctaviaService();
    }

    /**
     * {@inheritDoc}
     */
    public ArtifactService artifact() {
        return Apis.getArtifactServices();
    }
    
    /**
     * {@inheritDoc}
     */
    public TackerService tacker() {
        return Apis.getTackerServices();
    }

    /**
     * {@inheritDoc}
     */
    public ImageService images() {
        return Apis.getImageService();
    }

    public org.openstack4j.api.image.v2.ImageService imagesV2() {
        return Apis.getImageV2Service();
    }

    /**
     * {@inheritDoc}
     */
    public BlockStorageService blockStorage() {
        return Apis.get(BlockStorageService.class);
    }

    /**
     * {@inheritDoc}
     */
    public TelemetryService telemetry() {
        return Apis.get(TelemetryService.class);
    }

    /**
     * {@inheritDoc}
     */
    public ShareService share() {
        return Apis.get(ShareService.class);
    }

    /**
     * {@inheritDoc}
     */
    public HeatService heat() {
        return Apis.getHeatServices();
    }

    /**
     * {@inheritDoc}
     */
    public AppCatalogService murano() {
        return Apis.getMuranoServices();
    }

    /**
     * {@inheritDoc}
     */
    public MagnumService magnum() {
    	return Apis.getMagnumService();
    }

    /**
     * {@inheritDoc}
     */
    public SenlinService senlin() {
        return Apis.getSenlinServices();
    }

    /**
     * {@inheritDoc}
     */
    public ObjectStorageService objectStorage() {
        return Apis.get(ObjectStorageService.class);
    }

    /**
     * {@inheritDoc}
     */
    public SaharaService sahara() {
        return Apis.getSaharaServices();
    }

    /**
     * {@inheritDoc}
     */
    public WorkflowService workflow() {
        return Apis.getWorkflowServices();
    }

    /**
     * {@inheritDoc}
     */
    public BarbicanService barbican() {
        return Apis.getBarbicanServices();
    }

    /**
     * {@inheritDoc}
     */
    public DNSService dns() {return Apis.getDNSService(); }

    /**
     * {@inheritDoc}
     */
    @SuppressWarnings("unchecked")
    public T perspective(Facing perspective) {
        this.perspective = perspective;
        return (T) this;
    }

    public CloudProvider getProvider() {
        return (provider == null) ? CloudProvider.UNKNOWN : provider;
    }

    /**
     * {@inheritDoc}
     */
    public T headers(Map headers) {
        this.headers = headers;
        return (T) this;
    }

    public Map getHeaders(){
        return this.headers;
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsCompute() {
        return getSupportedServices().contains(ServiceType.COMPUTE);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsIdentity() {
        return getSupportedServices().contains(ServiceType.IDENTITY);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsNetwork() {
        return getSupportedServices().contains(ServiceType.NETWORK);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsImage() {
        return getSupportedServices().contains(ServiceType.IMAGE);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsHeat() {
        return getSupportedServices().contains(ServiceType.ORCHESTRATION);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsMurano() {
        return getSupportedServices().contains(ServiceType.APP_CATALOG);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsBlockStorage() {
        return getSupportedServices().contains(ServiceType.BLOCK_STORAGE);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsObjectStorage() {
        return getSupportedServices().contains(ServiceType.OBJECT_STORAGE);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsTelemetry() {
        return getSupportedServices().contains(ServiceType.TELEMETRY);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsTelemetry_aodh() {
        return getSupportedServices().contains(ServiceType.TELEMETRY_AODH);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsShare() {
        return getSupportedServices().contains(ServiceType.SHARE);
    }

    /**
     * {@inheritDoc}
     */
    public boolean supportsTrove() { return getSupportedServices().contains(ServiceType.DATABASE); }

    /**
     * {@inheritDoc}
     */
    public boolean supportsDNS() { return getSupportedServices().contains(ServiceType.DNS); }

    public Set getSupportedServices() {
        return null;
    }
    
    public AuthVersion getAuthVersion() {
        return null;
    }

    /**
     * {@inheritDoc}
     */
    public GbpService gbp() {
        return Apis.getGbpServices();
    }

    /**
     *
     * @return
     */
    public TroveService trove(){
        return Apis.getTroveServices();
    }
        
    public static class OSClientSessionV2 extends OSClientSession implements OSClientV2 {

        Access access;

        private OSClientSessionV2(Access access, String endpoint, Facing perspective, CloudProvider provider, Config config) {
            this.access = access;
            this.config = config;
            this.perspective = perspective;
            this.provider = provider;
            sessions.set(this);
        }

        private OSClientSessionV2(Access access, OSClientSessionV2 parent, String region) {
            this.access = parent.access;
            this.perspective = parent.perspective;
            this.region = region;
        }

        public static OSClientSessionV2 createSession(Access access) {
            return new OSClientSessionV2(access, access.getEndpoint(), null, null, null);
        }

        public static OSClientSessionV2 createSession(Access access, Facing perspective, CloudProvider provider, Config config) {
            return new OSClientSessionV2(access, access.getEndpoint(), perspective, provider, config);
        }

        @Override
        public Access getAccess() {
            return access;
        }

        @Override
        public String getEndpoint() {
            return access.getEndpoint();
        }
        
        @Override
        public AuthVersion getAuthVersion() {
            return AuthVersion.V2;
        }

        private String addNATIfApplicable(String url) {
            if (config != null && config.isBehindNAT()) {
                try {
                    URI uri = new URI(url);
                    return url.replace(uri.getHost(), config.getEndpointNATResolution());
                } catch (URISyntaxException e) {
                    LOG.error(e.getMessage(), e);
                }
            }
            return url;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String getEndpoint(ServiceType service) {
        	
        	final EndpointURLResolver eUrlResolver = (config != null && config.getEndpointURLResolver() != null) ? config.getEndpointURLResolver() : fallbackEndpointUrlResolver;
        	
            return addNATIfApplicable(eUrlResolver.findURLV2(URLResolverParams
                    .create(access, service)
                    .resolver(config != null ? config.getV2Resolver() : null)
                    .perspective(perspective)
                    .region(region)));
        }

        @Override
        public String getTokenId() {
            return access.getToken().getId();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public org.openstack4j.api.identity.v2.IdentityService identity() {
            return Apis.getIdentityV2Services();
        }

        @Override
        public Set getSupportedServices() {
            if (supports == null)
                supports = Sets.immutableEnumSet(Iterables.transform(access.getServiceCatalog(),
                        new org.openstack4j.openstack.identity.v2.functions.ServiceToServiceType()));
            return supports;
        }

    }

    public static class OSClientSessionV3 extends OSClientSession implements OSClientV3 {

        Token token;
        
        protected String reqId;

        private OSClientSessionV3(Token token, String endpoint, Facing perspective, CloudProvider provider, Config config) {
            this.token = token;
            this.config = config;
            this.perspective = perspective;
            this.provider = provider;
            sessions.set(this);
        }

        private OSClientSessionV3(Token token, OSClientSessionV3 parent, String region) {
            this.token = parent.token;
            this.perspective = parent.perspective;
            this.region = region;
        }

        public static OSClientSessionV3 createSession(Token token) {
            return new OSClientSessionV3(token, token.getEndpoint(), null, null, null);
        }

        public static OSClientSessionV3 createSession(Token token, Facing perspective, CloudProvider provider, Config config) {
            return new OSClientSessionV3(token, token.getEndpoint(), perspective, provider, config);
        }
        
        public String getXOpenstackRequestId() {
        	return reqId;
        }

        @Override
        public Token getToken() {
            return token;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String getEndpoint() {
            return token.getEndpoint();
        }
        
        @Override
        public AuthVersion getAuthVersion() {
            return AuthVersion.V3;
        }

        private String addNATIfApplicable(String url) {
            if (config != null && config.isBehindNAT()) {
                try {
                    URI uri = new URI(url);
                    return url.replace(uri.getHost(), config.getEndpointNATResolution());
                } catch (URISyntaxException e) {
                    LoggerFactory.getLogger(OSClientSessionV3.class).error(e.getMessage(), e);
                }
            }
            return url;
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String getEndpoint(ServiceType service) {
        	
        	final EndpointURLResolver eUrlResolver = (config != null && config.getEndpointURLResolver() != null) ? config.getEndpointURLResolver() : fallbackEndpointUrlResolver;
        	
            return addNATIfApplicable(eUrlResolver.findURLV3(URLResolverParams
                    .create(token, service)
                    .resolver(config != null ? config.getResolver() : null)
                    .perspective(perspective)
                    .region(region)));
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public String getTokenId() {
            return token.getId();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public org.openstack4j.api.identity.v3.IdentityService identity() {
            return Apis.getIdentityV3Services();
        }

        /**
         * {@inheritDoc}
         */
        @Override
        public Set getSupportedServices() {
            if (supports == null)
                supports = Sets.immutableEnumSet(Iterables.transform(token.getCatalog(),
                        new org.openstack4j.openstack.identity.v3.functions.ServiceToServiceType()));
            return supports;
        }

        @Override
        public TelemetryService telemetry() {
            return Apis.get(TelemetryAodhService.class);
        }

    }


    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy