오픈스택 연구하기 : Devstack으로 오픈스택 빠르게 설치하기

반응형

오픈스택 연구하기 : Devstack으로 오픈스택 빠르게 설치하기 

안녕하세요 김민욱입니다. 

 

이번 포스팅에서는 Devstack을 이용해서 오픈스택을 빠르게 구축해보겠습니다. Devstack은 오픈스택을 설치하기 위한 자동화 툴입니다. 오픈스택을 구축하는 방법으로는 매뉴얼대로 설치하는 방법과 자동화 툴을 이용하는 방법이 있습니다. 

 

사실 매뉴얼에 대한 설치 방법은 많이 지원하지 않는 프로젝트들도 많이 있고, 무엇보다도 시간이 오래 걸립니다. 직접 프로젝트 데이터베이스 테이블을 생성한다던지, 사용자를 생성한다던지의 여러 과정이 각 프로젝트마다 있기 때문입니다.  

 

따라서 이제는 자동화 툴을 사용하시는 것을 추천드립니다. 제가 다양한 자동화 툴을 사용해본 것은 아니지만, 분명 자동화는 인프라 기술에서 중요한 기능 중 하나입니다. 따라서 저에게 가장 익숙하면서도 많이 사용해본 Devstack을 통해 자동적으로 간편하게 오픈스택을 구축하도록 하겠습니다.( 사실 다른 자동화 툴들은 사용해본 바가 없습니다. ) 

 

추가적으로 제 블로그에 나와있는 오픈스택 프로젝트들은 해당 포스팅을 통해 모두 설치하실 수 있습니다.

만약 제 블로그에서 해보고 싶으셨던 프로젝트가 있으시다면 해당 포스팅을 참고하시면 될 것 같습니다.  

 

Ubuntu 16.04에서 Master 버전(Trein 이후)을 기준으로 설치하였습니다.(2019.10.21)

Ubuntu 18.04 서버 버전에서 Master 버전을 기준으로 업데이트하였습니다.(2020.05.11)

* Ubuntu 18.04의 경우 데스크탑 버전이 아닌 서버 버전에서 설치를 추천드립니다. 

 

 

네트워크설정 및 구성

많은 분들께서 아실 테지만, 그래도 처음부터 해보기 위해 Ubuntu 16.04를 설치한 직후부터 설명을 드리겠습니다. 네트워크 구성에 대해 잘 아시는 분들께서는 뒤로 가셔서 Devstack 설치 템플릿만 참고하셔도 될 것 같습니다. 

 

먼저 Ubuntu를 설치하시고, root 계정에서 작업하시기를 추천드립니다. 해당 사항은 어디까지나 개인적인 생각이므로 꼭 root로 안하셔도 될 듯합니다.  일반적으로 VMware에 오픈스택을 실습용으로 구축하실 텐데 이 부분은 자료도 많을 뿐만 아니라 다른 블로그에서도 포스팅을 많이 되어 있는 것으로 확인됩니다. 따라서 이번 포스팅에서는 오픈스택을 NUC이라는 미니 Intel PC에 구축합니다. 성능뿐만 아니라 개발에 필요한 정도의 성능을 가지고 있기 때문입니다.

 

먼저 root로 로그인을 하시고 네트워크 설정부터 진행을 하도록 합니다 . 네트워크는 총 2개의 인터페이스가 필요한데, 그림 1의 물리 네트워크 구성도와 같이 일반적으로 내장되어있는 네트워크 인터페이스와 USB 네트워크 인터페이스를 사용합니다.

 

그림 1. 네트워크 구성도

이렇게 두개의 네트워크 인터페이스가 하나의 유무선 공유기(AP)에 물려 있습니다. USB에 꽂혀 있는 USB LAN을 통해서는 mini pc 관리를 위해 실제 IP 주소가 할당됩니다. 이는 유무선 공유기에서 DHCP를 통해 랜덤 하게 private 아이피를 지정해주거나, static으로 원하는 아이피를 해당 네트워크 인터페이스에 할당할 수도 있습니다.  한마디로 USB LAN을 통해서 오픈스택 패키지를 설치하거나, 관리하기 위해 SSH 접근을 진행합니다. 

 

그럼 나머지 NIC 카드로는 무엇을 할까요? 해당 NIC 카드는 가상머신들이 외부와 통신하기 위해 사용합니다. 물론 NIC 카드 하나로 내부 네트워크 구성을 통해 가상 머신들이 외부와 통신하도록 할 수도 있지만, 저의 경우는 네트워크 구성을 최대한 간편하게 하는 것을 선호하기 때문에 그림 2 실제 인터페이스와 같이 네트워크 인터페이스를 두 개로 나눕니다. 

 

