[OSS] #OpenStack Meet-up 1

2020. 8. 9. 02:21Cloud

728x90
  • 시행 : 2020-08-04(화) 19:00~21:00

 

[목표]

Devstack을 설치하고, CLI 코드를 분석하며 분석능력을 다짐

 

[진행]

  • OpenStack 개요 / Component 기능 설명
  • Devstack 설치 (Stable/ussuri  || Master 2개 )
  • Devstack 설치 後 생성되는 Network / Instance 설명

 

  • OpenStackClient 코드 분석

1. DevStack 설치

  • 설치환경 : Cafe 24 Hosting을 사용한 가상 서버
  • OS : Ubuntu 18.04 LTS-200317
  • HW사양 (CPU/RAM/SSD) : m1.xlarge (4 / 8 GB / 30 GB)

 

#01. 가상서버 생성

[공개키를 잘 보관한다. 추후 SSH로 접속 시 사용되어야 한다]

 

#02. 방화벽 생성 & 가상서버와 연결

  • 가상서버에 SSH로 접속하기 위해서는 방화벽이 필요하다
  • 기본 정책은 차단되어 있으므로 Inbound 에 SSH Port를 추가해준다.

 

#03. Putty를 사용하여 가상서버에 접속한다

  • 접속에 앞서 #01 에서 발급받은 공개키[pem]개인키[ppk] 로 바꿔준다
  • 그러한 까닭은, EC2 같은 인스턴스 들이 일반적으로 PPK를 사용하기 때문이다.
  • 변환은 PuTTY Key Generator를 사용한다.

  • PuTTY를 사용하여 생성된 가상서버의 공인IP 에 접속한다. 접속시 SSHppk 키를 입력해준다.

[ login 시 ubuntu 를 입력한다 ]

#04. 가상서버에 DevStack을 설치

 

공식문서의 설치가이드는 다음과 같다.

 

OpenStack Docs: DevStack

DevStack DevStack is a series of extensible scripts used to quickly bring up a complete OpenStack environment based on the latest versions of everything from git master. It is used interactively as a development environment and as the basis for much of the

docs.openstack.org

서술할 본문은 공식문서의 내용과 같다.

$ sudo useradd -s /bin/bash -d /opt/stack -m stack
$ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
$ sudo su - stack

# Download Devstack
$ git clone https://opendev.org/openstack/devstack
$ cd devstack

# Master || Stable/ussuri
$ git checkout stable/ussuri
$ git status

Create local.conf

vim local.conf #생성

