4주차 과제 - 빈정원 (2)

필수 과제

과제 선택

  • [image] glance
  • 경로 : openstacksdk/openstack/tests/functional/image/v2/test_member
  • 명령어 : openstack image member [ get | list ]

Functional 테스트 코드 구현

Functional 테스트 코드 실행을 위한 clouds.yaml 설정

clouds:
  devstack-admin:
    auth:
      auth_url: http://xxx.xxx.xxx.xxx/identity
      username: admin
      password: password
      project_domain_name: default
      project_name: admin
      user_domain_name: default
    region_name: RegionOne
    interface: public
    auth_type: password
    identity_api_version: 3
  devstack:
    auth:
      auth_url: http://xxx.xxx.xxx.xxx/identity
      username: demo
      password: password
      project_domain_name: default
      project_name: demo
      user_domain_name: default
    region_name: RegionOne
    interface: public
    auth_type: password
    identity_api_version: 3
  devstack-alt:
    auth:
      auth_url: http://xxx.xxx.xxx.xxx/identity
      username: alt_demo
      password: password
      project_domain_name: Default
      project_name: alt_demo
      user_domain_name: Default
    region_name: RegionOne
    interface: public
    auth_type: password
    identity_api_version: 3
  devstack-system-admin:
    auth:
      auth_url: http://xxx.xxx.xxx.xxx/identity
      username: admin
      password: password
      user_domain_name: Default
    system_scope: all
    region_name: RegionOne
    interface: public
    auth_type: password
    identity_api_version: 3

Functional 테스트 코드 작성

from openstack import exceptions as sdk_exc
from openstack.image.v2 import image as _image
from openstack.image.v2 import member as _member
from openstack.tests.functional.image.v2 import base


TEST_IMAGE_NAME = 'Test Image for Sharing'
MEMBER_STATUS_PENDING = 'pending'
MEMBER_STATUS_ACCEPTED = 'accepted'


class TestImageMember(base.BaseImageTest):
    def setUp(self):
        super().setUp()

        # NOTE(jbeen): 1-byte dummy image data for sharing tests; not bootable.
        self.image = self.operator_cloud.image.create_image(
            name=TEST_IMAGE_NAME,
            disk_format='raw',
            container_format='bare',
            visibility='shared',
            data=b'0',
        )
        self.assertIsInstance(self.image, _image.Image)
        self.assertEqual(TEST_IMAGE_NAME, self.image.name)

        self.member_id = self.user_cloud.session.get_project_id()
        self.assertIsNotNone(self.member_id)

    def tearDown(self):
        self.operator_cloud.image.delete_image(self.image)
        self.operator_cloud.image.wait_for_delete(self.image)

        super().tearDown()

    def test_image_members(self):
        # add member
        member = self.operator_cloud.image.add_member(
            image=self.image, member=self.member_id
        )
        self.assertIsInstance(member, _member.Member)
        self.assertEqual(self.member_id, member.member_id)
        self.assertEqual(MEMBER_STATUS_PENDING, member.status)

        # get member
        member = self.operator_cloud.image.get_member(
            image=self.image, member=self.member_id
        )
        self.assertIsInstance(member, _member.Member)
        self.assertEqual(self.member_id, member.member_id)

        # list members
        members = list(self.operator_cloud.image.members(image=self.image))
        self.assertIn(self.member_id, {m.id for m in members})

        # update member
        member = self.user_cloud.image.update_member(
            image=self.image,
            member=self.member_id,
            status=MEMBER_STATUS_ACCEPTED,
        )
        self.assertIsInstance(member, _member.Member)
        self.assertEqual(self.member_id, member.member_id)
        self.assertEqual(MEMBER_STATUS_ACCEPTED, member.status)

        # remove member
        self.operator_cloud.image.remove_member(
            image=self.image, member=self.member_id
        )
        self.assertRaises(
            sdk_exc.NotFoundException,
            self.operator_cloud.image.get_member,
            image=self.image,
            member=self.member_id,
        )

Functional 테스트 코드 실행

  • tox -e functional -- openstack.tests.functional.image.v2.test_member

pep8 체크

  • tox -e pep8 -- openstack/tests/functional/image/v2/test_member.py

Gerrit 업로드

jbeen@BOOK-7EAU0DUI0E:~/projects/OCA-OpenStack/openstacksdk$ git commit -s
[master 45195fa3d] tests: Add functional test for image members
 1 file changed, 87 insertions(+)
 create mode 100644 openstack/tests/functional/image/v2/test_member.py
jbeen@BOOK-7EAU0DUI0E:~/projects/OCA-OpenStack/openstacksdk$ git log
commit 26aed4c211ec9d12b6bbc782b8589da97d3842e4 (HEAD -> master)
Author: jbeen <jeongwon.been@gmail.com>
Date:   Sun Aug 17 16:09:02 2025 +0900

    tests: Add functional test for image members

    Add a functional test for image member operations with admin and demo
    contexts covering add, list, get, update to accepted and remove.

    Change-Id: I242ea5295981b215a684ec6d39439c06fcf6f510
    Signed-off-by: jbeen <jeongwon.been@gmail.com>
jbeen@BOOK-7EAU0DUI0E:~/projects/OCA-OpenStack/openstacksdk$ git review -t functional-test
remote:
remote: Processing changes: refs: 1, new: 1
remote: Processing changes: refs: 1, new: 1
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote:   https://review.opendev.org/c/openstack/openstacksdk/+/957598 tests: Add functional test for image members [NEW]
remote:
To ssh://review.opendev.org:29418/openstack/openstacksdk.git
 * [new reference]       HEAD -> refs/for/master%topic=functional-test