4주차 과제 - 오수진 (1)

어제 못 올리고 자서 늦었지만 오전에 올립니다! 늦어서 죄송합니다

4주차 과제 - openstack role [CRUD] 명령어 분석

1. openstack에서 role이란?

최종 사용자가 얻을 수 있는 권한 수준을 지정합니다. 역할은 도메인 또는 프로젝트 수준으로 부여될 수 있습니다. 역할은 개별 사용자 또는 그룹 수준에서 할당될 수 있습니다. 역할 이름은 소유 도메인 내에서 고유합니다.

2. CLI 사용법 정리

1) assignment list / list / show

  • assignment list의 경우 특정 사용자의 역할 목록을 확인하는 명령어이고, list는 전제 역할을 확인하는 명령어입니다. show의 경우 특정 역할의 구체적 사항을 확인할 수 있습니다. 아래는 명령어의 옵션들에 대한 부가적인 정보입니다.

    # assignment list
    usage: openstack role assignment list [-h] [-f {csv,json,table,value,yaml}] [-c COLUMN] [--quote {all,minimal,none,nonnumeric}]
                                          [--noindent] [--max-width <integer>] [--fit-width] [--print-empty] [--sort-column SORT_COLUMN]
                                          [--sort-ascending | --sort-descending] [--effective] [--role <role>] [--role-domain <role-domain>]
                                          [--names] [--user <user>] [--user-domain <user-domain>] [--group <group>]
                                          [--group-domain <group-domain>]
                                          [--domain <domain> | --project <project> | --system <system>]
                                          [--project-domain <project-domain>] [--inherited] [--auth-user] [--auth-project]
    
    # list
    usage: openstack role list [-h] [-f {csv,json,table,value,yaml}] [-c COLUMN] [--quote {all,minimal,none,nonnumeric}] [--noindent]
    [--max-width <integer>] [--fit-width] [--print-empty] [--sort-column SORT_COLUMN]
    [--sort-ascending | --sort-descending] [--domain <domain>]
    
  • role list 명령어를 기준으로 옵션들을 분석해보면 아래와 같습니다.

    1) 일반 옵션

    • h, --help: 도움말 메시지를 보여주고 종료합니다.
    • --domain : (name or ID) 포함

    2) 출력 형식 옵션

    • -f {csv,json,table,value,yaml}, --format {csv,json,table,value,yaml}: 출력 형식을 지정합니다. (기본값: table)
    • c, --column COLUMN: 특정한 컬럼을 선택하여 볼 수 있으며, 여러개도 가능합니다.
    • --sort-column SORT_COLUMN : 특정 컬럼을 정렬한 상태로 볼 수 있습니다.
    • --sort-ascending, --sort-descending

    3) CSV 형식 옵션

    • --quote {all,minimal,none,nonnumeric}: 따옴표를 포함시키는 시기를 지정하며, 기본값은 숫자가 아닌 값에만 적용합니다.

    4) Json 형식 옵션

    • --noindent : Json에서 들여쓰기를 적용할지 여부를 설정합니다.

    5) Table 형식 옵션

    • -max-width <INTEGER>: 테이블의 최대 너비를 설정합니다.
    • -fit-width: 현재 터미널 창의 너비에 맞춰 테이블 크기를 자동으로 조절합니다.
    • -print-empty: 표시할 데이터가 없을 경우, 빈 테이블의 틀을 출력합니다.

2) add / create

  • create의 경우 역할 자체를 생성하게 되고, add의 경우 특정 사용자에게 해당 역할을 부여하게 됩니다.

    # add
    usage: openstack role add [-h] [--system <system> | --domain <domain> | --project <project>]
    [--user <user> | --group <group>] [--group-domain <group-domain>] [--project-domain <project-domain>]
    [--user-domain <user-domain>] [--inherited] [--role-domain <role-domain>]
    <role>
    
    # create
    usage: openstack role create [-h] [-f {json,shell,table,value,yaml}] [-c COLUMN] [--noindent] [--prefix PREFIX]
                                 [--max-width <integer>] [--fit-width] [--print-empty] [--description <description>] [--domain <domain>]
                                 [--or-show] [--immutable | --no-immutable]
                                 <role-name>
    

