Inside Kolla - 05 从 tools 目录开始

从 tools 目录开始

在上一篇中已介绍了 Kolla 的源代码目录结构和各个目录中源代码的基本作用,现在开始深入到各个目录,介绍目录中的具体内容。每个人分析代码的思路和方法不同,会选择从不同的目录开始。在这里,我选择从 tools 目录开始,从高层了解 Kolla 组件间的关系、编译依赖,命令行工具等,然后再次按照依赖来逐个组件分析。

tools 目录的文件树如下:

.
├── build-all-docker-images
├── build-docker-image
├── cleanup-containers
├── cleanup-images
├── genenv
├── init-runonce
├── kolla
├── pre-commit-hook
├── update-build-links
├── validate-all-json.sh
├── validate-all-maintainer.sh
├── validate-all-yaml.sh
├── validate-json.py
├── validate-maintainer.sh
└── validate-yaml.py

这些文件都是脚本文件,核心的文件为:build-* genenv kolla 。(这里使用了 vi 来查看,并使用了 set nu,因此会带上行号,使用一些支持列模式的编辑器可很简单地去掉行号;因为文件版本不同的话,内容和行号不相同,仅供参考)

build-* 脚本

build-* 负责处理 Dockerfile ,编译 doker 镜像。有两个 Shell 脚本文件:

  1. build-docker-image

    编译一个组件的 docker 镜像。这个脚本的用法可使用 build-docker-image -h 查看。

    这里涉及了一点隐含的 Shell 技巧。 Kolla 中各个 docker 镜像定义的目录中,都有一个 build 文件用来编译当前的 docker 镜像。这些 build 文件其实都是一个链接,指向 build-docker-image 脚本。当调用 build 文件,会把 build 文件路径作为 $0 参数,所以 build-docker-image 脚本的 IMGDIR 变量为指向 build 文件所在的镜像目录(即 docker 镜像定义目录,通过 dirname $0 获得),因此 build-docker-image 脚本可以编译当前 docker 镜像。

    脚本中首先定义了一系列编译使用到的变量,并设置了默认值,改变这些值时应参考默认值:

       3 TOPDIR=$(git rev-parse --show-toplevel)
       4 IMGDIR="$(cd "$(dirname "$0")" && pwd)"
       5 
       6 RELEASE_NAMESPACE=kollaglue
       7 NAMESPACE=kollaglue
       8 PREFIX=centos-rdo-
       9 TAG=$(git rev-parse --short HEAD)
      10 RELEASE_TAG=kilo

    然后,定义了一个 usage 函数,用来打印帮助内容(略)。

    然后,在正式执行前,先检查是否有编译配置文件,如果有,执行这些文件:

      29 [ -f $TOPDIR/.buildconf ] && . $TOPDIR/.buildconf
      30 [ -f $IMGDIR/.buildconf ] && . $IMGDIR/.buildconf

    然后,会有一段常规的命令后参数处理脚本,读取参数并转换(略)。然后,根据参数,对镜像命名

      97 IMAGE="${PREFIX}${IMGDIR##*/}"
      98 FULLIMAGE="${NAMESPACE}/${IMAGE}${TAG:+:${TAG}}"

    IMAGE是镜像的名字,用编译时前缀PREFIX和镜像在的目录IMGDIR(只保留路径中最后一个'/'后的部分)来命名,如 centos-rdo-keystoneFULLIMAGE是镜像的全名,是在 docker-registry 中的名字,并当 TAG 变量不为空时,在IMAGE后面加上一个版本标签,如 kollaglue/centos-rdo-keystone:kilo

    然后,创建编译时的临时目录,把镜像目录内容拷贝到临时目录,使用 sed 修改掉 Dockerfile 中定义的 %%KOLLA_NAMESPACE%% %%KOLLA_PREFIX%% %%KOLLA_TAG%% 等值,然后使用 docker build 编译。由于所有的编译使用同一个 TEMPDIR,因此不能同时编译多个 docker 镜像!

     112 TMPDIR=$(mktemp -d /tmp/kolla-build.XXXXXXXXXX)
     113 cp -aL $IMGDIR/* $TMPDIR
     114 # Use an extension for in-place editing for portability, as GNU and BSD
     115 # versions of sed behave differently otherwise
     116 sed -i.bak "s/%%KOLLA_NAMESPACE%%/${NAMESPACE}/g" $TMPDIR/Dockerfile
     117 sed -i.bak "s/%%KOLLA_PREFIX%%/${PREFIX}/g" $TMPDIR/Dockerfile
     118 sed -i.bak "s/%%KOLLA_TAG%%/${PARENT_TAG}/g" $TMPDIR/Dockerfile
     119 
     120 if ! docker build ${BUILDFLAGS} -t "$FULLIMAGE" $TMPDIR; then
     121     echo "ERROR: failed to build $FULLIMAGE"
     122     exit 1
     123 fi
     124 rm -rf $TMPDIR

    最后,如果使用了push选项,会把镜像push到docker仓库,此时使用到 FULLIMAGE 变量。

     128 if [ "$PUSH" = 1 ]; then
     129     if ! docker push "$FULLIMAGE"; then
     130         echo "ERROR: failed to push $FULLIMAGE"
     131         exit 1
     132     fi
     133 
     134     echo "Pushed: $FULLIMAGE"
     135 fi
  2. build-all-docker-images

    编译所有组件的 docker 镜像。这个脚本的用法通过 build-all-docker-image -h 获得。

    这个脚本是对 build-docker-image 的进一步封装,从而能支持一次性编译所有的 docker 镜像。需要注意的是,这个脚本注明了要使用 bash 4 和 gawk。由于部分的 Linux distribution 里面没有包含这些软件,需要自己安装(里面只用了一句 gawk 啊!!!不明白为什么不直接用awk,或者用which检查哪个awk兼容软件可用)。

       1 #!/usr/bin/env bash
       2 # Depends on bash 4 and gawk 

    在 Ubuntu 14.04 Desktop里面,就缺少了 gawk,通过apt安装:

     sudo apt-get install -y --force-yes gawk

    首先,定义了3个用于变量的目录变量。 TOPDIR 是 Kolla 根目录,这里用了 git 来进行判断,也可通过 dirname 来获取; WORKDIR 是编译时的临时目录; DOCKERDIR 是编译所有 docker 镜像的临时目录。Kolla 根目录的所有内容 copy 到 WORKDIR中。

       4 TOPDIR=$(git rev-parse --show-toplevel)
       5 # Work in a temp dir so that developers can continue working while a build is
       6 # in progress
       7 WORKDIR=$(mktemp -d /tmp/kolla-workdir.XXXXXXXXXX)
       8 # Remove $WORKDIR otherwise $TOPDIR is copied *inside* of it
       9 rm -rf $WORKDIR
      10 cp -aL "$TOPDIR" $WORKDIR
      11 DOCKERDIR="$WORKDIR/docker"

    然后,定义了3个数组变量。 dependency 保存了各个 docker 镜像依赖关系; img_dirs 保存 docker 镜像的目录; status 保存 docker 镜像的编译状态。

      13 declare -A dependency
      14 declare -A img_dirs
      15 declare -A status
    然后,是一系列函数的定义:
    1. info
      打印普通信息

    2. success
      打印成功信息

    3. warn
      打印警告

    4. set_defaults
      设置 PREFIXNAMESPACE 等参数默认值

    5. has_changed
      通过 git 检查是否有文件的改变。参数为 image,所在的目录为 ${img_dirs[$image]#$WORKDIR/} 通过 git diff 检查是否有改变。

    6. requires_build
      检查镜像是否需要进行编译

    7. build_image
      编译镜像。调用镜像目录中的 build 脚本(即 build-docker-image 脚本),进行编译。

    8. init_image
      初始化镜像编译配置。调用 set_defaults,运行镜像目录的buildconf文件,通过 gawk 检查镜像所依赖的镜像(就是这个地方使用了 gawk ),并处理镜像的名字

        69 function init_image {
        70     local img_dir=$1
        71 
        72     set_defaults
        73     [ -f $WORKDIR/.buildconf ] && . $WORKDIR/.buildconf
        74     [ -f $img_dir/.buildconf ] && . $img_dir/.buildconf
        75     [ -n "$FORCE_NAMESPACE" ]  && NAMESPACE=$FORCE_NAMESPACE
        76 
        77     local image="${NAMESPACE:+${NAMESPACE}/}${PREFIX}${img_dir##*/}"
        78     local base_image=$(cat $img_dir/Dockerfile | gawk 'match($0, /^\s*FROM\s+(\S+)/, matches) {print matches[1]}' )
        79     base_image=${base_image//%%KOLLA_NAMESPACE%%/$NAMESPACE}
        80     base_image=${base_image//%%KOLLA_PREFIX%%/$PREFIX}
        81     base_image=${base_image//:%%KOLLA_TAG%%/}
        82 
        83     img_dirs[$image]=$img_dir
        84     dependency[$image]=$base_image
        85 
        86     # Restore defaults to minimize risk of side effects
        87     set_defaults
        88 }

      79-81行替换掉 %%KOLLA_NAMESPACE%% %%KOLLA_PREFIX%% :%%KOLLA_TAG%% 等标记,然后记录到数组 img_dirsdependency 里面。

    9. process_image
      处理镜像。函数先根据 ${dependency[$image]} 递归地调用process-image处理其基础镜像,然后调用 requires_build 检查 $image 是否需要重新编译,需要编译时用 build-image 进行编译,最后更新 status中的状态为 up-to-date

    10. print_summary
      打印编译总结。把 status 中的状态信息打印出来。

    11. interrupted
      中断处理函数。在中断编译时,会删除 $WORKDIR

    12. usage 和参数处理
      显示帮助信息,处理脚本运行参数。

    13. 其它
      处理逻辑。找到 $DOCKERDIR 里面的所有 Dockerfile,然后执行 init_image 初始化编译配置,然后使用 process_image 处理镜像编译。

      175 # Do a first pass to find images to build and their dependencies
      176 for dockerfile in $(find $DOCKERDIR -name Dockerfile); do
      177     init_image $(dirname $dockerfile)
      178 done
      179 
      180 # Process all images
      181 for image in "${!img_dirs[@]}"; do
      182     process_image $image
      183 done
      184 
      185 print_summary
      186 rm -rf $WORKDIR

genenv

生成 Kolla 所需要的环境变量。

genenv 最终生成 2 个环境变量文件 ./openrc./compose/openstack.env

  1. openrc

    OpenStack的访问文件,用于各种 client 访问 OpenStack API。

     128 export OS_AUTH_URL="http://${KEYSTONE_PUBLIC_SERVICE_HOST}:5000/v2.0"
     129 export OS_USERNAME=$ADMIN_TENANT_NAME
     130 export OS_PASSWORD=$ADMIN_USER_PASSWORD
     131 export OS_TENANT_NAME=$ADMIN_TENANT_NAME
  2. openstack.env

    Kolla 所有 docker 镜像在启动时需要的配置文件。从镜像启动一个容器时,需要读取这个文件的内容,并初始化各个服务(在编译镜像时,各种 OpenStack 服务还没有配置,只是安装在镜像中而已)。

kolla

Kolla 辅助工具脚本。这个脚本可通过 kolla -h 查询用法。

脚本里面定义了一系列的函数:

  1. process

    通过 docker-compose 启动 docker 容器。

  2. process_all

    启动一整个OpenStack所需要的容器,单个容器通过 process 启动

  3. check_selinux

    检查 selinux 状态

  4. pre_start

    调用 check_selinux,并 source openrc,如果 openrc 文件不存在,那么需要通过 genenv 生成

  5. post_start

    等待 OpenStack 服务启动完毕

  6. usage

    帮助函数

使用这个脚本可启动一个测试环境。

其它脚本

cleanup-* 清理环境

init-runonce 初始化 OpenStack 配置,下载镜像、增加安全组、建立初始网络、更新配额设置等

pre-commit-hook Git 提交前的钩子脚本,会调用 validate* 脚本进行处理

update-build-links 更新 docker 镜像定义目录的 build 文件链接

validate* 检查各个文件是否有效

转载于:https://www.cnblogs.com/fengyc/p/4500509.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值