bootstrap

<stdin> - OpenStack 文档

版权所有 2015 Hewlett-Packard Development Company, L.P.

根据 Apache 许可证 2.0 版(“许可证”)授权;除非符合许可证,否则您不得使用此文件。您可以从以下位置获取许可证的副本:

https://apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,根据许可证分发的软件以“原样”基础分发,不提供任何形式的保证或条件,无论是明示的还是暗示的。请参阅许可证以了解管理许可证下权限和限制的具体语言。

# DIVIDER #!/bin/bash # DIVIDER # DIVIDER function echo_summary { local xtrace xtrace=$(set +o | grep xtrace) set +o xtrace echo $@ >&6 echo echo "#********************************************" echo "# " $@ echo "#********************************************" echo $xtrace } # DIVIDER function stop { stop=$1 shift if [[ "$@" =~ "$stop" ]]; then echo "STOP called for $1" exit 1 fi } # DIVIDER function trueorfalse { local xtrace=$(set +o | grep xtrace) set +o xtrace local default=$1 local literal=$2 local testval=${!literal:-} [[ -z "$testval" ]] && { echo "$default"; return; } [[ "0 no No NO false False FALSE" =~ "$testval" ]] && { echo "False"; return; } [[ "1 yes Yes YES true True TRUE" =~ "$testval" ]] && { echo "True"; return; } echo "$default" $xtrace } # DIVIDER function git_clone { local git_remote=$1 local git_dest=$2 local git_ref=$3 local orig_dir=$(pwd) local git_clone_flags="" RECLONE=$(trueorfalse False RECLONE) ERROR_ON_CLONE=$(trueorfalse False ERROR_ON_CLONE) if [[ "${GIT_DEPTH}" -gt 0 ]]; then git_clone_flags="$git_clone_flags --depth $GIT_DEPTH" fi if [[ "$OFFLINE" = "True" ]]; then echo "Running in offline mode, clones already exist" # DIVIDER cd $git_dest git show --oneline | head -1 cd $orig_dir return fi if echo $git_ref | egrep -q "^refs"; then # DIVIDER if [[ ! -d $git_dest ]]; then [[ "$ERROR_ON_CLONE" = "True" ]] && \ die $LINENO "Cloning not allowed in this configuration" git_timed clone $git_clone_flags $git_remote $git_dest fi cd $git_dest git_timed fetch $git_remote $git_ref && git checkout FETCH_HEAD else # DIVIDER if [[ ! -d $git_dest ]]; then [[ "$ERROR_ON_CLONE" = "True" ]] && \ die $LINENO "Cloning not allowed in this configuration" git_timed clone $git_clone_flags $git_remote $git_dest cd $git_dest # DIVIDER git checkout $git_ref elif [[ "$RECLONE" = "True" ]]; then # DIVIDER cd $git_dest # DIVIDER git remote set-url origin $git_remote git_timed fetch origin # DIVIDER find $git_dest -name '*.pyc' -delete # DIVIDER if [[ -n "`git show-ref refs/tags/$git_ref`" ]]; then git_update_tag $git_ref elif [[ -n "`git show-ref refs/heads/$git_ref`" ]]; then git_update_branch $git_ref elif [[ -n "`git show-ref refs/remotes/origin/$git_ref`" ]]; then git_update_remote_branch $git_ref else die $LINENO "$git_ref is neither branch nor tag" fi fi fi # DIVIDER cd $git_dest git show --oneline | head -1 cd $orig_dir } # DIVIDER function git_timed { local count=0 local timeout=0 if [[ -n "${GIT_TIMEOUT}" ]]; then timeout=${GIT_TIMEOUT} fi until timeout -s SIGINT ${timeout} git "$@"; do # DIVIDER if [[ $? -ne 124 ]]; then die $LINENO "git call failed: [git $@]" fi count=$(($count + 1)) warn "timeout ${count} for git call: [git $@]" if [ $count -eq 3 ]; then die $LINENO "Maximum of 3 git retries reached" fi sleep 5 done } # DIVIDER function git_update_branch { local git_branch=$1 git checkout -f origin/$git_branch # DIVIDER git branch -D $git_branch || true git checkout -b $git_branch } # DIVIDER function git_update_remote_branch { local git_branch=$1 git checkout -b $git_branch -t origin/$git_branch } # DIVIDER function git_update_tag { local git_tag=$1 git tag -d $git_tag # DIVIDER git_timed fetch origin tag $git_tag git checkout -f $git_tag } function localrc_path { local side=$1 local path if [[ $side == "base" ]]; then path=$BASE_DEVSTACK_DIR elif [[ $side == "target" ]]; then path=$TARGET_DEVSTACK_DIR else die $LINENO "side must be base or target!" fi if [[ -e "$path/local.conf" ]]; then echo "$path/local.conf" else echo "$path/localrc" fi } function dump_local_files { local dir=$1 for i in $dir/local*; do echo "_______________________________________________" echo "-- $i -- file dump" echo "_______________________________________________" cat $i echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" done } function fetch_devstacks { devstacks_clone devstacks_setup_environment devstacks_setup_settings } function devstacks_clone { # DIVIDER # DIVIDER if [[ ! -d $BASE_DEVSTACK_DIR ]]; then git_clone $BASE_DEVSTACK_REPO $BASE_DEVSTACK_DIR $BASE_DEVSTACK_BRANCH fi # DIVIDER if [[ ! -d $TARGET_DEVSTACK_DIR ]]; then git_clone $TARGET_DEVSTACK_REPO $TARGET_DEVSTACK_DIR $TARGET_DEVSTACK_BRANCH fi } function devstacks_setup_environment { # DIVIDER source $TARGET_DEVSTACK_DIR/functions-common source $TARGET_DEVSTACK_DIR/inc/python # DIVIDER _DEFAULT_PYTHON3_VERSION="$(_get_python_version python3)" export PYTHON3_VERSION=${PYTHON3_VERSION:-${_DEFAULT_PYTHON3_VERSION:-3.5}} # DIVIDER if [[ -d ${STACK_ROOT}/images ]]; then rsync -a ${STACK_ROOT}/images/* $BASE_DEVSTACK_DIR/files fi } function devstacks_setup_settings { # DIVIDER install_devstack_tools # DIVIDER # DIVIDER if [[ -r $BASE_DEVSTACK_DIR/localrc ]]; then # DIVIDER echo "[[local|localrc]]" > $BASE_DEVSTACK_DIR/local.conf.orig cat $BASE_DEVSTACK_DIR/localrc >> $BASE_DEVSTACK_DIR/local.conf.orig rm $BASE_DEVSTACK_DIR/localrc fi # DIVIDER if [[ -r $BASE_DEVSTACK_DIR/local.conf ]]; then dsconf merge_lc $BASE_DEVSTACK_DIR/local.conf.orig $BASE_DEVSTACK_DIR/local.conf rm $BASE_DEVSTACK_DIR/local.conf fi # DIVIDER sed -e " s|\@BASE_RELEASE_DIR\@|$BASE_RELEASE_DIR| s|\@DATA_DIR@|$DATA_DIR| " $GRENADE_DIR/devstack.local.conf.base >$BASE_DEVSTACK_DIR/local.conf # DIVIDER if [[ -r $BASE_DEVSTACK_DIR/local.conf.orig ]]; then dsconf merge_lc $BASE_DEVSTACK_DIR/local.conf $BASE_DEVSTACK_DIR/local.conf.orig fi # DIVIDER if [[ -r $GRENADE_DIR/devstack.local.conf ]]; then dsconf merge_lc $BASE_DEVSTACK_DIR/local.conf $GRENADE_DIR/devstack.local.conf elif [[ -r $GRENADE_DIR/devstack.localrc ]]; then echo "[[local|localrc]]" > $GRENADE_DIR/devstack.local.conf cat $GRENADE_DIR/devstack.localrc >> $GRENADE_DIR/devstack.local.conf dsconf merge_lc $BASE_DEVSTACK_DIR/local.conf $GRENADE_DIR/devstack.local.conf fi dump_local_files $BASE_DEVSTACK_DIR # DIVIDER # DIVIDER # DIVIDER if [[ -r $TARGET_DEVSTACK_DIR/localrc ]]; then # DIVIDER echo "[[local|localrc]]" > $TARGET_DEVSTACK_DIR/local.conf.orig cat $TARGET_DEVSTACK_DIR/localrc >> $TARGET_DEVSTACK_DIR/local.conf.orig rm $TARGET_DEVSTACK_DIR/localrc fi # DIVIDER if [[ -r $TARGET_DEVSTACK_DIR/local.conf ]]; then dsconf merge_lc $TARGET_DEVSTACK_DIR/local.conf.orig $TARGET_DEVSTACK_DIR/local.conf rm $TARGET_DEVSTACK_DIR/local.conf fi # DIVIDER sed -e " s|\@TARGET_RELEASE_DIR\@|$TARGET_RELEASE_DIR| s|\@DATA_DIR@|$DATA_DIR| " $GRENADE_DIR/devstack.local.conf.target >$TARGET_DEVSTACK_DIR/local.conf # DIVIDER if [[ -r $TARGET_DEVSTACK_DIR/local.conf.orig ]]; then dsconf merge_lc $TARGET_DEVSTACK_DIR/local.conf $TARGET_DEVSTACK_DIR/local.conf.orig fi # DIVIDER if [[ -r $GRENADE_DIR/devstack.local.conf ]]; then dsconf merge_lc $TARGET_DEVSTACK_DIR/local.conf $GRENADE_DIR/devstack.local.conf elif [[ -r $GRENADE_DIR/devstack.localrc ]]; then echo "[[local|localrc]]" > $GRENADE_DIR/devstack.local.conf cat $GRENADE_DIR/devstack.localrc >> $GRENADE_DIR/devstack.local.conf dsconf merge_lc $TARGET_DEVSTACK_DIR/local.conf $GRENADE_DIR/devstack.local.conf fi dump_local_files $TARGET_DEVSTACK_DIR } # DIVIDER