[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
HOST_IP=[호스팅한 가상서버의 Local IP 입력]

Start Install

./stack.sh

#약 20분동안 설치가 진행된다.

 

[ 성공적으로 설치된 모습 ]

설치가 완료되면 localhost의 80 port를 이용하여 OpenStack의 DashBoard에 접근할 수 있는데,

우리는 외부에서 접속하므로 cafe24 vm의 공인IP를 통해 접속합니다.

 

이를 위해 다시 cafe24의 방화벽에 Inbound 정책으로 80/6080번 포트를 추가해줍니다.

공인아이피로 대쉬보드에 접속해줍니다.


2. 대쉬보드 접속 & 네트워크 토폴로지 & 인스턴스 생성

devstack이 설치되면서 총 3개 프로젝트를 기본적으로 만듭니다.

  • admin
  • alt_demo (보조데모)
  • demo

 

좌측 프로젝트 바의 네트워크>네트워크 토폴로지를 클릭합니다.

 

#01. 네트워크 토폴로지

devstack은 demo 프로젝트에 총 3개의 네트워크를 미리 만들어줍니다.

  • public
    • 인터넷과 연결할 수 있는 네트워크 입니다. 지구본 모양이 있으면 인터넷과 연결이 가능합니다.
    • 인스턴스가 직접 연결하는 네트워크 대역이 아닌, floating ip 나 router에 할당하는 아이피입니다.
  • private
    • demo project만의 가상 네트워크입니다.
    • 기본적으로 라우터에 연결되어있어서, 인터넷 통신이 가능한 환경입니다.
  • shared
    • private와 마찬가지로 demo project만의 가상 네트워크입니다.
    • 차이점은 public 네트워크와 연결되어있지 않습니다. 폐쇄망입니다.

 

#02. 인스턴스 생성

프로젝트 바의 인스턴스를 클릭합니다.

  • 소스 : OS를 선택합니다. 오픈스택은 Cirros라는 기본 OS가 있습니다. 다른 OS를 설치하고 싶으면 이미지 배포판을 준비하면 됩니다. 이것은 Glance에 올라갑니다.
  • Flavor : HW사양 (CPU/RAM/SSD)를 선택합니다
  • 네트워크 : 네트워크 토폴로지의 어느 망과 연결할지 선택합니다.
  • Key : SSH 공개키를 생성합니다

인스턴스 생성버튼을 누릅니다.

인스턴스 생성과정이 cafe24의 가상서버(vm) 생성과정과 동일합니다.

 

  • 생성한 개인키를 복사하여 Devstack 서버에 저장해줍니다.

  • pem키를 이용해서 접속하기 위해서는 권한 설정이 필요합니다.
chmod 600 keykey.pem

 

  • 콘솔 로그를 통해 생성된 인스턴스가 CLI(시리얼)에서 어떻게 동작하고 있는지 볼 수 있습니다.

  • cafe24의 대쉬보드에서 VM에 22port로 Console로 접속했던 것 처럼 DevStack VM안의 VM Instance에 Console로 접속해봅니다

  • 기본적으로 열리는 주소가 사설주소이기 때문에 아이피를 vm의 공인 IP(DevStack의 IP)로 변경합니다.

 

http://192.168.1.18:6080/vnc_lite.html?path=%3Ftoken%3D401a7596-fd37-4cce-8315-2c355275fadf&title=test(baad8346-1541-4f12-a7f3-a41681398679)
http://(vm 의 공인 IP):6080/vnc_lite.html?path=%3Ftoken%3D401a7596-fd37-4cce-8315-2c355275fadf&title=test(baad8346-1541-4f12-a7f3-a41681398679)

 

이번에는 

  • 공인 IP 변경을 위해 아래와 같이 Floating IP를 할당해줍니다.
  • 생성한 가상 환경을 담당하는 OpenStack의 VM이 Floating IP를 Matching 시켜줍니다.
더보기

172.32.0.0/24 C클래스 사설 , DHCP 풀은 10~250 할당

 

DNS /etc/resolv.cof   # 패킷을 포워딩 해주라는 옵션을 넣어줌

 

(카페24) VM에서 ping은 안돼요. 근데 curl naver.com은 돼요.

 

OpenVSwitch : 가상네트워크 생성$ ovs-vsctl show # 오픈v스위치가 만든 가상 네트워크에 대한 정보를 출력# ovs-sctl: unix:/var/run/openvswitch/db.sock: database connection failed(Permission denied)

 

$ ip netns # Router, DHCP 들을 만들어서 가상네트워크를 만들어줌

 

  • IP대역에 공인IP와 사설IP가 보이면 성공입니다.

마찬가지로, 접속하기전 방화벽(F/W)에서 SSH port(22)를 열어주어야 합니다.

방화벽 Rule 설정

 

추가한 다음 devstack VM Console(카페24 호스팅 된 가상서버-Ubuntu)에서 devstack VM 위에 설치한 OpenStack VM(Cirros OS)에 접속을 시도합니다.

ubuntu@devstack-ussuri:~$ ssh cirros@172.24.4.3

The authenticity of host '172.24.4.3 (172.24.4.3)' can't be established.
ECDSA key fingerprint is SHA256:U7azykVg/zGNVKHPloX1mXoLUUUjuoz81q5RgLtDkaw.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.24.4.3' (ECDSA) to the list of known hosts.

cirros@172.24.4.3's password:
$
$
$ ls
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
    link/ether fa:16:3e:c7:61:d8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.22/26 brd 10.0.0.63 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd82:98dc:7575:0:f816:3eff:fec7:61d8/64 scope global dynamic
       valid_lft 86371sec preferred_lft 14371sec
    inet6 fe80::f816:3eff:fec7:61d8/64 scope link
       valid_lft forever preferred_lft forever

접속 성공한 화면

  • 이러한 유동 IP 상태에서, 방화벽에서 ICMP를 풀어주면 카페24의 VM(Ubuntu)에서 devstack vm에 ping을 보낼 수 있습니다.

 

접속 시 필요한 정보는 아래에서 볼 수 있습니다.

# [대쉬보드에서 생성된 인스턴스의 Log]

=== system information ===
Platform: OpenStack Foundation OpenStack Nova
Container: none
Arch: x86_64
CPU(s): 1 @ 2495.335 MHz
Cores/Sockets/Threads: 1/1/1
Virt-type: AMD-V
RAM Size: 100MB
Disks:
NAME  MAJ:MIN       SIZE LABEL         MOUNTPOINT
vda   252:0   1073741824               
vda1  252:1   1064287744 cirros-rootfs /
vda15 252:15     8388608               
=== sshd host keys ===
-----BEGIN SSH HOST KEY KEYS-----
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFanbYg3N6uGsIlOAEd1cFyfUnSoXsOFBvu9jYbwT2M81pWzjVS0XQrEiE63ZSXnNfpb/HwlH/CY2ykFPWsfrZlG+xYNCKRuwTEN9WoI26N3FvWjgz82k9iFO6THk2jQ/7WEKBsdlqfmEcHzzWxzY6gNC4EMOvn+bcE6+ftusHvhm4Wb+S5b8MVF1+6kKiE4Y1sqjjpq34fOLqkR4IrXvvy0CwZpRjxTjGX8n9SsvG1Ethx5R/PODVVvCt4gSfGvOoWicIbOVc6jkZtrsfMiFaAEkongU3tWTzOIKK9S4BokDAAJ3W1SrfqMJE1klkBF3e6XbsKhpIEAnRqu28Rh63 root@1st-ins
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLyKOunJ+/46NjHJ1a833uqMrHwnBiUwz5PGxVt9gzjiXy/zCtu0gMeJqMOJqDKOjTC7FuvGQs+mP/lY9P/P9w4= root@1st-ins
-----END SSH HOST KEY KEYS-----
=== network info ===
if-info: lo,up,127.0.0.1,8,,
if-info: eth0,up,10.0.0.53,26,fe80::f816:3eff:fe79:1bec/64,fd30:b09a:8b83:0:f816:3eff:fe79:1bec/64
ip-route:default via 10.0.0.1 dev eth0 
ip-route:10.0.0.0/26 dev eth0 scope link  src 10.0.0.53 
ip-route:169.254.169.254 via 10.0.0.1 dev eth0 
ip-route6:fd30:b09a:8b83::/64 dev eth0  metric 256  expires 0sec
ip-route6:fe80::/64 dev eth0  metric 256 
ip-route6:default via fe80::f816:3eff:fed9:1c1c dev eth0  metric 1024  expires 0sec
ip-route6:ff00::/8 dev eth0  metric 256 
=== datasource: ec2 net ===
instance-id: i-00000001
name: N/A
availability-zone: nova
local-hostname: 1st-ins.novalocal
launch-index: 0
=== cirros: current=0.5.1 uptime=18.38 ===
  ____               ____  ____
 / __/ __ ____ ____ / __ \/ __/
/ /__ / // __// __// /_/ /\ \ 
\___//_//_/  /_/   \____/___/ 
   http://cirros-cloud.net


login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
1st-ins login: 

 


3. OpenStack 개요 Component 기능 설명

[SOSCON 2019] NHN은 어떻게 OpenStack으로 Public Cloud를 운영할까? - 조성수

우리가 할 것은 IaaS (Infra as a Service). IaaS에는 5가지 필수요소가 있음.

어떤 것을 이용하냐에 따라서 VM, Vbox, 클라우드 서비스가 될 수 있다.

 

오픈스택도 이런것을 다 지원하는 개념[오픈스택 아키텍쳐]들이 있으며, 필수요소 외에도 여러 Component 들이 많지만

오늘은 OpenStack의 5가지 필수요소를 알아본다.

  • 인스턴스(Nova) : 하나하나가 각각의 서비스로 보시면 돼요
  • 스토리지(Cinder) : 하드디스크
  • OS이미지(Glance) 
  • 네트워크(Neutron) : 인스턴스 間의 가상 네트워크
  • 유저/인증(Keystone)

어떤식으로 유기적으로 돌아가는가?

핵심 컴포넌트는 크게 2가지

1. API성 서비스 : 각각의 컴포넌트는 다 api를 가짐. 그래서 웹서비스를 해줌

2. 에이전트 : 얘네는 작업을 하는 일꾼들임.

  • HTTP 요청이 들어오면 Nova API가 메세지 큐에 던집니다.
  • 그러면 들어온 요청이 물리적인 머신에 돌아야 하니까 Hypervisor선택되어야 합니다.
  • 이를 Nova-scheduler가 담당합니다.

 

  • 그리고 어디에 저장돼야하는지 알려주는 Cinder(볼륨), 하드디스크를 하나 받습니다.
  • 그리고 나서, Nova-Compute 한테 Instance 생성을 요청합니다. (너는 이 정보를 가지고 VM을 만들어줘)
[VM의 생성단계]
1. Nova-Scheduler에게 Hypervisor 선택
2. Cinder(Volume), Nuetron(Network) 할당 받음
3. Nova-Compute (VM Instance생성)

 

오픈스택 요청의 최 앞단은 API가 받는거에요. 그래서 분석을 할때도 우리는 API를 먼저 보고, API가 누구한테 보내는지를 타고타고 들어가면서 분석을 할거에요.

 

우리가 다룰 대부분 코드는 뒷단(하이퍼 바이저 뒤쪽, e.g. 신더볼륨) 을 안봐요.

볼륨을 저장할 데이터는 오래된 백엔드 시스템이에요 (e.g. NFS)

 

노바컴퓨트는 하이퍼바이저를 뭘 선택하느냐에 따라 다 달라요. 하이퍼바이저는 KVM도 있고 여러가지가 있죠.

생각만해도 머리 아픈 영역이죠.

 

하지만 API는 웹서비스가 어떻게 동작하는지만 알면 돼요. 우리가 6주까지 볼 영역은 API

그리고 좀더 나아가면 앞단(HTTP)의 클라이언트 영역까지.


What's Hypervisor?

 

IDC에다가 엄청나게 고사양의 컴퓨터를 만들어놔요. 이거(고사양의 컴퓨터)를 하이퍼바이저라 불러요.

하이퍼 바이저 역할은 VM을 띄우게 해주는 서버. (VM을 생성하고 관리함)

 

인스턴스 만들 때 스펙을 선택했잖아요. vm도 몇코어 짜리. 이런식으로 만들어 질거에요.

이렇게 많은 하이퍼 바이저 중에서, 어디에 새로운 VM을 생성해야할지 결정함.

이러한 결정을 하는게 노바 스케줄러. 어디에 놓을지

 

노바 스케줄러는 하이퍼 바이저에 대한 정보를 다 수집하고 있음.

vm은 몇대, 가용랑 코어는 몇코어, 메모리는 몇기가.

 

그러면 하이퍼 바이저에는 컴퓨트노드라는 노바컴퓨트가 떠있음.

그럼 사용자는 컴퓨트한테 vm을 만들어줘 라고 함.

 

보통 많이 쓰이는게 리소스 기반, 가장 여유가 많은 하이퍼 바이저를 선택하게 한다.

 

더이상 만들 수 없을 때는 오류가 납니다.

운영자는 계속 가용량을 확인을 해야함.


블록스토리지 (Cinder-Volume)

거대하게 큰 NAS를 만들어 놓음.

* NAS
N
etwork Attached Storage
LAN
으로 연결하는 외장하드

 

볼륨생성 요청이 들어오면, 해당 크기만큼 파일을 만들고, NFS붙어서 연결을 시켜줌.

NAS는 뭐를 하느냐 따라서 구성이 다양해져요. NAS 말고 다른 솔루션 쓸 수도 있고.

 

아마 AWS 도 이런 구조. 이런 구조를 shared storage 구조라고 많이 불러요.


가상 네트워크 (테넌트 네트워크)

가상 네트워크를 구성하는 방법.
사용자마다 분리된 환경을 만들어주고 vm들이 붙는거고.
이런 네트워크를 isolated 되어있다고 함.

오픈스택에서 가상 네트워크를 구성하는 방법은 다양함.
Vbox는 Vbox 방식대로 가상 네트워크를 붙여줌.
오픈스택은 오픈스위치로 만듬. 깊게 들어가면 어려우니까 이따가 사용해보면서 어떻게 만드는지 위주로 하겠다.

파란색 사용자가 인스턴스를 만들음.

네트워크 노드의 파란색은 공유기의 집합이라고 보면 됨.

 

오픈스택의 기본 옵션은. a-b 바로 못보내고, 공유기까지 갔다가 가요.

네트워크 노드가 죽으면 오픈스택의 모든 네트워크가 다 죽는다.

기본 흐름은 이런 방식으로 통신흐름. 뉴트론이 이렇게 만들어줌.


오픈스택 핵심 컴포넌트 물리배치

오픈스택을 구성하려면 물리적인 것들도 준비해줘야함

API와 에이전트, 2가지로 나눠지는데

 

  • API성 서비스 모아 놓는곳 => Controller Node (DB, 메시지큐, API 서비스를 여기에 다 설치함)
  • 컴퓨트 노드 = 하이퍼 바이저, 노바 컴퓨트를 실행시킴
  • 블록스토리지 = 신더, 큰 NAS를 서비스 하는 node들
  • 네트워크 노드

총 4가지로 분류함. 간단하게 봐도 물리장비가 4개 필요한데.

VM 1개 에서 가능하게 하는 데브스택.

 

5가지가 어떻게 동작하는지를 잘 모르텐데. 쓰면서 해봅니다.


4. OpenStack CLI

오픈스택을 이용하는 방법은 크게 3가지입니다.

  1. 웹 콘솔을 이용하는 방법
  2. api를 이용하는 방법
  3. cli를 이용하는 방법

1,3번은 결국 openstack api를 호출하게 됩니다.

우리는 그동안 웹 콘솔을 이용해서 오픈스택을 이용했고, 이제 openstack 이라는 명령어를 통해 간단하게 인스턴스 목록을 조회해봅니다.

먼저 웹 콘솔에서 로그인했던 것 처럼 cli에서 인증할 수 있는 정보를 환경변수에 저장해야합니다.

 

devstack 폴더를 보시면은. openrc 라는 파일이 있어요. 이제 여러분들이 공부해야하는 내용들이 여기서부터 나옵니다.

 

4-1. Openstack CLI 위한 환경설정

$pwd
/opt/stack

stack@devstack-master:~$ ls
bin          data              glance    logs     nova          sandbox
bindep-venv  devstack          horizon   neutron  placement     tempest
cinder       devstack.subunit  keystone  noVNC    requirements

stack@devstack-master:~$ cd devstack/
stack@devstack-master:~/devstack$ ls | grep openrc
openrc

stack@devstack-master:~/devstack$ file openrc
openrc: Bourne-Again shell script, ASCII text executable

stack@devstack-master:~/devstack$ cat openrc | more
#!/usr/bin/env bash
#
# source openrc [username] [projectname]
#
# Configure a set of credentials for $PROJECT/$USERNAME:
#   Set OS_PROJECT_NAME to override the default project 'demo'
#   Set OS_USERNAME to override the default user name 'demo'
#   Set ADMIN_PASSWORD to set the password for 'admin' and 'demo'

# NOTE: support for the old NOVA_* novaclient environment variables has
# been removed.

stack@devstack-master:~/devstack$ source openrc demo
WARNING: setting legacy OS_TENANT_NAME to support cli tools.

stack@devstack-master:~/devstack$ source openrc admin
WARNING: setting legacy OS_TENANT_NAME to support cli tools.


//$source openrc admin
//$source openrc demo
// 를 통해 인증정보를 환경변수에 저장해줍니다.

4-2. Openstack CLI 명령어를 사용하여, 대쉬보드에서 생성한 server 를 확인

이제 명령어를 통해 오픈스택의 CLI로 빠집니다.

stack@devstack-master:~/devstack$ openstack
(openstack)

여기서 server list 하면 우리가 아까 대쉬보드에서 만든 서버가 보여요.

stack@devstack-ussuri:~/devstack$ openstack server list
+--------------------------------------+------+--------+---------------------------------------------------------------------+-------+---------+
| ID                                   | Name | Status | Networks                                                            | Image | Flavor  |
+--------------------------------------+------+--------+---------------------------------------------------------------------+-------+---------+
| baad8346-1541-4f12-a7f3-a41681398679 | test | ACTIVE | private=fd82:98dc:7575:0:f816:3eff:fec7:61d8, 10.0.0.22, 172.24.4.3 |       | m1.nano |
+--------------------------------------+------+--------+---------------------------------------------------------------------+-------+---------+

 

근데 얘는 , 어떻게 정보를 가지고 오느냐? 

오픈스택 클라이언트(openstackclient)라는 패키지가 설치되어있고,

Keystone한테 가서 Token을 얻어오고 이후에 Nova-API로 이 정도를 얻어온다.

 

이 과정은 Debug Option을 넣음으로써 눈으로 확인 할 수 있다. openstack server list --debug

stack@devstack-master:~/devstack$ openstack server list --debug

START with options: server list --debug
options: Namespace(access_key='', access_secret='***', access_token='***', access_token_endpoint='', access_token_type='', application_credential_id='', application_credential_name='', application_credential_secret='***', auth_methods='', auth_type='password', auth_url='http://192.168.1.10/identity', cacert=None, cert='', client_id='', client_secret='***', cloud='', code='', consumer_key='', consumer_secret='***', debug=True, default_domain='default', default_domain_id='', default_domain_name='', deferred_help=False, discovery_endpoint='', domain_id='', domain_name='', endpoint='', identity_provider='', identity_provider_url='', insecure=None, interface='public', key='', log_file=None, openid_scope='', os_beta_command=False, os_compute_api_version='', os_dns_api_version='2', os_identity_api_version='3', os_image_api_version='', os_key_manager_api_version='1', os_network_api_version='', os_object_api_version='', os_placement_api_version='1.0', os_project_id=None, os_project_name=None, os_volume_api_version='3', passcode='', password='***', profile='', project_domain_id='default', project_domain_name='', project_id='', project_name='demo', protocol='', redirect_uri='', region_name='RegionOne', remote_project_domain_id='', remote_project_domain_name='', remote_project_id='', remote_project_name='', service_provider='', service_provider_endpoint='', service_provider_entity_id='', system_scope='', timing=False, token='***', trust_id='', user_domain_id='default', user_domain_name='', user_id='', username='admin', verbose_level=3, verify=None)
Auth plugin password selected
auth_config_hook(): {'api_timeout': None, 'verify': True, 'cacert': None, 'cert': None, 'key': None, 'baremetal_status_code_retries': '5', 'baremetal_introspection_status_code_retries': '5', 'image_status_code_retries': '5', 'disable_vendor_agent': {}, 'interface': 'public', 'floating_ip_source': 'neutron', 'image_api_use_tasks': False, 'image_format': 'qcow2', 'message': '', 'network_api_version': '2', 'object_store_api_version': '1', 'secgroup_source': 'neutron', 'status': 'active', 'auth': {'user_domain_id': 'default', 'project_domain_id': 'default', 'project_name': 'demo'}, 'verbose_level': 3, 'deferred_help': False, 'debug': True, 'region_name': 'RegionOne', 'default_domain': 'default', 'timing': False, 'auth_url': 'http://192.168.1.10/identity', 'username': 'admin', 'password': '***', 'beta_command': False, 'identity_api_version': '3', 'volume_api_version': '3', 'dns_api_version': '2', 'key_manager_api_version': '1', 'placement_api_version': '1.0', 'auth_type': 'password', 'networks': []}
defaults: {'api_timeout': None, 'verify': True, 'cacert': None, 'cert': None, 'key': None, 'auth_type': 'password', 'baremetal_status_code_retries': 5, 'baremetal_introspection_status_code_retries': 5, 'image_status_code_retries': 5, 'disable_vendor_agent': {}, 'interface': None, 'floating_ip_source': 'neutron', 'image_api_use_tasks': False, 'image_format': 'qcow2', 'message': '', 'network_api_version': '2', 'object_store_api_version': '1', 'secgroup_source': 'neutron', 'status': 'active'}
cloud cfg: {'api_timeout': None, 'verify': True, 'cacert': None, 'cert': None, 'key': None, 'baremetal_status_code_retries': '5', 'baremetal_introspection_status_code_retries': '5', 'image_status_code_retries': '5', 'disable_vendor_agent': {}, 'interface': 'public', 'floating_ip_source': 'neutron', 'image_api_use_tasks': False, 'image_format': 'qcow2', 'message': '', 'network_api_version': '2', 'object_store_api_version': '1', 'secgroup_source': 'neutron', 'status': 'active', 'auth': {'user_domain_id': 'default', 'project_domain_id': 'default', 'project_name': 'demo'}, 'verbose_level': 3, 'deferred_help': False, 'debug': True, 'region_name': 'RegionOne', 'default_domain': 'default', 'timing': False, 'auth_url': 'http://192.168.1.10/identity', 'username': 'admin', 'password': '***', 'beta_command': False, 'identity_api_version': '3', 'volume_api_version': '3', 'dns_api_version': '2', 'key_manager_api_version': '1', 'placement_api_version': '1.0', 'auth_type': 'password', 'networks': []}
compute API version 2.1, cmd group openstack.compute.v2
identity API version 3, cmd group openstack.identity.v3
image API version 2, cmd group openstack.image.v2
network API version 2, cmd group openstack.network.v2
object_store API version 1, cmd group openstack.object_store.v1
volume API version 3, cmd group openstack.volume.v3
dns API version 2, cmd group openstack.dns.v2
/usr/local/lib/python3.6/dist-packages/barbicanclient/__init__.py:61: UserWarning: The secrets module is moved to barbicanclient/v1 directory, direct import of barbicanclient.secrets will be deprecated. Please import barbicanclient.v1.secrets instead.
  % (name, name, name))
