柔中带刚,刚中带柔,淫荡中富含柔和,刚猛中荡漾风骚,无坚不摧,无孔不入!
全部博文(1669)
分类: 云计算
2014-05-30 10:14:33
cf push
CLI 中的cf push 命令,需要调用cloud controller的6次rest接口
app = create_app(get_inputs)//app的信息存入数据库
map_route(app)// 保存app的route(subdomain+domain)信息保存到数据库
create_services(app) //为该应用创建service service 如何使用?
bind_services(app) // 将service 绑定到app,数据存入数据库,调用service gateway接口完成app与service绑定
upload_app(app, path)//将应用上droplet传,根据是否使用nginx ,将应用放置在不同的目录
(使用nginx时,
(1)首先将文件上传到/var/vcap/data/cloud_controller_ng/tmp/uploads (文件名举例 /var/vcap/data/cloud_controller_ng/tmp/uploads/0000000018)
(2)然后启动AppBitsPackager 任务,将应用由本地存储转变为blobstore存储,存储到/var/vcap/nfs/shared/cc-packages 目录 并将文件名修改为为app的guid,,文件名举例
(/var/vcap/nfs/shared/cc-packages/d7/a3/d7a3eddb-d479-4cdc-b0e9-92d80ae3df76))
(3)生成应用的package hash值,保存到数据库中
start_app(app)
(1)调用get "/staging/apps/:guid" 接口完成 从blobstore 下载应用信息
Sequel::Model after_commit 回调函数,会在数据库发生变化时,调用,
当app的状态发生变化时,判断是否需要stage,如果需要,启动stage
\src\cloud_controller_ng\lib\cloud_controller\app_stager_task.rb stage 函数
1、保存app 的stage 的任务id,选择合适的dea进行stage
2、发布staging.stop" 将该app之前的stage任务停止
3、cc发布”消息 启动stage,dea 接受到该消息进行stage
dea_next src\dea_next\lib\dea\responders\staging.rb handle 函数完成处理
里面包含一个订阅通知,会有多个response返回
src\dea_next\lib\dea\staging\staging_task.rb 中的start函数启动 stager 任务
部分函数解析
resolve_staging_setup函数
1、准备workspace
根据需要的内存,硬盘创建warden,配置warden的Ip,配置warden内的运行日志
resolve_staging
调用的函数
promise_unpack_app,// warden 执行脚本下载应用信息到临时目录
promise_unpack_buildpack_cache,
//warden执行脚本下载buildpack_cache (目前未使用)
promise_stage,
//warden执行脚本/var/vcap/packages/dea_next/buildpacks/bin/run
检测应用类型,进行compile,下载依赖包
promise_pack_app,
//warden 执行脚本,将应用+依赖包进行打包
promise_copy_out,
//将应用 从warden copy到新的目录
promise_save_droplet, // 保存droplet 到/var/vcap/data/dea_next/droplets
promise_log_upload_started,// 将droplet上传到cloudcontroller (实际是保存到/var/vcap/nfs/shared/cc-droplets)
promise_staging_info // 保存staging_info.yml 保存stage 信息
(2)调用POST /staging/droplets/gudi 接口完成应用信息+依赖包信息保存在
/var/vcap/data/cloud_controller_ng/tmp/staged_droplet_uploads 然后将其保存到blobstore
/var/vcap/nfs/shared/cc-droplets
然后将本地文件删除
(3)调用POST /staging/buildpack_cache/guid 接口完成 将依赖包保存到该路径
/var/vcap/data/cloud_controller_ng/tmp/staged_droplet_uploads然后将其保存到blobstore
/var/vcap/nfs/shared/cc-droplets/buildpack_cache
保存完成后,将本地的文件删除
当stage 完毕后,使用deaClient启动该应用,首先查找最优的DEA,CloudController指定DEA发送消息dea.#{dea_id}.start,DEA接收该应用的信息,调用CloudController的接口(/staging/droplets/guid/download\"),下载droplet到DEA