Grenade 的引导库

我们希望 grenade 很大程度上使用 DEVSTACK_TARGET 函数,但为了做到这一点,我们需要达到拥有一个可用的 DEVSTACK_TARGET 的点。此文件包含足够的功能来获得一个可用的 DEVSTACK_TARGET,然后让我们将我们的功能转移到那里。其中大部分都已从上游 devstack 手动复制。

以下变量假定由某些函数定义

  • GRENADE_DIR
  • STACK_ROOT
  • BASE_DEVSTACK_DIR
  • BASE_DEVSTACK_BRANCH
  • TARGET_DEVSTACK_DIR
  • TARGET_DEVSTACK_BRANCH

用于 git 相关函数

  • RECLONE
  • OFFLINE
  • ERROR_ON_CLONE
  • GIT_TIMEOUT

回显到摘要日志文件

此函数应用于将消息发送到摘要日志文件,以便进行良好的高级进度监控。

在特定阶段停止

使用已弃用,并在重构完成后将被删除。

将配置值标准化为 True 或 False。接受 False:0 no No NO false False FALSE 接受 True:1 yes Yes YES true True TRUE VAR=$(trueorfalse default-value test-value)

仅当目录尚不存在时才进行 git clone。由于DEST可能不归安装用户所有,我们创建目录并更改为适当的用户所有权。设置全局RECLONE=yes以模拟克隆,当目标目录存在时。设置全局ERROR_ON_CLONE=True如果 git 仓库不存在,则中止执行并显示错误(默认值为 False,表示将克隆仓库)。使用全局变量ERROR_ON_CLONE, OFFLINE, RECLONEgit_clone remote dest-dir branch