그림 2. 실 네트워크 인터페이스 

그림 2와 같이 네트워크를 구성하고 Ubuntu에서 네트워크 구성을 진행하도록 하겠습니다.  각 인터페이스를 설정하기 위해 아래와 같은 명령어를 Ubuntu상에서 작성합니다. 

root@openstack-controller:~# vi /etc/network/interfaces

vi 편집기를 통해 네트워크 설정 파일인 /etc/network/interfaces를 수정해줍니다. 위에서 보시는 바와 같이 현재 네트워크 카드는 USB 네트워크 카드와, 내장 네트워크 카드 총 2개이기 때문에 2개의 인터페이스에 대한 네트워크 설정 정보를 입력해 주어야 합니다. 

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

#내부 네트워크 인터페이스
auto eno1
iface eno1 inet manual

#USB 네트워크 인터페이스
auto enx88366cf9ff53
iface enx88366cf9ff53 inet static
address 192.168.0.101/24
gateway 192.168.0.1
dns-nameservers 8.8.8.8

먼저 네트워크 카드는 eno1과 enx88366cf9ff53 두 개로 나뉩니다. eno1은 manual 네트워크로 구성해주는데 해당 네트워크 인터페이스는 별도의 아이피 주소를 할당하지 않고 가상 머신들이 보내는 데이터를 그대로 외부로 전달해주기 만하는 일종의 빈 통로 정도로 생각하시면 될 것 같습니다. 

 

구체적인 네트워크 설정 구문 하나하나 설명하기에는 굉장히 글이 길어질 것 같아서 "우분투 네트워크 설정" 이라는 키워드로 검색하시고 의미를 해석하시길 추천드립니다. 다음은 USB 네트워크 카드 설정으로 enx~로 시작하는 것이 USB 네트워크 인터페이스의 이름입니다. 해당 네트워크 인터페이스에는 IP 주소를 수동으로 할당하고, 추후 관리자나 사용자가 오픈스택을 설치하고 사용하기 위한 IP 주소로 사용됩니다. 이렇게 되면 기본적인 네트워크 설정은 끝이 나게 됩니다. 

 

재부팅 후 ifconfig 명령어를 입력하여 IP주소가 할당 되어있는지 꼭꼭 확인하시길 바랍니다. 

 

Devstack 실행

이제 본격적으로 Devstack을 설치해보도록하겠습니다. Devstack은 local.conf라고 불리는 파일에 설치하고자 하는 프로젝트들의 Git 주소, 설정값 및 데이터베이스, 관리자 비밀번호 등을 작성하고 stack.sh라는 파일을 실행하여 자동적으로 Git으로부터 프로젝트를 다운로드하고 설치하게 됩니다. 

 

root@openstack-controller:~# sed -i 's/kr.archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
root@openstack-controller:~# sed -i 's/security.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list

먼저 위의 명령어를 입력하여 패키지 다운로드 서버를 일괄적으로 Daumkakao로 변경합니다. 이는 기본적인 우분투의 패키지 저장소에서 받는 것은 속도가 느릴 수 있기 때문에 변경해주도록 합니다.  간단하게 명령을 말씀드리자면, sed 명령은 문자열을 치환하게 되는데 "s/찾을문자열/변경할문자열/' 파일명"의 순으로 기본 ubuntu 저장소의 주소를 카카오의 저장소를 바꾸는데 이는 패키지 저장소 정보를 가지고 있는 /etc/apt/sources.list에서 명령을 수행하게 됩니다. 따라서 위의 명령을 수행하여 기존에 비해 빠른 패키지 다운로드를 실시할 수 있도록 합니다. 

 

이제 하단의 명령과 같이  apt-get udpate 명령어를 통해 /etc/apt/sources.list의 정보로부터 패키지 리스트를 업데이트하게 됩니다.

root@openstack-controller:~# apt-get update && apt-get dist-upgrade -y

또한 apt-get dist-upgrade 명령어를 통해 패키지를 모두 새버전으로 업데이트합니다.  해당 명령은 아래와 같이 한 번에 수행이 가능합니다. 참고로 기본적인 upgrade와 달리 dist-upgrade는 의존성 검사를 수행합니다.

 

