vmc版本升级变化较大,且有不兼容现象。本博文仅适用于 vmc 0.4.* 之前版本,否则参考价值不大。本文不再更新。
vmc/
|-- bin/
| |__ vmc
|-- caldecott_helper/
| |__ server.rb
|-- config/
| |-- micro/
| |__ clients.yml
|-- lib/
|-- Rakefile
|__ vmc.gemspec
vmc 是Cloud Foundry对外的命令行接口,同时它也是一个Ruby gem。
vmc.gemspec
从 vmc.gemspec 文件,我们除了可以看到该 gem 的作者, 版本, 描述等基本信息外,重要的是可以知道它依赖于哪些其它的 gem 。
有关 Gem 的更多描述,可以阅读 Specification Reference
Rakefile
通过 gem install vmc 安装 vmc 后,我们可以运行的 rake 任务。
关键的有 rake spec 运行测试(敲入 rake 默认也是运行此命令),还有就是 rake clean 清除之前跑过的测试数据,还'环境'一片干净的'天空'。
一, bin 目录
vmc
也就是说安装 vmc 后,我们就可以有 vmc 可执行命令了。
二, caldecott_helper 目录
server.rb
一个简单的 Sinatra 程序。
主要实现: 当我们请求 /services 时,返回 ENV 中所有的 VMC_SERVICES 信息,而请求 /services/:service 时,则从 VMC_SERVICES 中返回我们指定的某个 service 的信息。
三, config 目录
clients.yml
默认 vmc 可以像在本地一样访问远端的以下服务: 最常用的关系数据库[mysql, postgresql], 最常用的NoSQL[redis, mongodb]。而这我们只需提供一些简单的信息,如 host, port, password等。
micro 目录
vmc 可执行文件在具体操作系统中的路径。
将宿主机的 ip 保存到临时文件 "tmp/ip.txt" 中
四, lib 目录
vmc 主要由两部分组成 cli 和 vmc 。
1, cli 目录
- commands 目录
对通过 vmc 执行的任务做简单分类
有这几类 admin, apps, manifest, micro, misc, services, user ,我们可以将'这些分类'理解为 rails 中的 resources, 将此 commands 目录下的各个文件理解为 controllers 中的 ‘xxx_controller’ 文件,而 base.rb 则同样可以理解为 application_controller.rb -- 这样就容易理解了。
- config.rb
主要配置这6部分:target, token, instances, aliases, micro 还有 clients
通过 vmc 与服务器或 micro CF 交互时的一些基本信息还有保存路径等
- console_helper.rb (仅针对能用console的app(如rails app)有效)
实现console相关功能的代码(例如: console 之前要auth )
根据 appname 看能不能使用 console (作为一名合格的 rails 程序员,我们对此应该很熟悉)
- core_ext.rb
顾名思义,对 Ruby (这里是 Object 类, String 类)进行直接扩展。使用技术:猴子补丁
- frameworks.rb
框架的抉择(目前有15个可供选择)!
分为两类,Framework 和 StandaloneFramework (又继承了 Framework )
核心: detect -- 根据上传的源代码检测所使用的 runtime, framework
- manifest_helper.rb
实现'代码清单'
通过 vmc push 上传代码时在'终端'所显示的提示信息/提问均通过此文件产生,另外事后所看到的 manifest.yml 文件也是它生成的
- runner.rbset_cmd(namespace, action, args_range=0)
使用手册 usage,这和 vmc -h 或 README.md 中所说的功能一样
set_cmd(namespace, action) 和 parse_command! , 当你输入 command options 后能进行简单的解析
- services_helper.rb
之前说过,我们可以将 commands/ 理解为 rails 中的 controllers/ 同样的不难理解: services_helper 也就是 services.rb 的'辅助'文件。它功能主要有:在终端输入 vmc services 时打印 “System Services” 和 “Provisioned Services”
还有就是能过client, 封装了一下 create_service_banner, bind_service_banner, unbind_service_banner, delete_service_banner, random_service_name 方法
commands/ 应该和 controllers/ 一样应该是个'瘦子',但又有一点区别就是CF没有 views。cli 通过'终端'与用户打交道,所以这里的 commands/ 也要做部分的'显示'工作,所以你在代码里可以经常的看到 ask(), err(), display().
- tunnel_helper.rb
我们知道通过 vmc 访问CF上的 services, 我们需要有 gem 'caldecott' 这条'通道'。此文件几乎包含了所有的与之相关的代码!
- usage.rb
你在终端敲入 vmc 时所显示的 basic_usage, 或者 vmc -h 所显示的帮助信息,都是‘在这里定义的’
- zip_util.rb
压缩工具
提供对文件/目录的压缩/解压功能。运用于对 logging 的处理,detect framework时也用到,特别是对上传的 app 的压缩
2, vmc 目录
目录 vmc/ 重要就是 client.rb 和 micro 相关代码
子目录 cli/ 重要就是
1. 与vmc命令一一对应的 commands/
2. 支撑起 commands/ 的辅助文件
3. 还有就是 vmc命令 背后看不到的增强功能
micro.rb
太简单,就不说了
const.rb 一些 module VMC 层面的 const 例如:DEFAULT_TARGET = 'https://api.cloudfoundry.com'
client.rb
最简单的只需要提供 target_url ,你就能创建 VMC::Client.new 的实例
客户端能能够做的事,都在这里'实现'了。前面提到过的 commands/ 直接面向的是用户,只是 views 层。而具体实现由cloudfoundry中的 CC 实现
这个文件就是连接 commands/ 和 CC 的桥梁!
它主要处理 Target info, Apps, Services, Resources, Validation Helpers, User login/password, System administration
看起来有两种格式的处理:JSON和HTML, 但JSON的GET, POST, PUT, DELETE其实只不过是对HTTP的GET, POST, PUT, DELETE做简单的封装而矣。到最后它们都通过一个叫 request 的方法,携带 headers 等信息并且实现无状态请求
对CF有所了解的朋友都应该知道CC才是整个CF的大脑,而我们通过VMC进行的操作实际上到最后都是CC在处理。VMC 与 CC 连接的桥梁:Gem rest_client
mirco
vmrun.rb
从代码可以知道此文件是其重要组成部分
有连接 domain, ip; list, offline? offline! online? run(command, args=nil), running? start ... 对虚拟机的一些基本状态查询/控制。我们对 micro VM 的大多数操作都可以在这里找到,它们中大多数都是'命令行',可以在操作系统上运行的,从这可以看出 "-gu #{@user} -gp #{@password} #{command}"
base.rb
我们可以将 micro CF 虚拟机布在多种操作系统的物理机上。Base 是其状态的基本信息:offline? or online?
每种操作系统都实现了共同操作,即:adminrun(command); set_nameserver(domain, ip); unset_nameserver(domain, ip)
----
来点简单小结:
vmc 由这两部分组成。
* 你在终端输入 "vmc -h" 所能看到的,或者说你通过 vmc 所能做的事。基本上在 cli/commands/ 里都有与之对应的命令。
而 cli/commands/ 本身并不做什么事,基本都是调用了 vmc/client.rb 下的相对的方法。而 vmc/client 又是通过 rest_client 发送 RESTful 请求到 cloud_controller 最终实现的。
* 上面说的是“所能看到的,或者说你通过 vmc 所能做的事”,再就是"背后的, 看不到的"。caldecott, tunnel 助于与后端服务直接通信, console 助于使用 Rails 中的控制台,runtime/framework 的检测,manifest 代码清单,zip_util 代码的压缩等等。
了解上面的两部分,基本上你对 vmc 就有了比较清楚的认识。在此基础之上,你可以使用CF过程中跟踪(超多的)bug,对 vmc 二次开发,例如: appfog 的 cf
还有什么?
* 哦,,,还有 vmc micro CF ...
CF代码量庞大,单是 vmc 这条命令的代码就成千。这里所写的,只是作者个人的理解,难免有疏漏和错误。希望读者自己阅读/实践,本文仅起到抛砖引玉的作用
更新:
vmc 目前已经更新,你可以称之为 vmc_ng ,现代码大部分已更改。
client 从 cfoundry gem 来,而cfoundry主要用到了faraday向cloud_controller发送RESTful请求。
语言+构架的检测也从vmc中剥离,放到一个叫 clouseau gem 当中
新增功能主要有:Organizations, Spaces, Routes, Domains
vmc_ng 只提供"vmc -h"所显示的服务,其它的任何功能均不由它提供,相比第一个版本功能更强大。代码结构也分得更细了,不过因为其它附加的功能都移除出去了,所以代码量并没有增加。
其它,还在看代码当中,下次更新。