4주차 과제 - 김채아 (작성중)

4주차 과제 :

  1. openstack user [CRUD] 명령어 정리
  2. functional test 구현

openstack user [CRUD]

OpenStack Identity Service(Keystone) 에서 User(사용자) 리소스를 Create / Read / Update / Delete 하는 명령어

  1. Create : openstack user create
openstack user create <USER_NAME> \
    --domain <DOMAIN_NAME_OR_ID> \
    --password <PASSWORD> \
    [--email <EMAIL>] \
    [--description <TEXT>] \
    [--enable | --disable]
  • <USER_NAME>: 새로 만들 사용자의 이름
  • --domain: 사용자 소속 도메인
  • --password: 계정 비밀번호
  • --email: 이메일 주소 (선택)
  • --enable / --disable: 생성 시 활성/비활성 여부 지정
  1. Read : openstack user show
# 개별 사용자 조회
openstack user show <USER_NAME_OR_ID>

# 사용자 목록 조회
openstack user list [--domain <DOMAIN>] [--long]
  1. Update : openstack user set
openstack user set <USER_NAME_OR_ID> \
    [--name <NEW_NAME>] \
    [--email <EMAIL>] \
    [--password <PASSWORD>] \
    [--enable | --disable]
  • 사용자의 이름, 이메일, 비밀번호 변경
  • 활성/비활성 상태 변경
  1. Delete : openstack user delete
openstack user delete <USER_NAME_OR_ID>
  • 해당 사용자를 Keystone에서 삭제
  • 삭제 시, 이 사용자가 속한 프로젝트나 역할과의 연결도 함께 제거됨

openstack user list 실행 흐름

# openstackclient/identity/v3/user.py : ListUser.take_action

class ListUser(command.Lister):
    def take_action(self, parsed_args):
		# 1. Identity SDK 핸들 준비
        identity_client = self.app.client_manager.sdk_connection.identity
        # 2. 입력 파라미터 확인
        domain = find_domain_id_if_given(parsed_args.domain)

        group = find_group_id_if_given(parsed_args.group,
                                      domain_hint=parsed_args.domain)

        enabled = parsed_args.is_enabled
		# 3. 데이터 조회
        if parsed_args.project:
            # 1) 프로젝트 ID 확인
            project = find_project_id(parsed_args.project, domain)

            # 2) 할당된 역할 확인
            assignments = identity_client.role_assignments_filter(project=project)

            # 3) 사용자 ID만 고유 집합으로 수집(여러 롤 중복 제거)
            user_ids = {a.user['id'] for a in assignments if a.user}

            # 4) 각 사용자 ID를 find_user()로 개체화
            data = [identity_client.find_user(uid, ignore_missing=False)
                    for uid in user_ids]	
		...
		# 4. 출력 컬럼 구성
        if parsed_args.long:
            columns = [
                'ID', 'Name',
                'Default Project Id',
                'Domain Id',      
                'Description', 'Email', 'Is Enabled'  
            ]
            column_headers = ['ID', 'Name', 'Project', 'Domain',
                              'Description', 'Email', 'Enabled']
        else:
            columns = ['ID', 'Name']
            column_headers = columns

        # 5. 포맷팅하여 반환
        return (
            column_headers,
            (utils.get_item_properties(s, columns, formatters={}) for s in data),
        )