Devstack을 통해 이루어지는 모든 작업은 아래 명령과 같이 기본적으로 stack이라는 유저를 생성하고, 해당 유저에게 권한을 부여함으로써 자동적으로 여러 프로젝트들을 설치할 수 있도록 합니다.

root@openstack-controller:~# useradd -s /bin/bash -d /opt/stack -m stack
root@openstack-controller:~# echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
root@openstack-controller:~# sudo su - stack

첫 번째의 useradd 명령어는 유저를 생성하는 명령어로 각 옵션은 -s 쉘을 지정하고, -d 홈 디렉터리 경로 지정, -m 옵션으로 디렉터리를 생성하게 됩니다. 다음 명령은 우분투 계정에 sudo 권한을 주는 명령으로써, 해당 사용자명(stack) 및 모든 명령어에 대해 패스워드가 필요없이 사용 가능하도록 하겠다는 뜻(ALL=(ALL) NOPASSWD: ALL)입니다.  그 다음 stack으로 로그인하게 됩니다. 

 

이제 git 명령어를 이용해 Devstack을 다운로드하고 local.conf를 작성한 뒤 실질적으로 devstack을 설치해보도록 하겠습니다. 먼저 아래 명령과 같이 git clone을 이용하여 devstack을 다운로드합니다. 이때는 stack 유저입니다. 

stack@openstack-controller:~$ git clone https://git.openstack.org/openstack-dev/devstack
stack@openstack-controller:~$ cd devstack

devstack을 받게 되면 devstack 폴더로 이동해줍니다. 그다음 vi local.conf 명령어를 수행하여 아래와 같이 local.conf를 작성합니다.  그 전에 해당 local.conf에 포함되어있는 프로젝트는 다음과 같습니다. 

 

  • Glance (Image Service)
  • Heat (Orchestration Service)
  • Horizon (Dashboard Service)
  • Placement (Placement Service)
  • Keystone (Identity Service)
  • Mistral (Workflow Service)
  • Mistral-dashboard
  • Networking-sfc (SFC option)
  • Neutron (Networking)
  • Nova (Compute Service)
  • Octavia (Load Balancer)
  • Octavia-dashboard
  • Tacker (NFV Service)
  • Tacker-horizon
  • Vitrage (RCA Service)
  • Vitrage-dashboard
  • Rally (Testing ServicE)

만약 상단의 프로젝트 리스트중 몇 개의 프로젝트들에 대해서는 포스팅되어 있는 자료가 있기 때문에 혹 궁금하시다면 참고하셔도 좋을 듯합니다. [1][2][3][4]

 

다시 vi local.conf로 돌아와서 local.conf 파일을 생성하고 아래의 내용을 입력하시면 됩니다.  내용이 상당히 길기 때문에 복사 하신 뒤 필요에 따라 변경하시는 것을 추천드립니다.

[[local|localrc]]
# USB LAN CARD IP ADDRESS
HOST_IP=192.168.0.101
# MANUAL INTERFACE NAME
FLAT_INTERFACE=eno1

FLOATING_RANGE=192.168.11.224/27
FIXED_RANGE=10.10.10.0/20
FIXED_NETWORK_SIZE=256

#PASSWORD CONFIGURATION
ADMIN_PASSWORD=root
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD

#COMPUTE NODE
MULTI_HOST=True

#LOG CONFIGURATION
LOGFILE=/opt/stack/devstack.log
LOGDAYS=2
LOG_COLOR=True

# Nova
ENABLED_SERVICES+=,n-api,n-crt,n-cpu,n-cond,n-sch,n-api-meta,n-sproxy
ENABLED_SERVICES+=,placement-api,placement-client

# Glance
ENABLED_SERVICES+=,g-api,g-reg

# Neutron
ENABLED_SERVICES+=,q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron
ENABLED_SERVICES+=,octavia,o-cw,o-hk,o-hm,o-api

# Tempest
ENABLED_SERVICES+=,tempest
ENABLED_SERVICES+=,barbican

#Octavia
enable_plugin octavia https://opendev.org/openstack/octavia 
enable_plugin octavia-dashboard https://opendev.org/openstack/octavia-dashboard.git 

#heat
enable_service h-eng h-api h-api-cfn h-api-cw
enable_plugin heat https://git.openstack.org/openstack/heat 

#Mistral
enable_plugin mistral https://github.com/openstack/mistral.git 

#Tacker
enable_plugin tacker https://github.com/openstack/tacker.git 
enable_plugin networking-sfc https://git.openstack.org/openstack/networking-sfc 

