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 Kubernetes Korea co-leader seungkyua@gmail.com

1. RabbitMQ 의 흐름은 다음과 같다.


Producer -> Exchange -> Queue  -> Consumer

                                -> Queue


2. Exchange 의 타입

    - Direct exchange    : routing_key 로 일치하는 consumer 만 연결

    - Fan-out exchange : 모든 consumer 와 연결

    - Topic exchange    : *, # 을 사용하여 매치되는 consumer 와 연결

                                   *.stock.#   ->  us.stock(O),   eur.stock.db(O), stock.nasdaq(X)






Posted by Kubernetes Korea co-leader seungkyua@gmail.com


1. Mac 에서 python setup.py install 실행시 저장되는 경로

/Library/Python/2.7/site-packages


2. package 만들기

python setup.py sdist


3. src install

python setup.py install --record files.txt


3. src 를 pip으로 install

pip install -e .


5. src uninstall

cat files.txt | xargs rm -rf


6. pip require package install

pip install -r pip-requires


7. pip installed package list

pip freeze


8. pip package uninstall

pip uninstall package-name














Posted by Kubernetes Korea co-leader seungkyua@gmail.com

파이썬에서 eventlet 모듈로 쓰레드를 사용하고 싶다면 세가지 방법이 있습니다.


1. eventlet.tpool 을 사용

    - 가장 간단한 방법으로 eventlet.tpool.execute(function(), ...) 방식으로 쓰레드를 생성하여 호출.

      pool 을 사용하며 쓰레드 20개가 기본.

      pool 사이즈를 늘릴려면 환경변수 EVENTLET_THREADPOOL_SIZE 의 값을 변경


2. eventlet 을 사용

    - eventlet.spawn(function(), ...) 을 사용하여 쓰레드를 생성하여 호출

      리턴값으로 eventlet.greenthread.GreenThread 가 리턴됨.

      pool 을 사용할 수 없음


3. eventlet.greenpool 을 사용

    - eventlet.greenpool.GreenPool.spawn(function(), ...) 을 사용하여 쓰레드를 생성하여 호출

      리턴값으로 eventlet.greenthread.GreenThread 가 리턴됨.

      pool 사용이 가능



Posted by Kubernetes Korea co-leader seungkyua@gmail.com
python 에서 argv 를 이용하여 args 를 동적으로 추가하고자 한다면 다음과 같이 사용

1. sys.argv[1:] 를 이용
   -  main 의 프로그램명을 제외한 cli 에서 입력한 argv 가 입력됨

2.  argparse.ArgumentParser.add_argument 를 이용하여 환경설정 값을 args 로 추가
Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG args, argv, Python
1. Python 설치
    . http://www.python.org/download/ 

2. Pydev 설치
    . update site : http://pydev.org/updates
    . eclipse -> Window -> Preferences -> Interpreter-Python에서 New 에서  python.exe 의 경로를 찾아 선택

3. Python 환경변수 및 패스 설정
    . Windows
        환경변수명 : PYTHONPATH
        환경변수값 : %PYTHONPATH%;C\Python32
        패스추가    : C\Python32

    . Mac
        환경변수 추가 : export PYTHONPATH=/Library/Python/2.6

Posted by Kubernetes Korea co-leader seungkyua@gmail.com
1. 수치형 (Numbers)
    . int, long. complex, float 
    . type : IntType, LongType, ComplexType, FloatType

2. 문자열 (Strings)
    . 문자들의 집함, 내용 변경이 안됨
    . 'spams', "ham"
    . type : StringType

3. 리스트 (Lists)
    . 순서를 가지는 객체의 집합
    . ['ham', 'spam']
    . type : ListType

4. 사전 (Dictionaries)
    . 순서를 가지지 않는 객체의 집합. 키-값(key-value) 로 저장
    . {'ham':4, 'spam':5}
    . type : DictionaryType

 5. 튜플 (Tuples)
    . 순서를 가지는 파이썬 임의 객체의 집합이다. 내용 변경이 안됨
    . ('ham', 'spam')
    . type : TupleType

5. 파일 (Files)
    . 파일에 자료를 입 출력하기 위한 객체이다.
    . f = open('ham')
    . type : FileType

6. None
    . null 을 의미
    . type : NoneType





Posted by Kubernetes Korea co-leader seungkyua@gmail.com