3) remove / delete

  • 마찬가지로 delete의 경우 역할 자제를 삭제하는 것이고, remove는 사용자에게서 역할을 수거하는 것입니다.

4) set은 역할을 수정하는 명령어입니다.

참고 문서

=========================================================================
전에 제출 못 했던 2, 3주차 과제도 아래에 첨부하였습니다!

2주차 과제

[필수과제]

server list는 아래와 같이 한정된 값만 출력을 해주고 있습니다.
python-openstackclient의 server list Class를 수정하여 위 결과값에 project name , user name을 포함시켜서 출력되게 해주세요.

코드 변경한 점
user_name, project_name 컬럼을 추가하고, search_opts 기반으로 리스트 형식으로 형성된 data 목록을 반복문 돌며 identity_common을 통해 각 user와 project의 이름을 받아와 변수에 저장하였습니다. 아래 첨부사진은 git diff를 통해 코드의 변경사항을 확인한 것입니다.

문제개선

  • 위의 코드로 실행했을 때, 원하던 결과가 잘 실행되었지만 예외처리가 되지 않았다는 점을 깨달았습니다. 이는 후에 테스트를실행했을 때 문제를 발생시킬 수 있기 때문에 예외처리를 아래와 같이 추가하여 기존 코드를 수정했습니다.
# 기존 코드
# s.user_name = identity_common.find_user(
#     identity_client, s.user_id
# ).name
# s.project_name = identity_common.find_project(
#     identity_client, s.project_id
# ).name

# 수정 코드
user = identity_common.find_user(
    identity_client, getattr(s, 'user_id', None)
)
user_name = getattr(user, 'name', None)
s.user_name = user_name if isinstance(user_name, str) else None

project = identity_common.find_project(
    identity_client, getattr(s, 'project_id', None)
)
project_name = getattr(project, 'name', None)
s.project_name = (
    project_name if isinstance(project_name, str) else None
)

결과

3주차 과제

2주차에 진행한 server list 확장 코드에서 tox를 통해 unit test를 실행시키면 Test Failed가 발생합니다.
openstackclient.tests.unit.compute 경로에 있는 server list에 대한 unit test를 수정하여 tox 실행시 모든 unit test에서 성공하도록 해주세요.
제출 내용 1: 수정된 unit test code (스크린샷 또는 실제 코드)
제출 내용 2: 아래의 예시와 같이 tox를 통해 모든 unit test 통과한 화면

[문제]
tox명령어를 실행했을때 아래와 같은 오류가 발생하였습니다. tox가 테스트를 실행할 때, 테스트 파일의 위치를 잘못 읽어오면서 발생한 문제로 stestr설정 파일은 셸이 아니므로, ${…}같은 변수 확장 문법을 해석하지 못해 발생했습니다.

따라서 변수 대신 실제 경로를 작성하여 수정했습니다.

[코드]
이후 본격적이 변경사항에 맞추어 테스트 코드를 수정했습니다.

테스트의 기본 설정을 책임지는_TestServerList, TestServerListV273(실제 실행을 담당) 클래스에서 컬럼 목록에 추가하여 수정합니다.

user_name, project_name이 추가될 수 있도록 초기 설정 TestServer클래스의 setup_sdk_servers_mock 메서드에 servers 목록을 돌며 컬럼을 초기화하는 작업을 추가해주었습니다.

TestServerList, TestServerListV273 클래스의 메서드들 self.datauser_name, project_name 컬럼을 추가했습니다.이때, 순서를 잘 맞추어서 작성해야 합니다.

[결과]