#Rally
enable_plugin rally https://git.openstack.org/openstack/rally-openstack

#Vitrage
enable_plugin vitrage https://git.openstack.org/openstack/vitrage 
enable_plugin vitrage-dashboard https://git.openstack.org/openstack/vitrage-dashboard 

#barbican
enable_plugin barbican https://opendev.org/openstack/barbican 

[[post-config|$NOVA_CONF]]
[DEFAULT]
notification_topics = notifications,vitrage_notifications
notification_driver=messagingv2

[[post-config|$NEUTRON_CONF]]
[DEFAULT]
notification_topics = notifications,vitrage_notifications
notification_driver=messagingv2

[[post-config|$CINDER_CONF]]
[DEFAULT]
notification_topics = notifications,vitrage_notifications
notification_driver=messagingv2

[[post-config|$HEAT_CONF]]
[DEFAULT]
notification_topics = notifications,vitrage_notifications
notification_driver=messagingv2

disable_service swift

 

먼저 HOST_IP는 앞서 작성했던 USB 랜카드 드라이버에 할당한 IP주소를 적어주시면 됩니다. 저의 경우 192.168.0.101가 됩니다.  다음 FLAT_INTERFACE는 내부 랜카드 드라이버 즉 manual 인터페이스로 설정하신 인터페이스의 이름을 작성하시면 됩니다. 그 외 FLOATING_RANGE, FIXED_RANGE, FIXED_NETWORK_SIZE는 그대로 두시거나 지우셔도 무방합니다. 

 

ADMIN_PASSWORD는 원하시는 패스워드를 설정하시면 되는데, 해당 패스워드는 WEB UI에 로그인 시 사용 됩니다. 나머지 DATABASE_PASSWORD, RABBIT_PASSWORD, SERVICE_PASSWORD는  원하시는 패스워드로 사용하시거나 그대로 두시면 모두 동일한 비밀번호로 설정 됩니다. 실무가 아니라면 그냥 두시는 걸 추천드립니다.

MULTI_HOST는 멀티 노드 즉 컴퓨트 노드의 사용 여부를 뜻합니다. 따라서 컨트롤 노드, 컴퓨트 노드 여러 개의 물리적인 노드로 구성하실 경우 True로 작성해주시면 됩니다. 사실 꼭 컴퓨트 노드가 없더라도 컨트롤 노드 또한 기본적으로 컴퓨트의 기능을 가지고 있지만, 추후 컴퓨트 노드를 추가 가능하기 때문에 True로 하시길 추천 드립니다. 나머지 LOGFILE, LOGDAYS, LOG_COLOR은 이름에서도 알 수 있는 것처럼 LOG 관련 설정을 의미합니다.

 

나머지 구문 즉 enable_plugin [git 주소]는 어떤 프로젝트를 포함시킬지를 나타냅니다. 혹시 원하는 프로젝트가 있으시다면, "openstack [프로젝트명] devstack install"이라는 키워드로 검색하시면, local.conf에 어떤 내용을 작성해야 할지 확인하실 수 있습니다. 

 

특정 버전을 받고 싶으시다면, "enable_plugin [프로젝트명] [프로젝트 git주소] stable/[version]"

단. 모든 프로젝트 버전은 통일하시는 것을 추천드립니다. Devstack의 버전 포함

 

 

local.conf를 작성하셨다면 local.conf를 저장하신 뒤 devstack 폴더 내에서 ./stack.sh를 치시면 됩니다.

 

그림 3. devstack 실행결과  

그림 3과 같이 나온다면 성공적으로 devstack을 설치한 것입니다. 이제 reboot 명령어를 통해 reboot을 수행해주시면 됩니다. 성공적으로 devstack을 마쳤다면,  인터넷 창에서 http://[컨트롤 노드 아이피 주소]/dashboard를 치시면 그림 4와 같이 오픈스택의 웹 UI를 확인하실 수 있습니다.

 

그림 4. 오픈스택 웹 UI

 

설치 후 설정

성공적으로 devstack을 설치하셨다면, 이제 나머지 설정을 진행해야 합니다. 먼저 앞서 manual 인터페이스는 가상 머신이 통신하기 위한 일종의 통로라고 설명드렸습니다. 해당 인터페이스를 오픈스택 내부 가상 네트워크인 OVS(Open vSwitch)와 쉽게 말해 연결시켜주어야 합니다. 그다음은 보안을 위한 포트 등을 설정하고, 끝으로 기타 제가 생각하는 필요한 옵션 2가지를 간단히 말씀드리겠습니다. 

 

