openstack4j 源码分析(一) 入口
来源:互联网 发布:餐厅排号软件 编辑:程序博客网 时间:2024/06/05 20:36
g# openstack4j 源码分析之入口
背景
去年有个整合多个openstack平台的项目,底层是华为、华3等不同平台的openstack环境,应用管理层为java。虽然各平台功能与原生openstack有所增加,但总体接口风格还是openstack的逻辑。由于openstack接口众多,一个个去适配接口的工作量巨大,所以决定基于openstack的java sdk来开发。对比了几种常见sdk,最后决定选用openstack4j来开发。
- Apache jclouds apache的开源sdk,大而全、杂,可以对接所有常见的云平台,文档较少,使用maven引入。
- openstack-java-sdk 由爱好者开发及维护的sdk,更新很慢,github的demo已经不能成功连接最新的openstack版本。
- openstack4j 官网资料、文档丰富,接口上手简单,更新快。
入口
openstack4j的官网demo给出的入口是
OSClient.OSClientV3 os = OSFactory.builderV3() .endpoint("http://127.0.0.1:5000/v3") .credentials("admin", "secret", Identifier.byName("Default")) .scopeToProject(Identifier.byName("admin")) .authenticate();
OSFactory是一个抽象类,通过它我们可以创建出不同的OSClient,而OSClient则是我们用来操作openstack的接口类。OSClient分为V2和V3版本,对应openstack V2 与 V3版本的认证模块(Keystone)。
OSClientV2 与 OSClientV3均为OSClient接口类的内部类,通过下面的代码可以看到,除了在认证模块有所区别外,其他模块没有任何区别。
interface OSClientV2 extends OSClient<OSClient.OSClientV2> { Access getAccess(); org.openstack4j.api.identity.v2.IdentityService identity(); }
interface OSClientV3 extends OSClient<OSClient.OSClientV3> { Token getToken(); org.openstack4j.api.identity.v3.IdentityService identity(); }
OSFactory工厂类是使用建造者模式(Builder Pattern)来将复杂的对象构造过程和主类分离的,具体的对象构造行为是由OSClientBuilder来完成,其中包含了endpoint、credentials、scopeToProject等方法来接收外界传入的登录所需信息。
public abstract class OSClientBuilder<R, T extends IOSClientBuilder<R, T>> implements IOSClientBuilder<R, T> { String endpoint; String user; String password; public T endpoint(String endpoint) { this.endpoint = endpoint; return (T) this; } public T credentials(String user, String password) { this.user = user; this.password = password; return (T) this; }
登录信息保存在OSClientBuilder对象中,然后通过authenticate()方法,根据不同的版本进行认证。
public static class ClientV2 extends OSClientBuilder<OSClientV2, IOSClientBuilder.V2> implements IOSClientBuilder.V2 { @Override public OSClientV2 authenticate() throws AuthenticationException { if (tokenId != null) { checkArgument(tenantName != null || tenantId != null, "TenantId or TenantName is required when using Token Auth"); return (OSClientV2) OSAuthenticator.invoke(new TokenAuth(tokenId, tenantName, tenantId), endpoint, perspective, config, provider); } if (raxApiKey) { return (OSClientV2) OSAuthenticator.invoke( new RaxApiKeyCredentials(user, password), endpoint, perspective, config, provider); } return (OSClientV2) OSAuthenticator.invoke( new Credentials(user, password, tenantName, tenantId), endpoint, perspective, config, provider); } }
public static class ClientV3 extends OSClientBuilder<OSClientV3, IOSClientBuilder.V3> implements IOSClientBuilder.V3 { @Override public OSClientV3 authenticate() throws AuthenticationException { if (tokenId != null && tokenId.length() > 0) return (OSClientV3) OSAuthenticator.invoke(new KeystoneAuth(tokenId, scope), endpoint, perspective, config, provider); return (OSClientV3) OSAuthenticator.invoke(new KeystoneAuth(user, password, domain, scope), endpoint, perspective, config, provider); }}
入口处的代码主要关联三个类(接口),OSFactory、OSClientBuilder(IOSClientBuilder)、OSClient,由OSFactory调用OSClientBuilder类构建OSClient对象,然后进行认证,完成了入口处的代码逻辑。
可以看到,为了避免由于openstack的认证方式更改而带来的openstack4j认证对象的剧烈改动,入口类之间的耦合很低,易于扩展。使用建造者模式(Builder Pattern)生成认证信息,将复杂的构建与其表示相分离,使得同样的构建可以创建不同的表示。对于不同的认证方式,只需要增加或者减少部分组合方法即可。
而对于大版本之间的不同,如V2和V3,则使用工厂模式(Factory Pattern),IOSClientBuilder定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。当出现认证版本之间的差异时,只需要在IOSClientBuilder接口类中创建自己的静态工厂接口类,就可以轻松完成认证过程的更改。我们对接华为、华3等平台时,对于不同的认证方式,就是使用这种方式,大大减少了开发量。
- openstack4j 源码分析(一) 入口
- openstack4j 源码分析(二) model对象
- ThinkPHP3.1.3源码分析(一) 入口文件分析
- Magento源码分析笔录一:入口文件
- thinkphp5 源码分析一 入口文件
- amoeba源码分析(一)-AmoebaProxyServer入口类分析
- thinkphp源码分析(1)--- 入口文件
- EventBus源码分析(一):入口函数提纲挈领(2.4版本)
- Scrapy源码分析(一):框架入口点和配置文件加载
- yii framework(一)入口分析
- yii framework(一)入口分析
- jQuery Sizzle 入口 [ 源码分析 ]
- tomcat源码阅读(一) 入口
- 第二人生源码分析(3)程序入口点
- Flume 1.7 源码分析(三)程序入口
- docker源码阅读笔记(一)---- docker的入口
- HBase源码系列(一)客户端入口HTable
- [java][junit4][源码分析]JUnitCore-入口分析
- JS实现各种复制到剪贴板
- USACO Buy Low
- 纯css footer 贴底 ,简洁
- mongo的$size与count的区别
- 23.使用Intent返回数据给上一个活动
- openstack4j 源码分析(一) 入口
- Andorid webview 常见问题汇总
- git使用使出现的提交问题
- Android 壁纸应用之动态壁纸
- #713 – 在拖拽操作中使用控件预览图作为鼠标(Setting the Cursor to an Image of an UIElement While Dragging)
- 有关SQLite的优缺点
- 基于vue的倒计时demo
- 手风琴效果
- Layotparams布局参数的详解