key_manager API version 1, cmd group openstack.key_manager.v1
placement API version 1.0, cmd group openstack.placement.v1
neutronclient API version 2, cmd group openstack.neutronclient.v2
command: server list -> openstackclient.compute.v2.server.ListServer (auth=True)
Auth plugin password selected
auth_config_hook(): {'api_timeout': None, 'verify': True, 'cacert': None, 'cert': None, 'key': None, 'baremetal_status_code_retries': '5', 'baremetal_introspection_status_code_retries': '5', 'image_status_code_retries': '5', 'disable_vendor_agent': {}, 'interface': 'public', 'floating_ip_source': 'neutron', 'image_api_use_tasks': False, 'image_format': 'qcow2', 'message': '', 'network_api_version': '2', 'object_store_api_version': '1', 'secgroup_source': 'neutron', 'status': 'active', 'auth': {'user_domain_id': 'default', 'project_domain_id': 'default', 'project_name': 'demo'}, 'additional_user_agent': [('osc-lib', '2.2.0')], 'verbose_level': 3, 'deferred_help': False, 'debug': True, 'region_name': 'RegionOne', 'default_domain': 'default', 'timing': False, 'auth_url': 'http://192.168.1.10/identity', 'username': 'admin', 'password': '***', 'beta_command': False, 'identity_api_version': '3', 'volume_api_version': '3', 'dns_api_version': '2', 'key_manager_api_version': '1', 'placement_api_version': '1.0', 'auth_type': 'password', 'networks': []}
Using auth plugin: password
Using parameters {'auth_url': 'http://192.168.1.10/identity', 'project_name': 'demo', 'project_domain_id': 'default', 'username': 'admin', 'user_domain_id': 'default', 'password': '***'}
Get auth_ref
REQ: curl -g -i -X GET http://192.168.1.10/identity -H "Accept: application/json" -H "User-Agent: openstacksdk/0.48.0 keystoneauth1/4.2.1 python-requests/2.23.0 CPython/3.6.9"
Starting new HTTP connection (1): 192.168.1.10:80
http://192.168.1.10:80 "GET /identity HTTP/1.1" 300 271
RESP: [300] Connection: close Content-Length: 271 Content-Type: application/json Date: Sat, 15 Aug 2020 08:43:50 GMT Location: http://192.168.1.10/identity/v3/ Server: Apache/2.4.29 (Ubuntu) Vary: X-Auth-Token x-openstack-request-id: req-4613e711-fdd4-46a3-8993-e9ae4c41d18e
RESP BODY: {"versions": {"values": [{"id": "v3.14", "status": "stable", "updated": "2020-04-07T00:00:00Z", "links": [{"rel": "self", "href": "http://192.168.1.10/identity/v3/"}], "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}]}]}}
GET call to http://192.168.1.10/identity used request id req-4613e711-fdd4-46a3-8993-e9ae4c41d18e
Making authentication request to http://192.168.1.10/identity/v3/auth/tokens
Resetting dropped connection: 192.168.1.10
http://192.168.1.10:80 "POST /identity/v3/auth/tokens HTTP/1.1" 201 3238
{"token": {"methods": ["password"], "user": {"domain": {"id": "default", "name": "Default"}, "id": "b1f15ecfa456447c8d69ffaca15a2c69", "name": "admin", "password_expires_at": null}, "audit_ids": ["sT7dO3C2QQufMuav1_kbMA"], "expires_at": "2020-08-15T09:43:50.000000Z", "issued_at": "2020-08-15T08:43:50.000000Z", "project": {"domain": {"id": "default", "name": "Default"}, "id": "4e2abe72f99d484a82473b851a792f8a", "name": "demo"}, "is_domain": false, "roles": [{"id": "fc5e9c2521a54c549227584af038d936", "name": "admin"}, {"id": "a1ee887319094e53903f15dc2d666802", "name": "reader"}, {"id": "85a571b04689459689537521c0a0fdf5", "name": "member"}], "catalog": [{"endpoints": [{"id": "f945f53e7d344c9a8256596f9ff282f2", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/placement", "region": "RegionOne"}], "id": "1503eeba5cba477db6fd474e4a24a5c6", "type": "placement", "name": "placement"}, {"endpoints": [{"id": "d72bc459ad6f41bea2f0303a2afedba4", "interface": "admin", "region_id": "RegionOne", "url": "http://192.168.1.10/identity", "region": "RegionOne"}, {"id": "f6858530573149d69aa193a0ece5f1c9", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/identity", "region": "RegionOne"}], "id": "2cf97b7115674da6ace93e995a2cb375", "type": "identity", "name": "keystone"}, {"endpoints": [{"id": "72cfe5f2bc7f40b28a82f3f29c0c63a3", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/volume/v3/4e2abe72f99d484a82473b851a792f8a", "region": "RegionOne"}], "id": "361681860f4a4e43a4672ad4d0384914", "type": "block-storage", "name": "cinder"}, {"endpoints": [{"id": "ae340690cdd744de91f1beaadfad39a9", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/compute/v2/4e2abe72f99d484a82473b851a792f8a", "region": "RegionOne"}], "id": "609d2bc5068745c5a121b9dccb07f4df", "type": "compute_legacy", "name": "nova_legacy"}, {"endpoints": [{"id": "e5c47c82359e4e95b3c44a227e386fa9", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/compute/v2.1", "region": "RegionOne"}], "id": "8e796223b2d54b0589b9f946054383f1", "type": "compute", "name": "nova"}, {"endpoints": [{"id": "10c1f224536f49d7bc7e1636a0f7269c", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10:9696/", "region": "RegionOne"}], "id": "a6c44f725bd6475aa8a55d95bbdf2e06", "type": "network", "name": "neutron"}, {"endpoints": [{"id": "9f17e34c00334ccfbec566924a21b73d", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/volume/v3/4e2abe72f99d484a82473b851a792f8a", "region": "RegionOne"}], "id": "b3ba590527904064b00ca9e0e08b47de", "type": "volumev3", "name": "cinderv3"}, {"endpoints": [{"id": "d69fd4179e734ded829dbb6bac2c798d", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/volume/v2/4e2abe72f99d484a82473b851a792f8a", "region": "RegionOne"}], "id": "bf35a9e539644b38a1b2b3a33d1dd4ca", "type": "volumev2", "name": "cinderv2"}, {"endpoints": [{"id": "7dae0c04707646dabc427de59290de2f", "interface": "public", "region_id": "RegionOne", "url": "http://192.168.1.10/image", "region": "RegionOne"}], "id": "d0c628ecbdc94a39aea1270c30d6e619", "type": "image", "name": "glance"}]}}
run(Namespace(all_projects=False, changes_before=None, changes_since=None, columns=[], deleted=False, fit_width=False, flavor=None, formatter='table', host=None, image=None, instance_name=None, ip=None, ip6=None, limit=None, locked=False, long=False, marker=None, max_width=0, name=None, name_lookup_one_by_one=False, no_name_lookup=False, noindent=False, print_empty=False, project=None, project_domain=None, quote_mode='nonnumeric', reservation_id=None, sort_columns=[], status=None, unlocked=False, user=None, user_domain=None))
Instantiating compute client for API Version Major: 2, Minor: 1
Instantiating compute api: <class 'openstackclient.api.compute_v2.APIv2'>
Instantiating identity client: <class 'keystoneclient.v3.client.Client'>
REQ: curl -g -i -X GET http://192.168.1.10/image -H "Accept: application/json" -H "User-Agent: openstacksdk/0.48.0 keystoneauth1/4.2.1 python-requests/2.23.0 CPython/3.6.9"
Resetting dropped connection: 192.168.1.10
http://192.168.1.10:80 "GET /image HTTP/1.1" 300 984
RESP: [300] Connection: close Content-Length: 984 Content-Type: application/json Date: Sat, 15 Aug 2020 08:43:51 GMT Server: Apache/2.4.29 (Ubuntu)
RESP BODY: {"versions": [{"id": "v2.9", "status": "CURRENT", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.7", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.6", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.5", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.4", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.3", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.2", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.1", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}, {"id": "v2.0", "status": "SUPPORTED", "links": [{"rel": "self", "href": "http://192.168.1.10/image/v2/"}]}]}
Image client initialized using OpenStack SDK: <openstack.image.v2._proxy.Proxy object at 0x7ff415c13128>
search options: {'reservation_id': None, 'ip': None, 'ip6': None, 'name': None, 'instance_name': None, 'status': None, 'flavor': None, 'image': None, 'host': None, 'tenant_id': None, 'all_tenants': False, 'user_id': None, 'deleted': False, 'changes-before': None, 'changes-since': None}
REQ: curl -g -i -X GET http://192.168.1.10/compute/v2.1/servers/detail -H "Accept: application/json" -H "User-Agent: python-novaclient" -H "X-Auth-Token: {SHA256}39df159de5e1078c1864584194ad8500bc36ff23a6192e2da869bcc448f1d58e" -H "X-OpenStack-Nova-API-Version: 2.1"
Resetting dropped connection: 192.168.1.10
http://192.168.1.10:80 "GET /compute/v2.1/servers/detail HTTP/1.1" 200 1721
RESP: [200] Connection: close Content-Length: 1721 Content-Type: application/json Date: Sat, 15 Aug 2020 08:43:51 GMT OpenStack-API-Version: compute 2.1 Server: Apache/2.4.29 (Ubuntu) Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version X-OpenStack-Nova-API-Version: 2.1 x-compute-request-id: req-ac47f9d5-42fb-4abd-a26d-21afc91f6f69 x-openstack-request-id: req-ac47f9d5-42fb-4abd-a26d-21afc91f6f69
RESP BODY: {"servers": [{"id": "6f91eb30-8687-49d7-859f-7284887d57f8", "name": "1st_Ins", "status": "ACTIVE", "tenant_id": "4e2abe72f99d484a82473b851a792f8a", "user_id": "b1f15ecfa456447c8d69ffaca15a2c69", "metadata": {}, "hostId": "f0b0f1375254bb6ee4a83c7f4e2ad6331d94f497bb3a9b1848af817a", "image": "", "flavor": {"id": "42", "links": [{"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/42"}]}, "created": "2020-08-06T13:21:28Z", "updated": "2020-08-06T13:21:46Z", "addresses": {"private": [{"version": 4, "addr": "10.0.0.53", "OS-EXT-IPS:type": "fixed", "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:79:1b:ec"}, {"version": 6, "addr": "fd30:b09a:8b83:0:f816:3eff:fe79:1bec", "OS-EXT-IPS:type": "fixed", "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:79:1b:ec"}, {"version": 4, "addr": "172.24.4.59", "OS-EXT-IPS:type": "floating", "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:79:1b:ec"}]}, "accessIPv4": "", "accessIPv6": "", "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/servers/6f91eb30-8687-49d7-859f-7284887d57f8"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/servers/6f91eb30-8687-49d7-859f-7284887d57f8"}], "OS-DCF:diskConfig": "AUTO", "progress": 0, "OS-EXT-AZ:availability_zone": "nova", "config_drive": "", "key_name": "keyy", "OS-SRV-USG:launched_at": "2020-08-06T13:21:45.000000", "OS-SRV-USG:terminated_at": null, "OS-EXT-SRV-ATTR:host": "devstack-master", "OS-EXT-SRV-ATTR:instance_name": "instance-00000001", "OS-EXT-SRV-ATTR:hypervisor_hostname": "devstack-master", "OS-EXT-STS:task_state": null, "OS-EXT-STS:vm_state": "active", "OS-EXT-STS:power_state": 1, "os-extended-volumes:volumes_attached": [{"id": "05e026ea-96ed-4499-9506-f6ba1cb63897"}], "security_groups": [{"name": "default"}]}]}
GET call to compute for http://192.168.1.10/compute/v2.1/servers/detail used request id req-ac47f9d5-42fb-4abd-a26d-21afc91f6f69
REQ: curl -g -i -X GET http://192.168.1.10/image/v2/images -H "Accept: application/json" -H "User-Agent: openstacksdk/0.48.0 keystoneauth1/4.2.1 python-requests/2.23.0 CPython/3.6.9" -H "X-Auth-Token: {SHA256}39df159de5e1078c1864584194ad8500bc36ff23a6192e2da869bcc448f1d58e"
Resetting dropped connection: 192.168.1.10
http://192.168.1.10:80 "GET /image/v2/images HTTP/1.1" 200 1040
RESP: [200] Connection: close Content-Length: 1040 Content-Type: application/json Date: Sat, 15 Aug 2020 08:43:51 GMT Server: Apache/2.4.29 (Ubuntu) X-Openstack-Request-Id: req-0795b843-d0cf-401c-86c6-825d4c7bea93
RESP BODY: {"images": [{"hw_rng_model": "virtio", "owner_specified.openstack.md5": "", "owner_specified.openstack.sha256": "", "owner_specified.openstack.object": "images/cirros-0.5.1-x86_64-disk", "name": "cirros-0.5.1-x86_64-disk", "disk_format": "qcow2", "container_format": "bare", "visibility": "public", "size": 16338944, "virtual_size": null, "status": "active", "checksum": "1d3062cd89af34e419f7100277f38b2b", "protected": false, "min_ram": 0, "min_disk": 0, "owner": "95006128faad4ee8b9730828966fe8f1", "os_hidden": false, "os_hash_algo": "sha512", "os_hash_value": "553d220ed58cfee7dafe003c446a9f197ab5edf8ffc09396c74187cf83873c877e7ae041cb80f3b91489acf687183adcd689b53b38e3ddd22e627e7f98a09c46", "id": "f95c50fc-2f2e-4b13-8e60-266e67f930cd", "created_at": "2020-08-06T12:47:37Z", "updated_at": "2020-08-06T12:47:37Z", "tags": [], "self": "/v2/images/f95c50fc-2f2e-4b13-8e60-266e67f930cd", "file": "/v2/images/f95c50fc-2f2e-4b13-8e60-266e67f930cd/file", "schema": "/v2/schemas/image"}], "first": "/v2/images", "schema": "/v2/schemas/images"}
GET call to image for http://192.168.1.10/image/v2/images used request id req-0795b843-d0cf-401c-86c6-825d4c7bea93
REQ: curl -g -i -X GET http://192.168.1.10/compute/v2.1/flavors/detail?is_public=None -H "Accept: application/json" -H "User-Agent: python-novaclient" -H "X-Auth-Token: {SHA256}39df159de5e1078c1864584194ad8500bc36ff23a6192e2da869bcc448f1d58e" -H "X-OpenStack-Nova-API-Version: 2.1"
Resetting dropped connection: 192.168.1.10
http://192.168.1.10:80 "GET /compute/v2.1/flavors/detail?is_public=None HTTP/1.1" 200 4297
RESP: [200] Connection: close Content-Length: 4297 Content-Type: application/json Date: Sat, 15 Aug 2020 08:43:51 GMT OpenStack-API-Version: compute 2.1 Server: Apache/2.4.29 (Ubuntu) Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version X-OpenStack-Nova-API-Version: 2.1 x-compute-request-id: req-b5bc772c-9d83-434c-bf61-b0f51ec4fae3 x-openstack-request-id: req-b5bc772c-9d83-434c-bf61-b0f51ec4fae3
RESP BODY: {"flavors": [{"id": "1", "name": "m1.tiny", "ram": 512, "disk": 1, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 1, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/1"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/1"}]}, {"id": "2", "name": "m1.small", "ram": 2048, "disk": 20, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 1, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/2"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/2"}]}, {"id": "3", "name": "m1.medium", "ram": 4096, "disk": 40, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 2, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/3"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/3"}]}, {"id": "4", "name": "m1.large", "ram": 8192, "disk": 80, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 4, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/4"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/4"}]}, {"id": "42", "name": "m1.nano", "ram": 128, "disk": 1, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 1, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/42"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/42"}]}, {"id": "5", "name": "m1.xlarge", "ram": 16384, "disk": 160, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 8, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/5"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/5"}]}, {"id": "84", "name": "m1.micro", "ram": 192, "disk": 1, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 1, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/84"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/84"}]}, {"id": "c1", "name": "cirros256", "ram": 256, "disk": 1, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 1, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/c1"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/c1"}]}, {"id": "d1", "name": "ds512M", "ram": 512, "disk": 5, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 1, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/d1"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/d1"}]}, {"id": "d2", "name": "ds1G", "ram": 1024, "disk": 10, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 1, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/d2"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/d2"}]}, {"id": "d3", "name": "ds2G", "ram": 2048, "disk": 10, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 2, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/d3"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/d3"}]}, {"id": "d4", "name": "ds4G", "ram": 4096, "disk": 20, "swap": "", "OS-FLV-EXT-DATA:ephemeral": 0, "OS-FLV-DISABLED:disabled": false, "vcpus": 4, "os-flavor-access:is_public": true, "rxtx_factor": 1.0, "links": [{"rel": "self", "href": "http://192.168.1.10/compute/v2.1/flavors/d4"}, {"rel": "bookmark", "href": "http://192.168.1.10/compute/flavors/d4"}]}]}
GET call to compute for http://192.168.1.10/compute/v2.1/flavors/detail?is_public=None used request id req-b5bc772c-9d83-434c-bf61-b0f51ec4fae3
+--------------------------------------+---------+--------+----------------------------------------------------------------------+-------+---------+
| ID                                   | Name    | Status | Networks                                                             | Image | Flavor  |
+--------------------------------------+---------+--------+----------------------------------------------------------------------+-------+---------+
| 6f91eb30-8687-49d7-859f-7284887d57f8 | 1st_Ins | ACTIVE | private=10.0.0.53, fd30:b09a:8b83:0:f816:3eff:fe79:1bec, 172.24.4.59 |       | m1.nano |
+--------------------------------------+---------+--------+----------------------------------------------------------------------+-------+---------+
clean_up ListServer:
END return value: 0