먼저 stack 유저에서 ovs 명령을 이용하여 다음과 같은 명령을 작성하도록 합니다. 사실 해당 명령어는 브릿지라고 불리는 내부 네트워크에 실제 물리 인터페이스를 포트 연결해주는 명령어입니다.

stack@openstack-controller:~$ sudo ovs-vsctl add-port br-ex eno1

외부와의 연결을 위한 br-ex 브릿지에 manual 인터페이스인 eno1을 포트로 추가해 주어 가상머신이 해당 인터페이스를 통해 외부와의 통신을 가능하도록 합니다. 자세하게 설명하기에는 OVS 자체도 내용이 방대하기 때문에 따로 찾아보시는 것을 추천드리겠습니다.  그다음 sudo ovs-vsctl show 명령어를 통해 그림5와 같이 br-ex 브릿지에 eno1 포트가 추가된 것을 확인할 수 있습니다.

 

그림 5. OVS 브릿지 연결 확인

그다음 그림 6과 같이 보안 그룹을 편집하기 위해, 오픈스택 웹 UI로 접속합니다. 보안 그룹에서는 들어오고 나가는 데이터에 대해 포트를 이용해 데이터를 송수신합니다. 기본적으로는 보안 그룹에서 포트가 차단되어 있으므로 이를 열어주도록 합니다. 

 

그림 6. 보안 그룹 접속

프로젝트에서 네트워크의 보안 그룹을 클릭하면 그림과 같이 보안 그룹 페이지가 뜨게 됩니다. 해당 페이지에서 우측의 규칙 관리 버튼을 눌러 줍니다. 버튼을 눌러주게 되면 Ether 타입이 IPv4와 IPv6가 각각 2개씩 총 4개가 존재합니다. 그중 IPv4의 규칙을 모두 삭제해주고 규칙 추가를 눌러 줍니다. 

 

그림 7. 규칙 추가 

그림 7에서는 규칙추가 버튼을 클릭하게 되면 나타나는 패널입니다. 먼저 규칙에서는 다른 프로토콜을 선택해주시고, Direction은 들어옴 IP 프로토콜은 0을 작성하신 뒤 추가를 눌러줍니다. 마찬가지로 Direction만 내보냄으로 하신 뒤 나머지는 동일하게 하여 한번 더 추가를 해줍니다.  이렇게 가상 머신이 내외부로 통신하기 위한 모든 설정을 마쳤습니다.

 

 

[오픈스택 옵션 TIP]

1. 오픈스택 웹 콘솔 접속 주소 변경  방법  : vi /etc/nova/nova-cpu.conf 의 VNC 세션에서 아래와 같이 변경

[vnc]
server_proxyclient_address = 192.168.0.101
server_listen = 0.0.0.0
xvpvncproxy_base_url = http://192.168.0.101:6081/console
novncproxy_base_url = http://[원하는 IP 주소로 변경]:6080/vnc_lite.html

 

2. 가상 머신 생성 시, 초기화 과정에서 특정 명령 수행을 위한 옵션 ENABLE 시키기(Metadata)

stack@openstack-controller:~/devstack$ vi /etc/neutron/dhcp_agent.ini

[default]
enable_isolated_metadata = true

3. 오픈스택 네트워킹 관련하여 좋은 블로그를 소개드립니다. (톨티의 공작소)

 https://blog.naver.com/love_tolty/220237750951

 

오픈스택-OpenStack Network 완전정복(Neutron과 Nova-Network)-

​​1. 시작하기전에... ㅣ Nova-Network와 Neutron에 대한 포스팅 배경 ​ [그림 1] OpenStack 포스...

blog.naver.com

4. CLI 명령어 입력시, 클라이언트 환경 스크립트 로딩 

stack@openstack-controller:~/devstack$ source openrc admin admin

 

5. Devstack Openstack Uninstall

