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)