magnum组件只有magnum-api和magnum-conductor两个服务,那么入手点就简单了,请求都传递给magnum-conductor来执行了。
下面是magnum的源码结构,已经去掉了一些不重要的目录1
2
3
4
5
6
7
8
9
10
11
12magnum
├── api # magnum-api服务的代码,http服务
├── cmd # 命令行启动服务magnum-api、magnum-conductor或者初始化数据库,还有一个template_manage
├── common # 通用操作
├── conductor # magnum-conductor服务的代码
├── db # 数据库信息
├── drivers # 重点,执行操作都会定位到这里的代码和脚本
├── objects # data model
├── service # 一些额外的操作类,周期服务类等
├── servicegroup # 同上
├── templates # 原先放置heat模板文件的地方,后来统一改成了driver模式,就挪到了drivers目录下
├── tests # 测试
对于magnum bay-create
操作,主要涉及conductor和drivers这两个目录的代码,templates
还剩下一些东西,不过最终也要弃用。
drivers的目录有下面这些东西1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16drivers/
├── common
│ └── template_def.py # 模板定义的父类
├── k8s_fedora_atomic_v1
│ ├── template_def.py # 定义模板类
│ ├── templates
│ │ ├── elements # 创建image时可能用到的element
│ │ ├── environments # 创建集群环境时,环境的配置
│ │ ├── fragments # 创建集群环境时,可能要在heat模板里执行的一些脚本
│ │ ├── kubecluster.yaml # 具体的heat template,这里是bay具体要执行哪些操作
│ │ ├── kubemaster.yaml
│ │ ├── kubeminion.yaml
│ └── version.py
├── k8s_coreos_v1
├── mesos_ubuntu_v1
└── swarm_fedora_atomic_v1
可以看到当前magnum支持了三种docker集群,一共四种driver
- k8s_fedora_atomic_v1
- k8s_coreos_v1
- mesos_ubuntu_v1
- mesos_ubuntu_v1
要执行执行哪个driver,是有三个参数来决定的:server_type
、os
、coe
每个driver里都会有一个template_def.py
,这个就是来定义heat template的信息的类,类里主要做了3个操作:
- get_params # 要给heat template传递什么参数
- get_env_files # 要在调用heat template时如何设置环境,主要是针对是否load balance时,执行了一些heat的resource_registry操作
- template_path # 要执行的heat template的文件路径
举个例子,对于{'server_type': 'bm', 'os': 'ubuntu', 'coe': 'mesos'}
这样的参数,函数调用的堆栈信息如下:1
2
3
4
5magnum/conductor/handlers/bay_conductor.py: Handler:bay-create
magnum/conductor/handlers/bay_conductor.py: _create_stack
magnum/conductor/handlers/bay_conductor.py: _extract_template_definition
magnum/drivers/mesos_ubuntu_v1/template_def.py: TemplateDefinition:extract_definition
最终调用 mesos_ubuntu_v1 对应的模板定义类 UbuntuMesosTemplateDefinition 里的三个函数
参考:
Directory structure
Choosing a coe
troubleshooting-guide