root@openstack-controller:~$ sudo su - stack
stack@openstack-controller:~$ . /opt/stack/devstack/unstack.sh
stack@openstack-controller:~$ . /opt/stack/devstack/clean.sh
root@openstack-controller:~$ sudo su
root@openstack-controller:~$ cd /root
root@openstack-controller:~$ rm -rf /usr/local/lib/*
root@openstack-controller:~$ rm -rf /usr/local/bin/*
root@openstack-controller:~$ sudo userdel -rf stack

6. 디버깅(에러해결)

 

1. File "/home/stack/devstack/tools/outfilter.py", line 104, in <module> sys.exit(main)) File "/home/stack/devstack/tools/outfilter.py", line 98, in main outfile.write(ts_line.encode('utf-8')) UnicodeError: 'utf-8' codec can't encode characters in position 110-112: surrogates not allowed

=> /devstack/tools/outfilter.py 파일 열기

=> outfile.write(ts_line.encode('utf-8'))

=> outfile.write(ts_line.encode('utf-8','surrogatepass')) 파라미터 추가

 

2.  mysql command not found

=> apt-get install mysql-server

=> ./unstack.sh

=> ./stack.sh

 

7. Openstack 로그 확인하기

stack@openstack-controller:~$ sudo journalctl -f -xe -u devstack@<Service명>

결론

 

이번 포스팅에서는 오픈스택을 Devstack으로 편리하고 빠르게 설치하는 과정을 서술하였습니다. 아마 처음 접하신 분들은 꽤나 복잡하게 느껴지실 수도 있지만, 계속 접하다 보면 굉장히 익숙한 느낌을 받으실 것 같습니다. 제가 하는 방법이 devstack을 이용한 방법의 전부는 아니지만, 그래도 비교적 성공적으로 설치한 방법 중에 하나라고 말씀드릴 수 있을 것 같습니다.

 

아무쪼록 도움되시길 바랍니다. 감사합니다. 

인용글

[1] 오픈스택 연구하기 : 코어프로젝트 : https://delightwook.tistory.com/16?category=766948

[2] 오픈스택 연구하기 : Test Project Rally : https://delightwook.tistory.com/19?category=766948

[3] 오픈스택 연구하기 : RCA Project Virtrage : https://delightwook.tistory.com/18?category=766948

[4] 오픈스택 연구하기 : NFV Project Tacker : https://delightwook.tistory.com/17?category=766948

 

업데이트로그

2020.05.11 : Ubuntu 18.04 서버 버전에서 Master 버전 테스트 후 스크립트 수정 완료

해당 글은 스스로 연구한 내용을 통한 주관적인 이해를 바탕으로 작성 되었습니다. 수정 할 부분이 있거나, 다른 의견이 있으시다면 언제든지 말씀해주시면 반영하도록 하겠습니다. 읽어 주셔서 감사합니다. 끝으로 불법으로 복제하는 것은 금합니다.

 

반응형

댓글(1)

  • 권종현
    2020.08.24 17:00

    ./stack.sh 실행 후 아래와 같은 메세지가 뜨면서 설치가 중지 되는데요. 어떻게 해결해야 될지요?

    Ignoring importlib-metadata: markers 'python_version == "3.6"' don't match your environment
    Ignoring dataclasses: markers 'python_version == "3.6"' don't match your environment
    Ignoring importlib-resources: markers 'python_version == "3.6"' don't match your environment
    ERROR: Could not find a version that satisfies the requirement os-testr===2.0.0 (from -c /opt/stack/requirements/upper-constraints.txt (line 420)) (from versions: 0.1.0, 0.2.0, 0.3.0, 0.4.0, 0.4.1, 0.4.2, 0.5.0, 0.6.0, 0.7.0, 0.8.0, 0.8.1, 0.8.2, 1.0.0, 1.1.0)
    ERROR: No matching distribution found for os-testr===2.0.0 (from -c /opt/stack/requirements/upper-constraints.txt (line 420))
    +inc/python:pip_install:1 exit_trap
    +./stack.sh:exit_trap:489 local r=1
    ++./stack.sh:exit_trap:490 jobs -p
    +./stack.sh:exit_trap:490 jobs=
    +./stack.sh:exit_trap:493 [[ -n '' ]]
    +./stack.sh:exit_trap:499 '[' -f '' ']'
    +./stack.sh:exit_trap:504 kill_spinner
    +./stack.sh:kill_spinner:399 '[' '!' -z '' ']'
    +./stack.sh:exit_trap:506 [[ 1 -ne 0 ]]
    +./stack.sh:exit_trap:507 echo 'Error on exit'
    Error on exit
    +./stack.sh:exit_trap:509 type -p generate-subunit
    +./stack.sh:exit_trap:512 [[ -z /opt/stack/logs ]]
    +./stack.sh:exit_trap:515 /usr/bin/python3.5 /home/stack/devstack/tools/worlddump.py -d /opt/stack/logs
    World dumping... see /opt/stack/logs/worlddump-2020-08-24-075956.txt for details
    +./stack.sh:exit_trap:524 exit 1

Designed by JB FACTORY