openstack4j 源码_【踩坑】OpenStack4j使用过程中关于OSClientSession被更改的问题记录...

本文详细记录了使用 OpenStack4j SDK 时遇到的问题,即在不同项目间切换 OSClient 导致资源错误创建到另一个项目下。通过源码分析发现,OSClientSession 使用 ThreadLocal 保存 OSClient,当获取新的 OSClient 时会覆盖原有的,从而在后续操作中使用了错误的项目上下文。解决这个问题的关键在于理解 OSClientSession 的工作原理及认证过程。
摘要由CSDN通过智能技术生成

OpenStack4j是一个OpenStack的Java SDK。

问题描述

在同一个代码处理线程中,首先获取了 projectA 的 OSClient 对象 OSClientA,然后又获取了 projectB 的 OSClient 对象 OSClientB。

后续在用 OSClientA 去调用某个 service(比如 BlockVolumeService)去创建资源(比如 volume)的时候,期望创建在 projectA 下面,结果创建的资源却在 projectB 下面。

查找原因

经过跟踪 OpenStack4j 中获取 OSClient 和 调用具体 service 的相关源码后,发现问题,在于 OSClientSession 类中使用 ThreadLocal 变量 sessions 将获取的 OSClient 存下来。

后续在创建资源的时候,使用从 sessions 中取出的OSClient ,调用 OpenStack 的 API 接口。

关键在于,第二次获取 OSClientB 的时候,会将 sessions 中存的 OSClient 更新,将原先的 OSClientA 给替换为 OSClientB。

也就造成了,尽管是用 OSClientA 去创建资源,但是实际使用的 OSClient 已经被改了,也就是是用 OSClientB 的相关参数去创建的。

源码分析

获取 OSClient 的代码在 OSAuthenticator#authenticateV3(默认使用的是v3版本)。

......

private static OSClientV3 authenticateV3(KeystoneAuth auth, SessionInfo info, Config config) {

if (auth.getType().equals(Type.TOKENLESS)){

......

}

# 调用 OpenStack keystone 的认证接口

HttpRequest request = HttpRequest.builder(KeystoneToken.class)

.header(ClientConstants.HEADER_OS4J_AUTH, TOKEN_INDICATOR).endpoint(info.endpoint)

.method(HttpMethod.POST).path("/auth/tokens").config(config).entity(auth).build();

HttpResponse response = HttpExecutor.create().execute(request);

if (response.getStatus() >= 400) {<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值