반응형

1. Dictionary 안에 Dictionary 가져올 때

scheduler_hints = filter.properties.get('scheduler_hints') or {}

group = scheduler_hints.get('group', None)


or


if snapshot:

    try:

        availability_zone = snapshot['volume']['availability_zone']

    except (TypeError, KeyError):

        pass


2. Dictionary arguments 로 부터 가져올 때

execute(self, context, **kwargs):

    scheduler_hints = kwargs.pop('scheduler_hints', None)


3. exception 처리

try:

    ...

    return {

        'reservation': reservations,

    }

except exception.OverQuota as e:

    overs = e.kwargs['overs']

    quotas = e.kwargs['quoata']

    if _is_over('gigabytes'):

        msg = _(Quota exeeded for %(s_pid)s.")

        LOG.warn(msg % {'s_pid : context.project_id})

        raise exception.VolumeSizeExeedsAvailableQuota(

            requested=zise)

    elif _is_over('volumes'):

        raise exception.VolumeLimitExceeded(allowed=quotas['volumes'])

    else:

        raise


4. package 아래 특정 파일을 default 로 지정하는 방법

[ package 구조 ]

-- cinder

    -- db

        -- __init__.py

        -- api.py

        -- base.py


db 아래의 api.py 의 quota_get() function 을 호출하고자 할 때


cinder/db/__init__.py 에 다음과 같이 설정

from cinder.db.api import *


사용하고자 하는 파일에서 다음과 같이 사용

from cinder import db

...

db.quata_get()


혹은

[ package 구조 ]

-- nova

    -- virt

        -- libvirt

            -- __init__.py

            -- driver.py    (여기에 LibvirtDriver 클래스를 사용하고자 함)

            -- vif.py


nova/virt/libvirt/__init__.py 에 다음과 같이 설정

from nova.virt.libvirt import driver

LibvirtDriver = driver.LibvirtDriver


이렇게 설정하면 nova.virt.libvirt.LibvirtDriver 클래스를 읽어들어서 사용할 수 있음


5. dictionary 가 null 일 수 있을 때 null 을 회피하고 기본{} 값을 넣는 법

migrate_data = dict(migrate_data or {})


6. set 기본값 생성

block_device_mapping = set()


7. String 합치기, String 좌우 스페이스를 없애기

import_value = "%s.%s" % (name_space, import_str)

s = s.strip()


8. String 을 특정 delemeter 로 우측 string 을 구분하기, String 을 delemeter로 구분하여 List 에 담기

mod_str, _sep, class_str = import_str.rpartition('.')

flaglist = CONF.libvirt.live_migration_flag.split(',')


9. class 나 function 자체를 변수에 넣고 사용하고 싶을 때

getattr(import 모듈경로, 클래스명)   => .py 파일에 class 가 있을 때

getattr(import 모듈경로, 함수명)      => .py 파일에 def 함수가 바로 있을 때


__import__('nova.virt.libvirt')            => 모듈을 import

class_LibvirtDriver = getattr(sys.modules['nova.virt.libvirt'], 'LibvirtDriver')    +. 클래스를 로딩하여 리턴


10. xml 파싱

from lxml import etree


doc = etree.fromstring(xml)

disk_nodes = doc.findall('.//devices/disk')


11. list 를 순번과 값으로 순차적으로 가져오기

for cnt, path_node in enumerate(['a', 'b'])

print cnt

print path_node



12. list 를 Json string 으로 만들기

from nova.openstack.common from jsonutils


disk_info = []

disk_info.append({'type': 'block',

                          'path': '/dev/disk/by-path/ip-192.168.230.136:3260-iscsi-iqn.2010-10.org.openstack:volume-1000de04-6603-41d8-bae4-7bc16af0bc15-lun-1',

                          'virt_disk_size': 0,

                          'backing_file': '',

                          'over_committed_disk_size': 0})

disk_info = jsonutils.dumps(disk_info)


13. Class 를 Json String 으로 만들기

from nova.openstack.common from jsonutils


instance = jsonutils.to_primitive(instance)


14. 리스트의 내용을 조건절로 걸러내고 새로운 리스트에 담기

bdms = [bdm.legacy() for bdm in block_device_mapping if _has_legacy(bdm)]


15. 로직 중간에 새로운 쓰레드 생성하기

from eventlet import greenthread


greenthread.spawn(self._live_migration, context, instance, dest .......)


def _live_migration(self, context, instance, dest .......)


16. list 의 값을 하나의 string 으로 만들기

cmd = ('ssh', 'host')

cmd = ' '.join(cmd)






반응형
Posted by seungkyua@gmail.com
,