4-3. 그렇다면 실행시킨 "openstack" 이라는 명령어는 어디에 있는가?

stack@devstack-master:~/devstack$ whereis openstack
openstack: /etc/openstack /usr/local/bin/openstack

stack@devstack-master:~/devstack$ which openstack
/usr/local/bin/openstack

 

명령어의 위치를 확인하였습니다. 내용을 확인해봅니다.

 

stack@devstack-ussuri:~/devstack$ cat /usr/local/bin/openstack

#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
import re
import sys
from openstackclient.shell import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
    
    
stack@devstack-ussuri:~/devstack$

 

파일을 열어보니 openstackclient 라는 패키지에서 main 함수를 실행하는 것이 전부입니다. 그럼 아까 우리가 실행시켰던 openstack server list가 저 패키지 안에 있다는 뜻입니다.

저 패키지가 저장된 경로는 다음과 같이 확인할 수 있습니다.

stack@devstack-ussuri:~/devstack$ python3

Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import openstackclient
>>> openstackclient
<module 'openstackclient' from '/usr/local/lib/python3.6/dist-packages/openstackclient/__init__.py'>

 

이제 여러분들께 내는 숙제입니다.

openstack server list라는 명령어를 실행했을 때,

openstack이라는 명령어 부터 ~ 화면에 출력되어 반환하는 과정까지

어떤 파일들을 건드리는지 Tracing 하면 됩니다.

 

처음 하시는 분들이 있을 수도 있으니 물고기를 잡는 방법을 알려드리겠습니다.

  • 먼저 단어들로 소스코드 전체를 뒤지세요.
    가장 잘 찾을 수 있는 방법이에요.
  • 이 코드를 건드릴 거 같다? => print문 삽입.
    무식한 방법이지만 오픈스택은 이렇게 해야해요
    규모가 너무 거대해서 디버깅을 할 수 가 없어요 ㅠㅠ..
지름길로 갈게요. 컴퓨트에 서버가 있어요
grep "def list(" -R
recursive 하게.

 

오픈스택 클라이언트로 몰림. (노바, 이런거 나눠놨다가)

여기가 버그가 아주 많습니다.

우리는 이걸로 컨트리뷰션 할 거에요.


[실습]

To be Cont'd 


■ References

 

[1] devstack 설치

 

openstack.dooray.com

 

[2] demo 프로젝트 사용해보기

 

openstack.dooray.com

 

[3] openstack cli 이용하기

 

openstack.dooray.com