打印结果,以便我们知道日志中使用了哪个更改

如果我们的分支名称是 gerrit 样式的 refs/changes/...

仅当目录不存在时才进行完全克隆

此检出语法适用于分支和标签

如果它存在,则模拟克隆在被要求 RECLONE 时的操作

设置要从中拉取的 URL 并获取

删除现有的忽略文件(如 pyc),因为它们会导致破坏(由于 py 文件具有比我们的 pyc 更旧的时间戳,因此 python 会认为 pyc 文件是正确的,并使用它们)

根据类型(标签、分支)相应地处理 git_ref

打印结果,以便我们知道日志中使用了哪个更改

git 有时可能会陷入无限循环,出现瞬态网络错误或其他远程端问题。这会将 git 包装在超时/重试循环中,旨在监视可能挂起的非本地 git 进程。如果设置了 GIT_TIMEOUT,则将其直接传递给 timeout(1);否则,默认值 0 将保持现状,即无限期等待。用法:git_timed <git-command>

124 是 timeout(1) 在达到超时时返回的特殊代码;否则,假定为致命错误

git update 使用引用作为分支。git_update_branch ref

本地分支可能不存在

git update 使用引用作为分支。git_update_remote_branch ref

git update 使用引用作为标签。小心编辑该仓库的源代码,因为工作副本将处于分离的模式。git_update_tag ref

仅获取给定的标签

获取基础 Devstack

如果不存在 DevStack,则获取

获取目标 Devstack

这取决于 REQUIREMENTS_DIR 在 grenaderc 中设置,它需要设置才能达到这一步。

当应用程序支持 Python 3 时,将特定版本的 Python 3 添加到此变量将使用该版本的解释器安装该应用程序,而不是 2.7。

加载下载的镜像的副本(如果不存在)

dsconf 仅由此函数和 devstack_localrc 需要,但仅当基础由 grenade 安装时。此外,当基础部署不由 grenade 执行时,在创建资源之前安装 devstack-tools 也会更新 pbr(至少从 rocky->master),导致在使用 pbr 方法运行服务时出现异常(例如 nova-conductor),可能是因为它们仍在寻找旧版本。

设置基础 localrc

如果存在 localrc,则将其转换为 local.conf.orig 并删除该工件

转换为 local.conf

如果存在 local.conf,则将其合并到 local.conf.orig(我们稍后将重新合并)

将 devstack.local.conf.target 放置为 local.conf

如果 local.conf.orig 或 localrc.orig 存在,则将其附加到 local.conf

如果 devstack.local.conf 存在,则将其附加到 locarc

... 现在轮到 TARGET

设置目标 local.conf

如果存在 localrc,则将其转换为 local.conf.orig 并删除该工件

转换为 local.conf

如果存在 local.conf,则将其合并到 local.conf.orig(我们稍后将重新合并)

将 devstack.local.conf.target 放置为 local.conf

如果 local.conf.orig 或 localrc.orig 存在,则将其附加到 local.conf

如果 devstack.local.conf 存在,则将其附加到 locarc