com.huawei.openstack4j.openstack.internal.OSClientSessionAKSK Maven / Gradle / Ivy
The newest version!
/*******************************************************************************
* Copyright 2018 Huawei Technologies Co.,Ltd.
*
* 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.
*******************************************************************************/
package com.huawei.openstack4j.openstack.internal;
import static com.google.common.base.Preconditions.checkArgument;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Strings;
import com.huawei.openstack4j.api.Apis;
import com.huawei.openstack4j.api.OSClient.OSClientAKSK;
import com.huawei.openstack4j.api.ServiceEndpointProvider;
import com.huawei.openstack4j.api.client.CloudProvider;
import com.huawei.openstack4j.api.exceptions.RegionEndpointNotFoundException;
import com.huawei.openstack4j.api.identity.EndpointURLResolver;
import com.huawei.openstack4j.api.identity.v3.IdentityService;
import com.huawei.openstack4j.api.types.ServiceType;
import com.huawei.openstack4j.model.identity.AuthVersion;
import com.huawei.openstack4j.model.identity.URLResolverParams;
import com.huawei.openstack4j.model.identity.v3.Endpoint;
import com.huawei.openstack4j.model.identity.v3.Service;
import com.huawei.openstack4j.openstack.identity.internal.AKSKEndpointURLResolver;
public class OSClientSessionAKSK extends OSClientSession implements OSClientAKSK {
private String accessKey;
private String secretKey;
private String cloudDomainName;
private String projectId;
private String domainId;
private HashMap serviceEndpoints;
private static final Logger LOG = LoggerFactory.getLogger(OSClientSessionAKSK.class);
CloudProvider provider = CloudProvider.HUAWEI;
protected EndpointURLResolver defaultEndpointURLResolver = AKSKEndpointURLResolver.instance();
/*
* {@inheritDoc}
*/
@Override
public String getEndpoint() {
throw new RuntimeException("Token is not required by AKSK-authentication");
}
/*
* {@inheritDoc}
*/
@Override
public String getEndpoint(ServiceType service) {
/*final EndpointURLResolver endpointResolver = (config != null && config.getEndpointURLResolver() != null)
? config.getEndpointURLResolver() : defaultEndpointURLResolver; */
URLResolverParams params = URLResolverParams.create(service).perspective(perspective).region(region)
.domain(cloudDomainName).projectId(projectId).serviceEndpoints(serviceEndpoints);
//如果有重写就先去重写匹配,重写匹配不到就去配置文件匹配
String url = null;
try{
if(config != null && config.getEndpointURLResolver() != null){
url = config.getEndpointURLResolver().resolve(params);
if(url == null){
url = defaultEndpointURLResolver.resolve(params);
}
}else{
url = defaultEndpointURLResolver.resolve(params);
}
}catch(NullPointerException e){
throw new RegionEndpointNotFoundException("region endpoint can not be found");
}
return addNATIfApplicable(url);
}
public void initServiceEndpoints(){
if(region == null){
return;
}
OSClientSessionAKSK osclient = (OSClientSessionAKSK)OSClientSession.getCurrent();
List extends Service> services = new ArrayList<>();
List extends Endpoint> endpoints = new ArrayList<>();
try {
services = osclient.identity().serviceEndpoints().list();
endpoints = osclient.identity().serviceEndpoints().listEndpoints();
}catch (Exception e){
LOG.error("IAM Endpint failed to get, the specific reason is:"+e);
return;
}
HashMap serviceEndpoints = new HashMap<>();
for(Service service : services){
for (Endpoint endpoint : endpoints){
if(service.getId() ==null){
continue;
}
if(service.getId().equals(endpoint.getServiceId())){
if(!region.equalsIgnoreCase(endpoint.getRegion()) || !"PUBLIC".equalsIgnoreCase(endpoint.getIface().toString())){
continue;
}
ServiceType serviceType = ServiceType.forName(service.getType());
if(serviceType == ServiceType.UNKNOWN ){
continue;
}
ServiceEndpointProvider.ServiceEndpoint serviceEndpoint = new ServiceEndpointProvider.ServiceEndpoint();
serviceEndpoint.setPublicEndpoint(endpoint.getUrl().toString());
serviceEndpoints.put(serviceType,serviceEndpoint);
}
}
}
this.serviceEndpoints = serviceEndpoints;
sessions.set(this);
}
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(OSClientSessionAKSK.class).error(e.getMessage(), e);
}
}
return url;
}
/*
* {@inheritDoc}
*/
@Override
public String getTokenId() {
return null;
}
public AuthVersion getAuthVersion() {
return AuthVersion.AKSK;
}
/*
* {@inheritDoc}
*/
@Override
public boolean supportsReAuthentication() {
return false;
}
/*
* {@inheritDoc}
*/
@Override
public com.huawei.openstack4j.api.OSClient.OSClientAKSK credentials(String accessKey, String secretKey, String region,
String projectId, String cloudDomainName) {
checkArgument(!Strings.isNullOrEmpty(accessKey),"parameter `accessKey` should not be empty");
checkArgument(!Strings.isNullOrEmpty(secretKey),"parameter `secretKey` should not be empty");
checkArgument(!Strings.isNullOrEmpty(region),"parameter `region` should not be empty");
checkArgument(!Strings.isNullOrEmpty(projectId),"parameter `projectId` should not be empty");
checkArgument(!Strings.isNullOrEmpty(cloudDomainName),"parameter `cloudDomainName` should not be empty");
this.accessKey = accessKey;
this.secretKey = secretKey;
this.cloudDomainName = cloudDomainName;
this.projectId = projectId;
this.useRegion(region);
sessions.set(this);
initServiceEndpoints();
return this;
}
@Override
public com.huawei.openstack4j.api.OSClient.OSClientAKSK credentials(String accessKey, String secretKey, String region,
String projectId, String domainId, String cloudDomainName) {
checkArgument(!Strings.isNullOrEmpty(accessKey),"parameter `accessKey` should not be empty");
checkArgument(!Strings.isNullOrEmpty(secretKey),"parameter `secretKey` should not be empty");
// checkArgument(!Strings.isNullOrEmpty(region),"parameter `region` should not be empty");
checkArgument(!Strings.isNullOrEmpty(domainId),"parameter `domainId` should not be empty");
checkArgument(!Strings.isNullOrEmpty(cloudDomainName),"parameter `domain` should not be empty");
this.accessKey = accessKey;
this.secretKey = secretKey;
this.cloudDomainName = cloudDomainName;
this.domainId = domainId;
this.projectId = projectId;
this.useRegion(region);
sessions.set(this);
initServiceEndpoints();
return this;
}
/*
* {@inheritDoc}
*/
@Override
public com.huawei.openstack4j.api.OSClient.OSClientAKSK credentials(String accessKey, String secretKey, String region,
String cloudDomainName) {
checkArgument(!Strings.isNullOrEmpty(accessKey),"parameter `accessKey` should not be empty");
checkArgument(!Strings.isNullOrEmpty(secretKey),"parameter `secretKey` should not be empty");
checkArgument(!Strings.isNullOrEmpty(region),"parameter `region` should not be empty");
checkArgument(!Strings.isNullOrEmpty(cloudDomainName),"parameter `domain` should not be empty");
this.accessKey = accessKey;
this.secretKey = secretKey;
this.cloudDomainName = cloudDomainName;
this.useRegion(region);
sessions.set(this);
initServiceEndpoints();
return this;
}
public String getAccessKey() {
return accessKey;
}
public String getSecretKey() {
return secretKey;
}
public String getCloudDomain() {
return cloudDomainName;
}
public String getProjectId() {
return projectId;
}
public String getDomainId() {
return domainId;
}
public String getRegion() {
return region;
}
@Override
public IdentityService identity() {
return Apis.getIdentityV3Services();
}
}