diff options
author | Yifei Xue <xueyifei@huawei.com> | 2017-08-15 11:40:26 +0800 |
---|---|---|
committer | Yifei Xue <xueyifei@huawei.com> | 2017-08-31 15:33:56 +0800 |
commit | 8c978370a123dccc0b93ee9bd2ba46f8167a2cc2 (patch) | |
tree | fe3b398de2de17e5c30ceea456dbe123bc1e6f69 /deploy | |
parent | 760c966b5095fb0cfe0a2ac4014a337531a8df1d (diff) |
Support offline deployment for nosdn no feature scenario
JIRA: -
Add a repo docker which includes ubuntu PPA and python packages
used for offline deployment.
Change-Id: Iad9b0df7f33f5a7ab974c5deffb408fc93b3f3ad
Signed-off-by: Yifei Xue <xueyifei@huawei.com>
Diffstat (limited to 'deploy')
18 files changed, 854 insertions, 6 deletions
diff --git a/deploy/adapters/ansible/roles/config-compute/files/apt.conf b/deploy/adapters/ansible/roles/config-compute/files/apt.conf new file mode 100644 index 00000000..afe7ab9e --- /dev/null +++ b/deploy/adapters/ansible/roles/config-compute/files/apt.conf @@ -0,0 +1,3 @@ +APT::Get::Assume-Yes "true"; +APT::Get::force-yes "true"; +APT::Get::AllowUnauthenticated "true"; diff --git a/deploy/adapters/ansible/roles/config-compute/tasks/Ubuntu.yml b/deploy/adapters/ansible/roles/config-compute/tasks/Ubuntu.yml index 6e6cae85..c36a7c2e 100644 --- a/deploy/adapters/ansible/roles/config-compute/tasks/Ubuntu.yml +++ b/deploy/adapters/ansible/roles/config-compute/tasks/Ubuntu.yml @@ -16,6 +16,18 @@ - meta: flush_handlers +- name: create pip conf directory + file: + path: "~/.pip/" + state: directory + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: add pip conf + template: + src: pip.conf.j2 + dest: "~/.pip/pip.conf" + when: offline_deployment is defined and offline_deployment == "Enable" + - name: check apt source shell: "ping -c 2 {{ LOCAL_REPOSITORY_IP }} > /dev/null" register: checkresult @@ -33,6 +45,18 @@ dest: /etc/apt/sources.list when: checkresult.rc != 0 +- name: change sources list(apt) + template: + src: sources.list.offline + dest: /etc/apt/sources.list + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: add apt.conf + copy: + src: apt.conf + dest: /etc/apt/apt.conf + when: offline_deployment is defined and offline_deployment == "Enable" + - name: Install apt packages apt: pkg: "nfs-kernel-server" diff --git a/deploy/adapters/ansible/roles/config-compute/templates/pip.conf.j2 b/deploy/adapters/ansible/roles/config-compute/templates/pip.conf.j2 new file mode 100644 index 00000000..1ada4763 --- /dev/null +++ b/deploy/adapters/ansible/roles/config-compute/templates/pip.conf.j2 @@ -0,0 +1,5 @@ +[global] +find-links = http://{{ offline_repo_ip }}:{{ offline_repo_port }}/pip_pkg +no-index = true +[install] +trusted-host = {{ offline_repo_ip }} diff --git a/deploy/adapters/ansible/roles/config-compute/templates/sources.list.offline b/deploy/adapters/ansible/roles/config-compute/templates/sources.list.offline new file mode 100644 index 00000000..15aa736f --- /dev/null +++ b/deploy/adapters/ansible/roles/config-compute/templates/sources.list.offline @@ -0,0 +1 @@ +deb [arch=amd64] http://{{ offline_repo_ip }}:{{ offline_repo_port }}/xenial-ocata-ppa xenial main diff --git a/deploy/adapters/ansible/roles/config-controller/files/apt.conf b/deploy/adapters/ansible/roles/config-controller/files/apt.conf new file mode 100644 index 00000000..afe7ab9e --- /dev/null +++ b/deploy/adapters/ansible/roles/config-controller/files/apt.conf @@ -0,0 +1,3 @@ +APT::Get::Assume-Yes "true"; +APT::Get::force-yes "true"; +APT::Get::AllowUnauthenticated "true"; diff --git a/deploy/adapters/ansible/roles/config-controller/tasks/Ubuntu.yml b/deploy/adapters/ansible/roles/config-controller/tasks/Ubuntu.yml index e3b467cf..c45980f7 100644 --- a/deploy/adapters/ansible/roles/config-controller/tasks/Ubuntu.yml +++ b/deploy/adapters/ansible/roles/config-controller/tasks/Ubuntu.yml @@ -32,3 +32,15 @@ src: sources.list.official dest: /etc/apt/sources.list when: checkresult.rc != 0 + +- name: change sources list(apt) + template: + src: sources.list.offline + dest: /etc/apt/sources.list + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: add apt.conf + copy: + src: apt.conf + dest: /etc/apt/apt.conf + when: offline_deployment is defined and offline_deployment == "Enable" diff --git a/deploy/adapters/ansible/roles/config-controller/templates/sources.list.offline b/deploy/adapters/ansible/roles/config-controller/templates/sources.list.offline new file mode 100644 index 00000000..15aa736f --- /dev/null +++ b/deploy/adapters/ansible/roles/config-controller/templates/sources.list.offline @@ -0,0 +1 @@ +deb [arch=amd64] http://{{ offline_repo_ip }}:{{ offline_repo_port }}/xenial-ocata-ppa xenial main diff --git a/deploy/adapters/ansible/roles/config-osa/files/apt.conf b/deploy/adapters/ansible/roles/config-osa/files/apt.conf new file mode 100644 index 00000000..afe7ab9e --- /dev/null +++ b/deploy/adapters/ansible/roles/config-osa/files/apt.conf @@ -0,0 +1,3 @@ +APT::Get::Assume-Yes "true"; +APT::Get::force-yes "true"; +APT::Get::AllowUnauthenticated "true"; diff --git a/deploy/adapters/ansible/roles/config-osa/files/op-venv-script.sh b/deploy/adapters/ansible/roles/config-osa/files/op-venv-script.sh new file mode 100644 index 00000000..c598027f --- /dev/null +++ b/deploy/adapters/ansible/roles/config-osa/files/op-venv-script.sh @@ -0,0 +1,230 @@ +#!/usr/local/env bash + +set -ev + +function venv_create { + VENV_PATH="$1" + VENV_FILE="$2" + ROLE_VENV_WITH_INDEX="$3" + VENV_VALUES="$4" + + # If the venv working directory already exists remove it + [[ -d "/tmp/${VENV_PATH}" ]] && rm -rf "/tmp/${VENV_PATH}" + + # If the pip build directory already exists remove it + [[ -d "/tmp/${VENV_FILE}" ]] && rm -rf "/tmp/${VENV_FILE}" + + # Create the virtualenv shell + /usr/local/bin/virtualenv --always-copy --extra-search-dir /var/www/repo/os-releases/15.1.4/ubuntu-16.04-x86_64 --never-download "${VENV_PATH}" + + # Create the pip build directory + mkdir -p "/tmp/${VENV_FILE}" + + # Activate the python virtual environment for good measure + source "${VENV_PATH}/bin/activate" + + # Run the pip install within the venv and specify a specific build directory which + # resolves pip locking issues when run in parallel. + + if [ "${ROLE_VENV_WITH_INDEX}" = false ]; then + ${VENV_PATH}/bin/pip install --build "/tmp/${VENV_FILE}" --timeout 120 --find-links /var/www/repo/os-releases/15.1.4/ubuntu-16.04-x86_64 --log /var/log/repo/repo_venv_builder.log --no-index ${VENV_VALUES} + + + else + ${VENV_PATH}/bin/pip install --build "/tmp/${VENV_FILE}" --timeout 120 --find-links /var/www/repo/os-releases/15.1.4/ubuntu-16.04-x86_64 --log /var/log/repo/repo_venv_builder.log ${VENV_VALUES} + + fi + + # Deactivate the venv for good measure + deactivate + + # Find and remove all of the python pyc files + find "${VENV_PATH}" -type f -name '*.pyc' -delete + + # Create the archive + tar czf "${VENV_FILE}.tgz" -C "${VENV_PATH}" . + + # Create a checksum file for the archive + sha1sum "${VENV_FILE}.tgz" | awk '{print $1}' > "${VENV_FILE}.checksum" + + # Remove the working directories + rm -rf "${VENV_PATH}" + rm -rf "/tmp/${VENV_FILE}" +} + +# First operation is to sort and set the known os_* roles and create a unique dict. +# NOTE: this is a Jinja loop and will not be rendered within the script. For debugging +# purposes the group data will be rendered as a comment. +# venv to build os_glance +# * packages within the os_glance venv: [u'glance', u'keystonemiddleware', u'os-brick', u'pycrypto', u'pymysql', u'python-cinderclient', u'python-glanceclient', u'python-keystoneclient', u'python-memcached', u'python-swiftclient', u'warlock'] +# venv to build os_ceilometer +# * packages within the os_ceilometer venv: [u'ceilometer', u'ceilometermiddleware', u'gnocchiclient', u'libvirt-python', u'pycrypto', u'pymongo', u'pymysql', u'python-ceilometerclient', u'python-memcached', u'tooz', u'warlock'] +# venv to build os_heat +# * packages within the os_heat venv: [u'heat', u'keystonemiddleware', u'pycrypto', u'pymysql', u'python-ceilometerclient', u'python-cinderclient', u'python-glanceclient', u'python-heatclient', u'python-keystoneclient', u'python-memcached', u'python-neutronclient', u'python-novaclient', u'python-openstackclient', u'python-swiftclient', u'python-troveclient'] +# venv to build os_aodh +# * packages within the os_aodh venv: [u'aodh[mysql]', u'ceilometermiddleware', u'gnocchiclient', u'pycrypto', u'pymysql', u'python-ceilometerclient', u'python-memcached', u'warlock'] +# venv to build os_neutron +# * packages within the os_neutron venv: [u'cliff', u'configobj', u'keystonemiddleware', u'neutron', u'pycrypto', u'pymysql', u'python-glanceclient', u'python-keystoneclient', u'python-memcached', u'python-neutronclient', u'python-novaclient', u'repoze.lru'] +# venv to build os_cinder +# * packages within the os_cinder venv: [u'cinder', u'ecdsa', u'httplib2', u'keystonemiddleware', u'pycrypto', u'pymysql', u'python-cinderclient', u'python-keystoneclient', u'python-memcached'] +# venv to build os_tempest +# * packages within the os_tempest venv: [u'junitxml', u'nose', u'python-ceilometerclient', u'python-cinderclient', u'python-glanceclient', u'python-heatclient', u'python-keystoneclient', u'python-memcached', u'python-neutronclient', u'python-novaclient', u'python-openstackclient', u'python-saharaclient', u'python-subunit', u'python-swiftclient', u'tempest'] +# venv to build os_keystone +# * packages within the os_keystone venv: [u'argparse', u'keystone', u'keystonemiddleware', u'ldappool', u'lxml', u'oslo.log', u'oslo.middleware', u'pbr', u'pycrypto', u'pymysql', u'pysaml2', u'python-keystoneclient', u'python-ldap', u'python-memcached', u'python-openstackclient', u'repoze.lru', u'uwsgi'] +# venv to build os_gnocchi +# * packages within the os_gnocchi venv: [u'gnocchi[mysql,file,swift,ceph]', u'gnocchiclient', u'keystonemiddleware', u'pycrypto', u'python-memcached'] +# venv to build os_rally +# * packages within the os_rally venv: [u'pymysql', u'rally', u'setuptools'] +# venv to build os_nova +# * packages within the os_nova venv: [u'libvirt-python', u'nova-powervm', u'pyasn1-modules', u'keystonemiddleware', u'nova', u'pycrypto', u'pymysql', u'python-keystoneclient', u'python-memcached', u'python-novaclient', u'python-ironicclient', u'uwsgi', u'websockify', u'nova-lxd', u'pylxd', u'pyopenssl'] +# venv to build os_horizon +# * packages within the os_horizon venv: [u'designate_dashboard', u'django-appconf', u'django-openstack-auth', u'greenlet', u'horizon', u'ironic-ui', u'keystonemiddleware', u'magnum-ui', u'mysql-python', u'neutron-lbaas-dashboard', u'oslo.config', u'ply', u'pycrypto', u'pymysql', u'python-keystoneclient', u'python-memcached', u'sahara_dashboard', u'trove_dashboard'] + +PID=() +# Run the venv create. This will loop over all of the os_group role packages and create a python virtual env. +# Venv creation is done parallel at a count of the known "ansible_processor_count" or using a default of 5. +# This loop will enter the venv build directory and create tagged venvs in a distribution directory +# If the venv archive already exists the creation process will be skipped +pushd "/var/www/repo/venvs/15.1.4/ubuntu-16.04-x86_64" + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/heat" +ROLE_VENV_FILE="heat-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "heat keystonemiddleware pycrypto pymysql python-ceilometerclient python-cinderclient python-glanceclient python-heatclient python-keystoneclient python-memcached python-neutronclient python-novaclient python-openstackclient python-swiftclient python-troveclient" & + pid[1]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/nova" +ROLE_VENV_FILE="nova-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "libvirt-python nova-powervm pyasn1-modules keystonemiddleware nova pycrypto pymysql python-keystoneclient python-memcached python-novaclient python-ironicclient uwsgi websockify nova-lxd pylxd pyopenssl" & + pid[2]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/keystone" +ROLE_VENV_FILE="keystone-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "argparse keystone keystonemiddleware ldappool lxml oslo.log oslo.middleware pbr pycrypto pymysql pysaml2 python-keystoneclient python-ldap python-memcached python-openstackclient repoze.lru uwsgi" & + pid[3]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +#ROLE_VENV_WITH_INDEX=true +#ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/rally" +#ROLE_VENV_FILE="rally-15.1.4-x86_64" +#if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then +# venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "pbr pymysql rally setuptools" & +# pid[4]=$! +#fi +#unset ROLE_VENV_PATH +#unset ROLE_VENV_FILE +#unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/gnocchi" +ROLE_VENV_FILE="gnocchi-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "gnocchi[mysql,file,swift,ceph] gnocchiclient keystonemiddleware pycrypto python-memcached" & + pid[5]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/aodh" +ROLE_VENV_FILE="aodh-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "aodh[mysql] ceilometermiddleware gnocchiclient pycrypto pymysql python-ceilometerclient python-memcached warlock" & + pid[6]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/neutron" +ROLE_VENV_FILE="neutron-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "cliff configobj keystonemiddleware neutron pycrypto pymysql python-glanceclient python-keystoneclient python-memcached python-neutronclient python-novaclient repoze.lru" & + pid[7]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/cinder" +ROLE_VENV_FILE="cinder-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "cinder ecdsa httplib2 keystonemiddleware pycrypto pymysql python-cinderclient python-keystoneclient python-memcached" & + pid[8]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX +for job_pid in ${!pid[@]}; do + wait ${pid[$job_pid]} || exit 99 +done + + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/glance" +ROLE_VENV_FILE="glance-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "glance keystonemiddleware os-brick pycrypto pymysql python-cinderclient python-glanceclient python-keystoneclient python-memcached python-swiftclient warlock" & + pid[9]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +#ROLE_VENV_WITH_INDEX=true +#ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/tempest" +#ROLE_VENV_FILE="tempest-15.1.4-x86_64" +#if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then +# venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "junitxml nose python-ceilometerclient python-cinderclient python-glanceclient python-heatclient python-keystoneclient python-memcached python-neutronclient python-novaclient python-openstackclient python-saharaclient python-subunit python-swiftclient tempest" & +# pid[10]=$! +#fi +#unset ROLE_VENV_PATH +#unset ROLE_VENV_FILE +#unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/horizon" +ROLE_VENV_FILE="horizon-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "designate_dashboard django-appconf django-openstack-auth greenlet horizon ironic-ui keystonemiddleware magnum-ui mysql-python neutron-lbaas-dashboard oslo.config ply pycrypto pymysql python-keystoneclient python-memcached sahara_dashboard trove_dashboard" & + pid[11]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX + +ROLE_VENV_WITH_INDEX=false +ROLE_VENV_PATH="/tmp/openstack-venv-builder/venvs/ceilometer" +ROLE_VENV_FILE="ceilometer-15.1.4-x86_64" +if [ ! -f "${ROLE_VENV_FILE}.tgz" ];then + venv_create "${ROLE_VENV_PATH}" "${ROLE_VENV_FILE}" "${ROLE_VENV_WITH_INDEX}" "ceilometer ceilometermiddleware gnocchiclient libvirt-python pycrypto pymongo pymysql python-ceilometerclient python-memcached tooz warlock" & + pid[12]=$! +fi +unset ROLE_VENV_PATH +unset ROLE_VENV_FILE +unset ROLE_VENV_WITH_INDEX +for job_pid in ${!pid[@]}; do + wait ${pid[$job_pid]} || exit 99 +done + +popd + diff --git a/deploy/adapters/ansible/roles/config-osa/files/requirements_absolute_requirements.txt b/deploy/adapters/ansible/roles/config-osa/files/requirements_absolute_requirements.txt new file mode 100644 index 00000000..56067a6c --- /dev/null +++ b/deploy/adapters/ansible/roles/config-osa/files/requirements_absolute_requirements.txt @@ -0,0 +1,314 @@ +alabaster==0.7.9 +alembic==0.8.10 +amqp==1.4.9 +ansible==2.3.2.0 +anyjson==0.3.3 +aodh==4.0.1.dev5 +aodhclient==0.8.0 +appdirs==1.4.3 +argparse==1.4.0 +automaton==1.7.0 +babel==2.3.4 +beautifulsoup4==4.5.3 +boto==2.45.0 +cachetools==2.0.0 +cassandra_driver==3.7.1 +castellan==0.5.0 +ceilometer==8.0.2.dev15 +ceilometermiddleware==1.0.2 +cffi==1.9.1 +cinder==10.0.2.dev24 +cliff==2.4.0 +cmd2==0.6.9 +configobj==5.0.6 +contextlib2==0.5.4 +cotyledon==1.6.8 +crc16==0.1.1 +croniter==0.3.14 +cryptography==1.7.1 +cursive==0.1.1 +cython==0.26 +datrie==0.7.1 +debtcollector==1.11.0 +decorator==4.0.11 +designate_dashboard==4.0.1.dev3 +django==1.8.17 +django_appconf==1.0.2 +django_babel==0.5.1 +django_compressor==2.1 +django_openstack_auth==3.1.1 +django_pyscss==2.0.2 +dnspython==1.15.0 +docutils==0.12 +dogpile.cache==0.6.2 +dragonflow==3.0.1.dev41 +ecdsa==0.13 +enum34==1.1.6 +eventlet==0.19.0 +extras==1.0.0 +fasteners==0.14.1 +felix==1.4.4 +fixtures==3.0.0 +funcsigs==1.0.2 +functools32==3.2.3.post2 +futures==3.0.5 +futurist==0.21.0 +gevent==1.2.1 +glance==14.0.1.dev5 +glance_store==0.20.0 +gnocchi==3.1.4 +gnocchiclient==3.0.0 +google_api_python_client==1.6.1 +greenlet==0.4.11 +heat==8.0.2.dev4 +horizon==11.0.2.dev21 +httplib2==0.9.2 +idna==2.2 +ijson==2.3 +ipaddress==1.0.18 +ironic_ui==2.2.1.dev6 +iso8601==0.1.11 +jinja2==2.8.1 +jmespath==0.9.0 +jsonpatch==1.15 +jsonpath_rw==1.4.0 +jsonpath_rw_ext==1.0.0 +jsonpointer==1.10 +jsonschema==2.5.1 +junitxml==0.7 +kafka_python==1.3.2 +kazoo==2.2.1 +keystone==11.0.1 +keystoneauth1==2.18.0 +keystonemiddleware==4.14.0 +kombu==3.0.37 +ldappool==2.0.0 +libvirt_python==2.5.0 +linecache2==1.0.0 +logutils==0.3.3 +lxc_python2==0.1 +lxml==3.7.2 +lz4==0.8.2 +magnum_ui==2.2.1.dev4 +mako==1.0.6 +markupsafe==0.23 +microversion_parse==0.1.4 +monotonic==1.2 +msgpack_python==0.4.8 +munch==2.2.0 +murano_pkg_check==0.3.0 +mysql_python==1.2.5 +ndg_httpsclient==0.4.2 +netaddr==0.7.19 +netifaces==0.10.5 +networking_calico==1.3.2.dev3 +networkx==1.11 +neutron==10.0.2.dev45 +neutron_dynamic_routing==10.0.1.dev8 +neutron_fwaas==10.0.2.dev3 +neutron_lbaas==10.0.1 +neutron_lbaas_dashboard==2.0.1.dev7 +neutron_lib==1.1.0 +neutron_vpnaas==10.0.1.dev5 +nose==1.3.7 +nova==15.0.4 +nova_lxd==15.0.1 +nova_powervm==4.0.1.dev9 +numpy==1.12.0 +oauth2client==3.0.0 +oauthlib==2.0.1 +openstacksdk==0.9.13 +os_brick==1.11.0 +osc_lib==1.3.0 +os_client_config==1.26.0 +os_faults==0.1.9 +oslo.cache==1.17.0 +oslo.concurrency==3.18.0 +oslo.config==3.22.0 +oslo.context==2.12.1 +oslo.db==4.17.0 +oslo.i18n==3.12.0 +oslo.log==3.20.1 +oslo.messaging==5.17.1 +oslo.middleware==3.23.1 +oslo.policy==1.18.0 +oslo.privsep==1.16.0 +oslo.reports==1.17.0 +oslo.rootwrap==5.4.0 +oslo.serialization==2.16.0 +oslo.service==1.19.0 +oslo.utils==3.22.0 +oslo.versionedobjects==1.21.0 +oslo.vmware==2.17.0 +osprofiler==1.5.0 +os_testr==0.8.0 +os_vif==1.4.0 +os_win==1.4.1 +os_xenapi==0.1.1 +ovs==2.6.1 +pandas==0.20.3 +paramiko==2.1.1 +passlib==1.7.0 +paste==2.0.3 +pastedeploy==1.5.2 +pathlib==1.0.1 +pbr==1.10.0 +pecan==1.2.1 +pika==0.10.0 +pika_pool==0.1.3 +pint==0.7.2 +pip==9.0.1 +ply==3.9 +positional==1.1.1 +posix_spawn==0.2.post7 +prettytable==0.7.2 +prometheus_client==0.0.20 +psutil==5.0.1 +pyasn1==0.1.9 +pyasn1_modules==0.0.8 +pycadf==2.5.0 +pycparser==2.17 +pycrypto==2.6.1 +pyghmi==1.0.16 +pygments==2.2.0 +pyinotify==0.9.6 +pyldap==2.4.28 +pylxd==2.2.2 +pymongo==3.4.0 +pymysql==0.7.9 +pyopenssl==16.2.0 +pyparsing==2.1.10 +pypowervm==1.0.0.4 +pyroute2==0.4.12 +pysaml2==4.0.2 +pyscss==1.3.4 +pysmi==0.0.7 +pysnmp==4.3.2 +python_barbicanclient==4.2.0 +python_ceilometerclient==2.8.1 +python_cinderclient==1.11.0 +python_dateutil==2.6.0 +python_designateclient==2.6.0 +python_editor==1.0.3 +python_etcd==0.4.4 +python_glanceclient==2.6.0 +python_heatclient==1.8.0 +python_ironicclient==1.11.1 +python_keystoneclient==3.10.0 +python_ldap==2.4.41 +python_magnumclient==2.5.0 +python_manilaclient==1.14.0 +python_memcached==1.58 +python_mimeparse==1.6.0 +python_mistralclient==3.0.0 +python_monascaclient==1.5.0 +python_muranoclient==0.12.0 +python_neutronclient==6.1.0 +python_novaclient==7.1.0 +python_openstackclient==3.8.1 +python_saharaclient==1.1.0 +python_senlinclient==1.2.0 +python_subunit==1.2.0 +python_swiftclient==3.3.0 +python_troveclient==2.8.0 +python_watcherclient==1.0.0 +python_zaqarclient==1.4.0 +pytz==2016.10 +pyudev==0.21.0 +pyyaml==3.12 +pyzmq==16.0.2 +rally==0.8.2.dev10 +rcssmin==1.0.6 +repoze.lru==0.6 +repoze.who==2.3 +requests==2.12.5 +requestsexceptions==1.1.3 +requests_unixsocket==0.1.5 +retrying==1.3.3 +rfc3986==0.4.1 +rjsmin==1.0.12 +routes==2.4.1 +rsa==3.4.2 +rtslib_fb==2.1.62 +ryu==4.10 +sahara_dashboard==6.0.1.dev7 +scipy==0.18.1 +semantic_version==2.6.0 +setproctitle==1.1.10 +setuptools==33.1.1 +shade==1.22.2 +simplegeneric==0.8.1 +simplejson==3.10.0 +singledispatch==3.4.0.3 +six==1.10.0 +snowballstemmer==1.2.1 +sphinx==1.3.6 +sphinx_rtd_theme==0.1.9 +sqlalchemy==1.0.17 +sqlalchemy_migrate==0.10.0 +sqlalchemy_utils==0.32.12 +sqlparse==0.2.2 +statsd==3.2.1 +stevedore==1.20.0 +suds_jurko==0.6 +taskflow==2.9.0 +tempest==14.0.1.dev142 +tempita==0.5.2 +tenacity==3.7.1 +testrepository==0.0.20 +testtools==2.2.0 +tinyrpc==0.5 +tooz==1.48.0 +traceback2==1.4.0 +trollius==2.1 +trove_dashboard==8.0.1.dev1 +ujson==1.35 +unicodecsv==0.14.1 +unittest2==1.1.0 +uritemplate==3.0.0 +urllib3==1.20 +uwsgi==2.0.15 +virtualenv==15.1.0 +virtualenv_tools==1.0 +voluptuous==0.9.3 +waitress==1.0.1 +warlock==1.2.0 +weakrefmethod==1.0.3 +webob==1.6.3 +websockify==0.8.0 +webtest==2.0.24 +werkzeug==0.11.15 +wheel==0.29.0 +wrapt==1.10.8 +ws4py==0.3.4 +wsme==0.9.1 +xstatic==1.0.1 +xstatic_angular==1.5.8.0 +xstatic_angular_bootstrap==2.2.0.0 +xstatic_angular_fileupload==12.0.4.0 +xstatic_angular_gettext==2.3.8.0 +xstatic_angular_lrdragndrop==1.0.2.2 +xstatic_angular_schema_form==0.8.13.0 +xstatic_bootstrap_datepicker==1.3.1.0 +xstatic_bootstrap_scss==3.3.7.1 +xstatic_bootswatch==3.3.7.0 +xstatic_d3==3.5.17.0 +xstatic_font_awesome==4.7.0.0 +xstatic_hogan==2.0.0.2 +xstatic_jasmine==2.4.1.1 +xstatic_jquery==1.10.2.1 +xstatic_jquery_migrate==1.2.1.1 +xstatic_jquery.quicksearch==2.0.3.1 +xstatic_jquery.tablesorter==2.14.5.1 +xstatic_jquery_ui==1.12.0.1 +xstatic_jsencrypt==2.3.1.1 +xstatic_mdi==1.4.57.0 +xstatic_objectpath==1.2.1.0 +xstatic_rickshaw==1.5.0.0 +xstatic_roboto_fontface==0.5.0.0 +xstatic_smart_table==1.4.13.2 +xstatic_spin==1.2.5.2 +xstatic_term.js==0.0.7.0 +xstatic_tv4==1.2.7.0 +yaql==1.1.3 +zope.interface==4.3.3 diff --git a/deploy/adapters/ansible/roles/config-osa/tasks/main.yml b/deploy/adapters/ansible/roles/config-osa/tasks/main.yml index a96e62ce..2cb79a94 100644..100755 --- a/deploy/adapters/ansible/roles/config-osa/tasks/main.yml +++ b/deploy/adapters/ansible/roles/config-osa/tasks/main.yml @@ -41,7 +41,178 @@ galera_client_apt_repo_url: "http://192.168.137.222/mariadb" galera_repo_url: "[ arch=amd64 ] http://192.168.137.222/mariadb" uca_apt_repo_url: "[ arch=amd64 ] http://192.168.137.222/ubuntu-cloud" - when: checkresult.rc == 0 + when: + - checkresult.rc == 0 + - offline_deployment is defined and offline_deployment == "Disable" + +# yamllint disable rule:line-length +- name: add mariadb local repository + blockinfile: + dest: /etc/openstack_deploy/user_variables.yml + block: | + galera_client_apt_repo_url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/xenial-ocata-ppa xenial main" + galera_repo_url: "[ arch=amd64 ] http://{{ offline_repo_ip }}:{{ offline_repo_port }}/xenial-ocata-ppa xenial main" + uca_apt_repo_url: "[ arch=amd64 ] http://{{ offline_repo_ip }}:{{ offline_repo_port }}/xenial-ocata-ppa xenial main" + _rabbitmq_package_url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/rabbitmq-server_3.6.9-1_all.deb" + percona_package_url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/percona-xtrabackup-24_2.4.5-1.xenial_amd64.deb" + qpress_package_url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/qpress_11-1.xenial_amd64.deb" + haproxy_hatop_download_url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/hatop-0.7.7.tar.gz" + pip_upstream_url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/get-pip.py" + ceph_stable_repo: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/xenial-ocata-ppa" + ceph_pkg_source: "uca" + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: ignore galera client key + shell: | + sed -i '/galera-client-apt-keys/a\ when: offline_deployment is defined and offline_deployment == "Disable"' /etc/ansible/roles/galera_client/tasks/galera_client_install_apt.yml + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: ignore galera server key + shell: | + sed -i '/galera-apt-keys/a\ when: offline_deployment is defined and offline_deployment == "Disable"' /etc/ansible/roles/galera_server/tasks/galera_install_apt.yml + when: offline_deployment is defined and offline_deployment == "Enable" +# yamllint enable rule:line-length + +- name: ignore git clone + lineinfile: + dest: /etc/ansible/roles/repo_build/tasks/repo_clone_git.yml + insertbefore: '^ async_status:' + line: ' ignore_errors: true' + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: add pbr to repo_pip_packages + lineinfile: + dest: /etc/ansible/roles/repo_build/defaults/main.yml + insertafter: '^ - cython' + line: ' - pbr' + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: ignore ceph special ppa + lineinfile: + dest: /etc/ansible/roles/ceph.ceph-common/tasks/installs/debian_ceph_repository.yml + insertafter: '^ - ppa:gluster/nfs-ganesha' + line: ' ignore_errors: true' + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: remove repo_build_pip_no_binary + lineinfile: + dest: /opt/openstack-ansible/playbooks/inventory/group_vars/repo_all.yml + state: absent + regexp: "{{ item }}" + with_items: ['^repo_build_pip_no_binary:', '^ - libvirt-python'] + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: copy venv script + copy: + src: "op-venv-script.sh" + dest: "/opt/op-venv-script.sh" + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: update venv script + blockinfile: + dest: /etc/ansible/roles/repo_build/tasks/repo_venv_build.yml + insertbefore: '^- name: Run venv process script' + block: | + - name: update venv script + copy: + src: "/opt/op-venv-script.sh" + dest: "/opt/op-venv-script.sh" + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: copy absolute requirement + copy: + src: "requirements_absolute_requirements.txt" + dest: "/opt/requirements_absolute_requirements.txt" + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: update absolute requirements + blockinfile: + dest: /etc/ansible/roles/repo_build/tasks/repo_post_build.yml + insertbefore: '^- name: Copy get-pip script into release folder' + block: | + {% raw %} + - name: update absolute requirements + copy: + src: "/opt/requirements_absolute_requirements.txt" + dest: "{{ repo_build_release_path }}/requirements_absolute_requirements.txt" + {% endraw %} + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: add rally and tempest to requirement.txt + blockinfile: + dest: /etc/ansible/roles/repo_build/tasks/repo_pre_build.yml + insertbefore: '^- include: repo_clone_git.yml' + block: | + {% raw %} + - name: add rally and tempest + blockinfile: + dest: "{{ repo_build_release_path }}/requirements.txt" + insertafter: '^wheel' + block: | + rally + tempest + {% endraw %} + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: add lxc image for offline deloyment + blockinfile: + dest: /etc/ansible/roles/lxc_hosts/tasks/main.yml + insertbefore: '^- include: lxc_post_install.yml' + block: | + - name: add lxc image to the lxc cache dir + get_url: + url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/download.tar.gz" + dest: "/opt/download.tar.gz" + + - name: unarchive lxc image tarball + command: su -s /bin/sh -c "tar -zxf /opt/download.tar.gz -C /var/cache/lxc/" + + - name: clear tarball + file: + path: "/opt/download.tar.gz" + state: absent + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: configure pip.conf for lxc hosts and repo lxc + template: + src: pip.conf.j2 + dest: "/etc/ansible/roles/pip_install/templates/pip.conf.j2" + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: set set-upper-constraints downloading + blockinfile: + dest: /opt/openstack-ansible/playbooks/common-tasks/set-upper-constraints.yml + insertafter: '^# Use https' + block: | + - name: download upper-constraints.txt + get_url: + url: "http://{{ offline_repo_ip }}:{{ offline_repo_port }}/upper-constraints.txt" + dest: /opt/ + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: modify set-upper-constraints + shell: | + sed -i 's#\(--constraint\).*$#\1 /opt/upper-constraints.txt#g' \ + /opt/openstack-ansible/playbooks/common-tasks/set-upper-constraints.yml ; + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: copy apt.conf for lxc + copy: + src: apt.conf + dest: "/etc/ansible/roles/lxc_container_create/files/apt.conf" + when: offline_deployment is defined and offline_deployment == "Enable" + +- name: add apt.conf for lxc + blockinfile: + dest: "/etc/ansible/roles/lxc_container_create/tasks/container_create.yml" + insertbefore: '^- name: Create hostname' + block: | + - name: add apt.conf + copy: + src: apt.conf + dest: "/etc/apt/apt.conf" + + when: offline_deployment is defined and offline_deployment == "Enable" - name: copy cinder.yml copy: diff --git a/deploy/adapters/ansible/roles/config-osa/templates/pip.conf.j2 b/deploy/adapters/ansible/roles/config-osa/templates/pip.conf.j2 new file mode 100644 index 00000000..15650561 --- /dev/null +++ b/deploy/adapters/ansible/roles/config-osa/templates/pip.conf.j2 @@ -0,0 +1,29 @@ +# {{ ansible_managed }} + +[global] +{% raw %} +pre = {{ pip_enable_pre_releases }} +{% if not pip_lock_to_internal_repo %} +{% endraw %} +index-url = http://{{ offline_repo_ip }}:{{ offline_repo_port }}/pip_pkg/simple +trusted-host = {{ offline_repo_ip }} +{% raw %} +{% endif %} +timeout = {{ pip_timeout }} +{% if pip_lock_to_internal_repo and pip_links | length > 0 %} +no-index = true +trusted-host = +{% for pip_link in pip_links %} + {{ pip_link.link | netloc_no_port }} +{% endfor %} +{% endif %} + +[install] +upgrade = {{ pip_upgrade }} +{% if pip_lock_to_internal_repo and pip_links | length > 0 %} +find-links = +{% for pip_link in pip_links %} + {{ pip_link.link }} +{% endfor %} +{% endif %} +{% endraw %} diff --git a/deploy/client.py b/deploy/client.py index 981924f1..910aa7f8 100644 --- a/deploy/client.py +++ b/deploy/client.py @@ -259,6 +259,12 @@ opts = [ cfg.StrOpt('plugins', help='plugin dict', default='{}'), + cfg.StrOpt('offline_deployment', + help='offline_deployment', + default='Disable'), + cfg.StrOpt('offline_repo_port', + help='offline_repo_port', + default='5151'), ] CONF.register_cli_opts(opts) @@ -728,6 +734,12 @@ class CompassClient(object): 'password': password } + ip_pattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') + compass_ip = re.findall(ip_pattern, CONF.compass_server)[0] + package_config["compass_ip"] = compass_ip + package_config["offline_repo_port"] = CONF.offline_repo_port + package_config["offline_deployment"] = CONF.offline_deployment + moon_cfgs = [ cfg for cfg in CONF.moon_cfg.split(',') diff --git a/deploy/compass_conf/package_metadata/openstack.conf b/deploy/compass_conf/package_metadata/openstack.conf index f045868e..9f079f9e 100755 --- a/deploy/compass_conf/package_metadata/openstack.conf +++ b/deploy/compass_conf/package_metadata/openstack.conf @@ -64,6 +64,15 @@ METADATA = { } }, + 'compass_ip': { + '_self': { + 'mapping_to': 'compass_ip', + 'field': 'anytype', + 'is_required':False, + 'default_value': '10.1.0.1' + } + }, + 'enable_secgroup': { '_self': { 'mapping_to': 'enable_secgroup', @@ -72,7 +81,6 @@ METADATA = { 'default_value': True } }, - 'enable_fwaas': { '_self': { 'mapping_to': 'enable_fwaas', @@ -129,6 +137,22 @@ METADATA = { 'default_value': 'Disable' } }, + 'offline_repo_port': { + '_self': { + 'mapping_to': 'offline_repo_port', + 'field': 'anytype', + 'is_required':False, + 'default_value': '5151' + } + }, + 'offline_deployment': { + '_self': { + 'mapping_to': 'offline_deployment', + 'field': 'anytype', + 'is_required':False, + 'default_value': 'Disable' + } + }, 'network_cfg': { '_self': { 'mapping_to': 'network_cfg' diff --git a/deploy/compass_conf/templates/ansible_installer/openstack_ocata/vars/HA-ansible-multinodes.tmpl b/deploy/compass_conf/templates/ansible_installer/openstack_ocata/vars/HA-ansible-multinodes.tmpl index d0d0b7d0..704c23fb 100755 --- a/deploy/compass_conf/templates/ansible_installer/openstack_ocata/vars/HA-ansible-multinodes.tmpl +++ b/deploy/compass_conf/templates/ansible_installer/openstack_ocata/vars/HA-ansible-multinodes.tmpl @@ -37,7 +37,6 @@ #set neutron_cfg = $getVar('neutron_config', {}) #set ovs_config = $neutron_cfg.openvswitch - #set has = $getVar('ha', []) #set ha_vip = $getVar('ha_vip', []) @@ -64,6 +63,11 @@ public_net_info: "{{ network_cfg.public_net_info }}" host_ip_settings: "{{ ip_settings[inventory_hostname] }}" ntp_server: $ntp_server + +offline_deployment: $getVar('offline_deployment', 'Disable') +offline_repo_ip: $getVar('compass_ip', '') +offline_repo_port: $getVar('offline_repo_port', '5151') + internal_vip: ip: $network_cfg["internal_vip"]["ip"] netmask: $network_cfg["internal_vip"]["netmask"] diff --git a/deploy/compass_vm.sh b/deploy/compass_vm.sh index 6d976560..cc0471ae 100755 --- a/deploy/compass_vm.sh +++ b/deploy/compass_vm.sh @@ -137,11 +137,19 @@ function launch_compass() { sed -i "s#^\(compass_db:\).*#\1 $COMPASS_DB#g" $group_vars sed -i "s#^\(compass_mq:\).*#\1 $COMPASS_MQ#g" $group_vars + if [[ $OFFLINE_DEPLOY == "Enable" ]]; then + sed -i "s#.*\(compass_repo:\).*#\1 $COMPASS_REPO#g" $group_vars + else + sed -i "s/^\(compass_repo:.*\)/#\1/g" $group_vars + fi sed -i "s#^\(host_ip:\).*#\1 $INSTALL_IP#g" $group_vars sed -i "s#^\(install_subnet:\).*#\1 ${INSTALL_CIDR%/*}#g" $group_vars sed -i "s#^\(install_prefix:\).*#\1 ${INSTALL_CIDR##*/}#g" $group_vars sed -i "s#^\(install_netmask:\).*#\1 $INSTALL_NETMASK#g" $group_vars sed -i "s#^\(install_ip_range:\).*#\1 $INSTALL_IP_RANGE#g" $group_vars + + sed -i "s#^\(deck_port:\).*#\1 $COMPASS_DECK_PORT#g" $group_vars + sed -i "s#^\(repo_port:\).*#\1 $COMPASS_REPO_PORT#g" $group_vars ansible-playbook $WORK_DIR/installer/compass-docker-compose/bring_up_compass.yml } diff --git a/deploy/conf/compass.conf b/deploy/conf/compass.conf index 4102fb96..c3ea85c0 100644 --- a/deploy/conf/compass.conf +++ b/deploy/conf/compass.conf @@ -1,8 +1,9 @@ export COMPASS_VIRT_CPUS=4 export COMPASS_VIRT_MEM=4096 export COMPASS_SERVER=$INSTALL_IP -export COMPASS_SERVER_URL="http://$INSTALL_IP:5050/api" -export HTTP_SERVER_URL="http://$INSTALL_IP:5050/api" +export COMPASS_DECK_PORT="5050" +export COMPASS_SERVER_URL="http://$INSTALL_IP:$COMPASS_DECK_PORT/api" +export HTTP_SERVER_URL="http://$INSTALL_IP:$COMPASS_DECK_PORT/api" export COMPASS_USER_EMAIL="admin@huawei.com" export COMPASS_USER_PASSWORD="admin" export COMPASS_DNS1=${COMPASS_DNS1:-'8.8.8.8'} @@ -14,9 +15,11 @@ export LANGUAGE="EN" export TIMEZONE="America/Los_Angeles" export NTP_SERVER="$COMPASS_SERVER" export NAMESERVERS="$COMPASS_SERVER" +export COMPASS_REPO_PORT="5151" export COMPASS_DECK="compass4nfv/compass-deck" export COMPASS_TASKS="compass4nfv/compass-tasks-osa" export COMPASS_COBBLER="compass4nfv/compass-cobbler" export COMPASS_DB="compass4nfv/compass-db" export COMPASS_MQ="compass4nfv/compass-mq" +export COMPASS_REPO="compass4nfv/compass-repo-osa-ubuntu" diff --git a/deploy/deploy_host.sh b/deploy/deploy_host.sh index 5fa950c5..7a91bd88 100755 --- a/deploy/deploy_host.sh +++ b/deploy/deploy_host.sh @@ -48,7 +48,8 @@ function deploy_host(){ --cluster_vip="${VIP}" --network_cfg="$NETWORK" --neutron_cfg="$NEUTRON" \ --enable_secgroup="${ENABLE_SECGROUP}" --enable_fwaas="${ENABLE_FWAAS}" --expansion="${EXPANSION}" \ --rsa_file="$rsa_file" --enable_vpnaas="${ENABLE_VPNAAS}" --odl_l3_agent="${odl_l3_agent}" \ - --moon_cfg="${MOON_CFG}" --onos_sfc="${onos_sfc}" --plugins="$plugins" + --moon_cfg="${MOON_CFG}" --onos_sfc="${onos_sfc}" --plugins="$plugins" \ + --offline_repo_port="${COMPASS_REPO_PORT}" --offline_deployment="${OFFLINE_DEPLOY}" RET=$? sleep $((AYNC_TIMEOUT+5)) |