반응형

[ Ubuntu 12.04 LTS 에서 관련 라이브러리 설치 ]

$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install build-essential openssl libssl-dev pkg-config


패키지로 설치되어 있는 Nodejs 먼저 제거하기

$ sudo apt-get purge nodejs

$ sudo apt-get autoremove



시스템 전역으로 설치하기 ]

1. source tarball 을 다운받아 설치한다.

http://nodejs.org/dist/ 에서 최신 버전인 node-v0.10.26.tar.gz 을 다운받는다.

$ mkdir Node

$ cd Node

$ wget http://nodejs.org/dist/v0.10.26/node-v0.10.26.tar.gz

$ tar -zxf node-v0.10.26.tar.gz

$ cd node-v0.10.26.tar.gz


$ ./configure            # 다른 디렉토리에 설치하고 싶으면 ./configure --prefix=경로

$ make

$ sudo make install


삭제하고 싶으면

$ sudo make uninstall



2. binary tarball 을 다운받아 설치한다.

http://nodejs.org/dist/latest/ 에서 최신 버전인 node-v0.10.26-linux-x64.tar.gz 을 다운받는다.

/usr/local 아래의 bin, include, lib 등의 디렉토리에 node 관련 파일들을 복사한다.

$ mkdir Node

$ cd Node

$ wget http://nodejs.org/dist/latest/node-v0.10.26-linux-x64.tar.gz

$ tar -zxf node-v0.10.26-linux-x64.tar.gz

$ cd /usr/local

$ sudo tar --strip-components 1 -xzf ~/Node/node-v0.10.26-linux-x64.tar.gz



로컬 설치하기 ]

nvm (Node Version Manager) 를 이용하여 설치한다.


/home/stack/.nvm/v0.10.26 에 설치됨

/home/stack/.profile 파일 맨 마지막에 nvm.sh 명령을 사용할 수 있게 추가됨

$ wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh

$ . /home/stack/.profile

$ nvm install v0.10.26                 # Node v0.10.26 버전을 설치

$ nvm run v0.10.26                    # Node v0.10.26 버전을 사용

$ nvm ls                                  # Node 설치버전 리스트 조회 및 현재 사용하는 버전 조회



[ Mac 에 brew 로 설치하기 ]

# xcode 설치

# homebrew 설치

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


$ brew install node --without-npm

$ vi .bash_profile

export PATH=/usr/local/Cellar/node/5.6.0/bin:$PATH


# npm 설치

$ curl -L https://www.npmjs.com/install.sh | sh



[ npm으로 관련 모듈 설치하기 ]

- 전역 영역에 설치하기 (-g 옵션 사용)

$ npm -g install <모듈명>


- 특정 버전을 설치하기 (0.1 버전)

$ npm -g install <모듈명>@0.1


- 전역 영역에 설치된 모듈 삭제하기

$ npm -g uninstall <모듈명>


- 전체 모듈 업데이트 하기

$ npm update


- 단일 모듈만 업데이트하기

$ npm update <모듈명>


- 최신 버전이 아닌 패키지가 있는지 확인만 하고 싶을 경우

$ npm outdated


- 설치된 모듈 종속 관계 보기

$ npm ls ll





반응형
Posted by seungkyua@gmail.com
,
반응형

1. Django 설치하기

$ sudo apt-get install python-django

$ django-admin.py --version


2. Django 프로젝트 만들기

$ django-admin.py startproject django_example


3. Database 연동

$ vi django_example/settings.py


 12 DATABASES = {

 13     'default': {

 14         'ENGINE': ''django.db.backends.sqlite3',

 15         'NAME': 'exampledb',

 16         'USER': '',

 18         'PASSWORD': '',

 19         'HOST': '',

 20         'PORT': '',

 21     }

 22 }


$ python manage.py syncdb


4. 서버 실행

- 서버는 기본으로 8000 번 포트로 실행되므로 포트를 생략할 수 있다.

   $ python manage.py runserver <8000>


5. 프로젝트 만들기

$ python manage.py startapp example


6. view 작성

$ vi example/views.py


  1 # -*- coding: utf-8 -*-      (다국어 표현을 위한 주석)

  2

  3 # Create your views here.

  4 from django.http import HttpResponse

  5

  6 def main_page(request):

  7     output = '''

  8         <html>

  9         <head><title>%s</title></head>

 10         <body>

 11             <h1>%s</h1>

 12         </body>

 13         </html>

 14     ''' % (

 15         'Django Example',

 16         'Hello World !!'

 17     )

 18     return HttpResponse(output)


7. URL 과 view 매핑

$ vi django_example/urls.py


  1 from django.conf.urls import patterns, include, url

  2 from example.views import *

  3

  4 urlpatterns = patterns('',

  6     (r'^$', main_page),

  7 )


8. Model 만들기

- Model 에서 사용하는 Field type

   IntegerField

   TextField

   CharField

   DateTimeField

   EmailField

   URLField

   FileField


- Department 모델 만들기

   $ vi example/models.py


  1 from django.contrib.auth.models import User

  2 from django.db import models

  3

  4 class Department(models.Model):

  5     department_name = models.TextField()

  6     user = models.ForeignKey(User)


- settings 파일에 INSTALLED_APPS 에 APP 을 등록하여 model 활성화

   $ vi django_example/settings.py


116 INSTALLED_APPS = (

117     'django.contrib.auth',

118     'django.contrib.contenttypes',

119     'django.contrib.sessions',

120     'django.contrib.sites',

121     'django.contrib.messages',

122     'django.contrib.staticfiles',

123     'example',

128 )


- Model DB 테이블 생성

   $ python manage.py syncdb


- DDL 문 SQL 확인

   $ python manage.py sql example


- Data 저장 및 확인

   $ python manage.py shell


>>> from example.models import *

>>> from django.contrib.auth.models import User

>>> User.objects.all()


>>> user = User.objects.get(id=1)

>>> print user

>>> dir(user)


>>> department1 = Department(department_name='Cloud Team', user=user)

>>> department1.save()


9. Template 만들기

- template 디렉토리 지정하기

   $ mkdir -p templates

   $ vi django_example/settings.py


  3 import os.path

     ...

112 TEMPLATE_DIRS = (

113     os.path.join(os.path.dirname(__file__), '../templates'),

114 )


- template 파일 만들기

   $ vi templates/main_page.html


  1 <html>

  2 <head><title>{{ title }}</title></head>

  3 <body>

  4     <h1>{{ greeting }}</h1>

  5 </body>

  6 </html>


- view 파일 수정

   $ vi example/views.py


  1 # -*- coding: utf-8 -*-

  2

  3 from django.http import HttpResponse

  4 from django.template import Context

  5 from django.template.loader import get_template

  6

  7 def main_page(request):

  8     template = get_template('main_page.html')

  9     variables = Context({

 10         'title': 'My Example',

 11         'greeting': 'Hello Stephen !!',

 12     })

 13     output = template.render(variables)

 14     return HttpResponse(output)


10. 복잡한 화면 만들기

- url 을 user/username 형식으로 매핑 (username 은 stack 이라는 user 명을 사용)

   $ vi django_example/urls.py


  8 urlpatterns = patterns('',

  9     (r'^$', main_page),

 10     (r'^user/(\w+)/$', user_page),

 11 )


- view 를 수정

   $ vi example/views.py


  3 from django.contrib.auth.models import User

  4 from django.http import Http404


 18 def user_page(request, username):

 19     try:

 20         user = User.objects.get(username=username)

 21     except:

 22         raise Http404('Cant not found user')

 23

 24     dept = user.department_set.all()

 25

 26     template = get_template('user_page.html')

 27     variables = Context({

 28         'username': username,

 29         'department': dept,

 30     })

 31     output = template.render(variables)

 32     return HttpResponse(output)


- page 생성

   $ vi templates/user_page.html


  1 <html>

  2 <head><title>User: {{ username }}</title></head>

  3 <body>

  4     <h1>{{ username }}'s Department</h1>

  5     {% if department %}

  6         <ul>

  7             {% for dept in department %}

  8                 <li>{{ dept.department_name }}</li>

  9             {% endfor %}

 10         </ul>

 11     {% else %}

 12         <p>There's is no department</p>

 13     {% endif %}

 14 </body>

 15 </html>





반응형
Posted by seungkyua@gmail.com
,
반응형

1. git 에서 제일 큰 파일사이즈 찾아내서 없애기

$ git count-objects -v    (size-pack 항목이 Packfile 의 크기임)

$ git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3  (3번째 항목이 파일 크기임)

$ git rev-list --objects --all | grep 7a9eb2fb   (blob(파일)의 이름을 찾는다)

$ git log --pretty=oneline -- git.tbz2   (git.tbz2 파일의 커밋을 찾는다.)

$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch git.tbz2' 6df7640^..  (6df76 이후의 커밋을 모두 재작성 된다)

$ rm -Rf .git/refs/original   (filter-branch 실행의 상태를 삭제)

$ rm -Rf .git/logs/     (Reflog 삭제)

$ git gc


2. 데이터 복구

$ git log --pretty=oneline

$ git reset --hard 1a410e   (이전 커밋으로 복구)

$ git log -g   혹은   git reflog    (HEAD 가 바뀔 때 마다 저장된 기록을 확인)

$ git branch recover-branch ab1afef   (recover-branch를 만듬)

$ git log --pretty-oneline recover-branch

$ git fsck --full   (길잃은 객체를 찾아 줌,  히스토리 중 2번째 칼럼에서 commit 을 찾음)


0. Git 설정

- Windows Git 설치

   http://code.google.com/p/msysgit


- Git config 적용 순서

   1. $ git config

       .git/config

   2. $ git config --global

       ~git/.gitconfig

   3. $ git config --system

       /etc/gitconfig


- Git config 로 조회될 때 중복되어 있으면 나중에 나오는 값이 적용된다.

   $ git config --list


- config 값이 중복될 때 어떤 값이 적용되는지 볼 수 있음

   $ git config <Key이름>


- config 관련 help 보기

   $ git help config


1. 상태 변화

    ※ 신규파일이든 수정한 파일이든 모두 add 해야 한다.

       생성하거나 수정하고 나서 git add 명령으로 추가하지 않은 파일은 commit 하지 않는다.

- 신규 파일을 생성한 경우 : Untracked (Untracked files)

- 신규 파일을 add 한 경우 : Untracked -> Tracked and Staged (Changed to be committed)

   $ git add <file or directory>


- 기존 파일을 수정한 경우 : Tracked and Unstage (Changed but not updated)

- 기존 수정된 파일을 add 한 경우 : Tracked and Unstage -> Staged (Changed to be committed)

   $ git add <file or directory>


- 상태의 변화

   (Untracked : 신규)              (Tracked)

   (Tracked    : 수정)              (Tracked)

    Unstage               -->         Staged          -->         Committed         -->        Remote Repository

                           (git add)                  (git commit)                      (git push)

 

2. 상태 변경 내용 보기

- Staged 와 Unstage (워킹 디렉토리) 상태의 변경 내용 보기

   $ git diff


- Staged 와 Committed (저장소) 상태의 변경 내용 보기

   $ git diff --staged


3. Staged 상태 커밋하기

$ git commit


4. Staging Area 파일 삭제하기

- 워킹디렉토리 파일을 삭제하고 Staged 파일을 삭제한다.

   $ rm <file>

   $ git rm <file>


- Staged 와 워킹 디렉토리 파일 모두 삭제한다.

  $ git rm <file or directory>


- Staged 파일은 삭제하고 워킹 디렉토리 파일은 남겨둔다.

   $ git rm --staged(or cached) <file or directory>


5. 커밋 히스토리 조회하기

- log는 히스토리를 보여주며 -p는 diff 결과를 보여주고 -2는 최근 두 개의 결과만 보여준다

   $ git log -p -2


- since 나 until 을 사용할 수 있다.

   $ git log --since=2.weeks

   $ git log --since="2013-01-01"


- author 나 grep 을 사용할 수 있다.

   $ git log --author="stephen" --grep="local storage"


- 로그를 옵션으로 볼 수 있다.

   $ git log --pretty=oneline (short, full, fuller)


- 로그를 특정 포맷으로 볼 수 있다. (h:hash, an: author name, ad: author date, s: subject)

   $ git log --pretty=format:"%h %s" --graph


- 수정한 파일, 추가된 줄, 삭제된 줄만 표시

   $ git log --shortstat


- 수정된 파일의 목록과 파일을 추가한 것인지, 수정한 것인지, 삭제한 것인지 보여준다

   $ git log --name-status


- HEAD 가 가리켰던 커밋을 조회하기

   $ git reflog

   $ git log -g master


- master 에는 없지만 local-storage 에는 있는 커밋 조회

   $ git log master..local-storage


- 리모트 저장소 master 에는 없고 현재의 브랜치에만 있는 커밋

   $ git log origin/master..HEAD


- git log graph 로 보기

   $ vi ~/.gitconfig


[alias]

lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)\

%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)\

- %an%C(reset)%C(bold yellow)%d%C(reset)' --all

lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)\

%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)\

%C(bold yellow)%d%C(reset)%n''          %C(white)%s%C(reset) %C(dim white)\

- %an%C(reset)' --all

lg = !"git lg1"


6. 되돌리기

- 커밋 한 후 빠진 파일을 다시 포함시키거나, 커밋 메세지를 수정할 때, 커밋을 합치고 싶을 때 마지막 커밋으로 모두 덮어쓴다.

   $ git commit --amend


- Staged 상태 파일을 Unstage (워킹 디렉토리에만 수정된 상태)로 되돌리기

   $ git reset HEAD <file>


- Unstage (워킹 디렉토리에만 수정된 상태)를 Commit (저장소)와 동일한 초기 상태로 되돌리기

   $ git checkout -- <file>


- 커밋을 취소하기 

   $ git reset HEAD^            최종 커밋을 취소, 워킹 디렉토리를 보존

   $ git reset HEAD~2          마지막 2개의 커밋을 취소, 워킹 디렉토리를 보존

   $ git reset --hard HEAD~2 마지막 2개의 커밋을 취소, 워킹 디렉토리와 Staged 모두 취소

   $ git reset --hard ORIG_HEAD    머지한 것을 커밋했을 때 취소

   $ git revert HEAD        커밋을 push 했을 때 HEAD에 변경한 내용을 취소하는 커밋 추가 


7. 리모트 저장소

- 리모트 저장소 리스트 보기, Clone 으로 가져온 저장소의 이름은 origin 으로 자동으로 붙혀진다.

   $ git remote -v


- 리모트 저장소 추가하기

   $ git remote add <리모드 저장소 별명> <URL>


- 리모트 저장소의 브랜치 포인터를 로컬로 가져오기

   fetch 는 실제 데이터를 가져오는 것이 아니라 리모트 브랜치에 대한 모든 정보를 가져와 포인터가 생기는 것

   $ git fetch <리모트 저장소 별명>


- 리모트 저장소 Branch 의 데이터를 가져와서 자동으로 로컬에 머지하기

   $ git pull <리모트 저장소 별명> <리모트 브랜치 이름>:<로컬 브랜치 이름>


- 리모트 저장소에 브랜치 데이터를 올리기

   $ git push <리모트 저장소 별명> <로컬 브랜치 이름>:<리모트 저장소 브랜치 이름>

   $ git push


- 로컬의 local-storage 브랜치를 리모트 저장소 origin 에 storage 브랜치라는 이름으로 올리기

   $ git push origin local-storage:storage


- 리모트 저장소 상세보기

   push 할 때 와 pull 할 때 어떤 브랜치로 작동하는지 보여준다.

   $ git remote show <리모트 저장소 별명>


- 리모트 저장소 이름 바꾸기

   $ git remote rename <현재 이름> <바꿀 이름>


- 리모트 저장소 삭제하기

   $ git remote rm <리모트 저장소 별명>


8. 태그

- 태그 조회하기

   $ git tag


- 1.x 버전의 태그를 조회하기

   $ git tag -l '1.*'


- 태그 1.1 붙히기

   $ git tag 1.1


- 특정 commit 에 대해서 태그 붙히기

   $ git tag -a 1.1 <체크섬>


- 리모트 저장소에 태그 데이터 올리기

   $ git push <리모트 저장소 별명> <태그 이름>


- 리모트 저장소에 모든 태그를 올리기

   $ git push <리모트 저장소 별명> --tags


9. 브랜치

- HEAD 는 현재 작업하는 로컬 branch 를 가리키는 포인터


- 브랜치 생성하기

   $ git branch local-storage


- 생성한 브랜치로 이동하기

   $ git checkout local-storage


- 브랜치를 만들고 생성한 브랜치로 이동하기

   $ git checkout -b local-storage


- checkout 으로 브랜치를 바꾸면 워킹 디렉토리의 파일들을 추가, 삭제, 수정하여 이전 스냅샷으로 돌린다.


- 브랜치 삭제하기 (Merge 하지 않은 브랜치는 삭제되지 않음)

   $ git branch -d local-storage


- 브랜치 삭제하기 (Merge 하지 않은 브랜치도 강제로 삭제하기)

   $ git branch -D local-storage


- 브랜치 리스트 조회하기

   $ git branch


- 브랜치 리스트에 마지막 커밋 메세지까지 조회하기

   $ git branch -v


- 현재의 브랜치에 Merge 하지 않은 브랜치 보기

   $ git branch --no-merged


- 리모트 저장소의 브랜치를 로컬 브랜치로 Tracking 하여 생성하기 (둘 중 하나를 사용)

   $ git checkout -b local-storage origin/local-storage

   $ git checkout --track origin/local-storage


- 리모트 브랜치 삭제하기 (리모트의 local-storage 라는 브랜치 삭제)

   $ git push origin :local-storage


9. Merge 하기

- Merge 하기 위해서는 중심이 되는 브랜치로 이동 후 합친다. (여기서 master 에 local-storage를 합치기)

   $ git checkout master

   $ git merge local-storage


- 리모트 저장소의 브랜치를 로컬의 현재 브랜치에 합치기 (여기서는 master 에 리모트 local-storage를 합치기)

   $ git checkout master

   $ git merge origin/local-storage


- Merge 시 Conflict 발생하면 상태를 확인

   $ git status


- 리모트 저장소의 master 가 수정되었을 때 로컬 master 와 Merge 하기

   $ git fetch origin

   $ git merge origin/master


- 브랜치 (local-storage)를 만든 후 리모트 저장소의 master 가 변경되고, 브랜치에서 개발 한 후 리모트 master 와 브랜치 commit 차이를 보고 Merge 하기 ( Merge 는 브랜치든 master든 둘 중 아무거나 먼저한다.)

   $ git fetch origin

   $ git log --no-merges origin/master ^local-storage


   $ git checkout master

   $ git merge local-storage

   $ git merge origin/master 


10. Rebase 하기

      ※ 리모트 저장소에 Push 한 내용을 Rebase 하면 안된다.

- Rebase 하기 위해서는 개발한 브랜치로 이동 후 중심이 되는 브랜치로 rebase 한다.

  (여기서는 local-branch 에서 개발하는 중간에 master 에 최신 내용들을 local-branch 에 합친다)

   $ git checkout local-branch

   $ git rebase master


- Master 에서 브랜치 (local-storage)를 만들고, 또 여기서 추가로 브랜치 (storage)를 만들어 storage 브랜치를 먼저 rebase 하고 local-storage 를 rebase 한다.

   $ git rebase --onto master local-storage storage

   $ git checkout master

   $ git merge storage


   $ git rebase master local-storage

   $ git checkout master

   $ git merge local-storage








반응형
Posted by seungkyua@gmail.com
,
반응형

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
,
반응형

[ 사전 준비 ]

openstack.org 에 open id 로 접속

review.openstack.org 의 settings 에서 등록해야 할 내용

1. Profile >> Username

      - gerrit review 시에 등록할 username 값

    Profile >> Full Name, Email Address

      - git config 에 등록할 user.name, user.email 값

2. SSH Public Keys

    -> ssh public keys 를 등록

3. Agreements

    -> Contributor Agreement 등록


# clone a project (nova)
git clone git://github.com/openstack/nova.git

-> DevStack 으로 설치했다면 /opt/stack/nova 에 git 으로 clone 되어 있음

# port 확인 (브라우저에서 확인)
https://review.openstack.org/ssh_info

# Testing Gerrit Connections
ssh -p 29418 StephenAhn@review.openstack.org

# Setting username
git config --global --add gitreview.username "StephenAhn"

# gerrit 단축 경로 저장
vi ~/.ssh/config
Host review
  Hostname review.openstack.org
  Port 29418
  User StephenAhn

# gerrit remote 확인 및 change-id 자동 세팅 설정
git review -s

# gerrit remote 확인 시 에러나면 remote 추가
git remote add gerrit ssh://StephenAhn@review.openstack.org:29418/openstack/nova.git

# 최신 소스로 다운받기 (DevStack 의 경우 /opt/stack/nova 디렉토리에서)
git remote update
git checkout master
git pull --ff-only origin master

# blueprint 채널 생성 (blueprint 명이 local-storage-volume-scheduling 임)
git checkout -b bp/local-storage-volume-scheduling

# .mailmap 에 본인 email 추가 (여러 개의 이메일도 가능)
vi .mailmap
    <skanddh@gmail.com> <xxx@xxx.com>

# commit message 입력
git commit --amend

첫번째 라인은 50자 이내로 간단히 요약을 쓴다.
[공백라인]
설명을 적되 라인은 72자가 넘어가면 다음 라인에 쓴다.
.....

Add volume retype to Cinder client.
Cinder code: https://review.openstack.org/#/c/44881/

DocImpact
Implements: blueprint local-storage-volume-scheduling

Change-Id 는 자동으로 지정되므로 적지 않는다.

[ Commit message에 추가해야 할 내용 ]
DocImpact             -> 도큐먼트가 바껴야 할 때 넣음
SecurityImpact      -> 보안 문제가 있으니 OpenStack Secrurity Group 에서 
                                review해야 할 때 넣음
UpgradeImpact      -> 업그레이드에 영향을 미치는 경우 넣음
                                 (release notes 의 'Upgrade Notes' section 수정을 고려)

# git review 등록 (샘플 이외에 셋 중 아무거나 쓰면 됨)
# 샘플 양식
git push ssh://StephenAhn@review.openstack.org:29418/<Project Name> HEAD:refs/for/<Branch Name>

git push ssh://StephenAhn@review.openstack.org:29418/openstack/cinder HEAD:refs/for/bp/local-storage-volume-scheduling
git push review:openstack/cinder HEAD:refs/for/bp/local-storage-volume-scheduling
git review


[ unit test 수행을 위한 패키지 다운로드 ]
sudo apt-get install python-dev libssl-dev python-pip git-core libmysqlclient-dev libpq-dev
sudo apt-get install libxml2-dev libxslt-dev libvirt-dev
sudo apt-get install python-virtualenv testrepository

[ nova unit test ]
cd /opt/stack/nova
./run_tests.sh

# pep8 코딩 표준 테스트
./run_tests.sh -p

# netaddr>=0.7.6 에서 에러 발생 시
$ source .venv/bin/activate
$ wget https://github.com/downloads/drkjam/netaddr/netaddr-0.7.9.zip
$ unzip netaddr-0.7.9.zip
$ cd netaddr-0.7.9
$ python setup.py install

# ubuntu 12.04 에서 libvirt-python 1.2.5 설치 시 에러
ubuntu 12.04 에서는 libvirt 0.9.8 이 기본이므로 libvirt 1.2.0 으로 업그레이드 해야함
$ sudo apt-get update
sudo apt-get -y install \
    gcc \
    make \
    pkg-config \
    libxml2-dev \
    libgnutls-dev \
    libdevmapper-dev \
    libcurl4-gnutls-dev \
    python-dev \
    libpciaccess-dev \
    libxen-dev \
    libyajl-dev \
    libnl-dev

sudo mkdir -p /opt/libvirt
$ sudo chmod 00755 /opt/libvirt
$ sudo chown root:root /opt/libvirt
$ sudo chmod a+w /opt/libvirt
$ cd /opt/libvirt
$ wget http://libvirt.org/sources/libvirt-1.2.0.tar.gz
$ tar xzvf libvirt-1.2.0.tar.gz
$ mv libvirt-1.2.0 libvirt
$ cd libvirt
./configure \
    --prefix=/usr \
    --localstatedir=/var \
    --sysconfdir=/etc \
    --with-esx=yes \
    --with-xen=yes
$ make -j
$ sudo make install

$ ./run_tests.sh


# git review 시 권한이 없다는 메세지가 올 때 해결방법
git review

"fatal: ICLA contributor agreement requires current contact information.
Please review your contact information:
  https://review.openstack.org/#/settings/contact

fatal: The remote end hung up unexpectedly"

1. https://review.openstack.org/#/settings/contact 사이트에 접속
2. Contack information 중 아래의 Mailing Address Country, Phone Number, Fax Number 입력
3. "Contact information last updated on 날짜." 가 중간에 보이면 정상적으로 처리되었음
4. git review 실행




반응형
Posted by seungkyua@gmail.com
,
반응형

1. Linux 의 경우 커널에 포함되어 있는 kvm-clock 을 사용하여 Host 머신과 동기화


2. Windows 의 경우 kvm-clock 이 제공되지 않으므로 다음 두가지를 활용하여 동기화

     - RTC (Real Time Clock)

        bcdedit /set {default} USEPLATFORMCLOCK on


        <clock offset='localtime'>

            <timer name='rtc' tickpolicy='catchup' track='guest'/>
            <timer name='pit' tickpolicy='delay'/>
            <timer name='hpet' present='no'/>
         </clock>


     - TSC(Time Stamp Counter)


반응형
Posted by seungkyua@gmail.com
,
반응형

마우이는 크게

  1. 몰로니키 스노쿨링
  2. 라하이나
  3. 할레아칼라 일출
  4. 블랙락 및 여러 해변 or 호텔 수영장 놀이. 정도 되겠습니다.

오하우는

  1. 섬일주(사우스 쇼어, 노스 쇼어 각 포인트 투어)
  2. 레져(해양스포츠)
  3. 와이키키 등 해변 해수욕
  4. 쿠알로아 목장 레져(승마, ATV 등)
  5. 하나우마베이 스노쿨링
  6. 다이아몬드헤드 트레킹, 코코헤드 트레킹, 마카푸우 등대 트레킹
  7. 와이켈레 프리미엄 아울렛, 알라모아나 쇼핑센터 쇼핑투어



1. 바다 카약 투어

    http://www.kailuasailboards.com/


2. 해양 파크

   http://www.sealifeparkhawaii.com/directions.asp


3. Hanauma Bay

    06:00 ~ 19:00  화요일 휴무


(노스쇼어)

4. 바다거북 해변 Laniakea Beach


반응형
Posted by seungkyua@gmail.com
,
반응형

DevOn 2013 에서 OpenStack 에 관한 발표자료입니다.


OpenStack-Overview.pdf



반응형
Posted by seungkyua@gmail.com
,
반응형
DevStack 으로 neutron 포함 설치시 방법을 공유합니다.

OS 는 Ubuntu Desktop 12.04 LTS 버전입니다.

* 최신 2014 2월 trunk 버전에서는 nova/virt/libvirt/driver.py 에서 python-libvirt 1.0.2+ 이상만 지원하므로 에러가 발생합니다. 
Ubuntu 최신 버전을 설치하세요. 

네트워크 세팅은 다음과 같습니다.

[ Single Node or Multi Node 의 경우 Controller Node 와 Compute Node 역활을 함 ]
eth0 : NAT type         192.168.75.136       Public Network
eth1 : Host-only type 192.168.230.136     Private Network

[ Multi Node 의 경우 두번째 추가 Compute Node ]
eth0 : NAT type         192.168.75.137       Public Network
eth1 : Host-only type 192.168.230.137     Private Network

[ User 선택 ]
stack 유저로 생성

[ visudo 세팅 ]
stack   ALL=(ALL:ALL) NOPASSWD:ALL

[ vi /etc/network/interfaces ]
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.75.136
        netmask 255.255.255.0
        gateway 192.168.75.2
        dns-nameservers 8.8.8.8 8.8.4.4

auto eth1
iface eth1 inet static
        address 192.168.230.136
        netmask 255.255.255.0

[ network-manager 제거 ]
sudo apt-get purge network-manager
sudo apt-get autoremove
sudo /etc/init.d/networking restart

[ proxy 사용 -> proxy 세팅 ]
sudo vi /etc/apt/apt.conf
Acquire::http::proxy "http://xx.xx.xx.xx:8080/";
Acquire::https::proxy "https://xx.xx.xx.xx:8080/";

sudo vi /etc/environment
http_proxy="http://xx.xx.xx.xx:8080/"
https_proxy="https://xx.xx.xx.xx:8080/"
no_proxy="ubuntu,localhost,127.0.0.1,192.168.75.136,192.168.230.136"

[ python import 오류 해결 ]
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

[ git 설치 및 user 세팅, proxy 사용 -> proxy 세팅 ]
sudo apt-get -y install git git-review

git config --global user.name "Stephen Ahn"
git config --global user.email "skanddh@gmail.com"
git config --global http.proxy http://xx.xx.xx.xx:8080
git config --global https.proxy https://xx.xx.xx.xx:8080
git config --list

[ remove dmidecode ]
sudo apt-get install libvirt-bin
sudo apt-get purge dmidecode
kill -9 [dmidecode process]
sudo apt-get autoremove

[ delete default virtual bridge ]
root 로 로그인하여 실행
virsh net-destroy default
virsh net-undefine default

[ Proxy 사용 -> curl 세팅 ]
curl 사용을 위해 crt 파일을 복사하고 xxx.cert 파일을 선택
cp xxx.crt  /usr/share/ca-certificates/extra
dpkg-reconfigure ca-certificates

[ Proxy 사용 -> ~/.pip/pip.conf 세팅 ]
[global]
cert = /usr/share/ca-certificates/extra/xxx.crt
index-url = http://pypi.gocept.com/simple/

[ DevStack clone ]
git clone https://github.com/openstack-dev/devstack.git

[ vi  lib/neutron_plugins/ovs_base ]
gre port 나 patch port 가 생성이 안된다는 q-agt 에러가 발생하면 Kernel 3.5.x-xx-generic 과 openvswitch 1.4.0 호환이 안되는 것이므로 다음과 같이 조치
openvswitch-datapath-dkms 대신 openvswitch-datapath-lts-raring-dkms 를 설치
 41  install_package make fakeroot dkms openvswitch-switch openvswitch-datapath-lts-raring-dkms linux-headers-$kernel_version

[ vi localrc ]
# Devstack localrc for Quantum all in one
# default
HOST_IP=192.168.230.136
SERVICE_HOST=192.168.230.136

# Compute 을 여러대 설치
MULTI_HOST=True

# Private subnet
FIXED_RANGE=10.0.0.0/24

# Nova-network service
#enable_service n-net
#FIXED_NETWORK_SIZE=256
#FLOATING_RANGE=192.168.75.192/26
#FLAT_INTERFACE=eth1
#PUBLIC_INTERFACE=eth0

# Neutron External subnet
NETWORK_GATEWAY=10.0.0.1
FLOATING_RANGE=192.168.75.0/24
PUBLIC_NETWORK_GATEWAY=192.168.75.2
Q_FLOATING_ALLOCATION_POOL=start=192.168.75.193,end=192.168.75.254

# Neutron configuration
Q_PLUGIN=ml2
Q_ML2_PLUGIN_TYPE_DRIVERS=local,flat,vlan,gre,vxlan
Q_ML2_TENANT_NETWORK_TYPE=vxlan
Q_ML2_PLUGIN_VXLAN_TYPE_OPTIONS=(vni_ranges=1001:2000)
Q_AGENT_EXTRA_AGENT_OPTS=(tunnel_types=vxlan vxlan_udp_port=8472)
Q_AGENT_EXTRA_SRV_OPTS=(local_ip=$HOST_IP)
#Q_AGENT=openvswitch
Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch,linuxbridge,l2population
Q_USE_NAMESPACE=True
Q_USE_SECGROUP=True

# Nova service
enable_service n-api
enable_service n-crt
enable_service n-obj
enable_service n-cpu
enable_service n-cond
enable_service n-sch
enable_service n-novnc
enable_service n-cauth

# Cinder service
enable_service cinder
enable_service c-api
enable_service c-vol
enable_service c-sch
enable_service c-bak

# Tempest service
enable_service tempest

# Neutron service
disable_service n-net
enable_service neutron
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service q-lbaas

# Controller Node
Q_HOST=$SERVICE_HOST

# vnc
VNCSERVER_LISTEN=0.0.0.0
VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

# logs
DEST=/opt/stack
LOGFILE=$DEST/logs/stack.sh.log
SCREEN_LOGDIR=$DEST/logs/screen

# system password
ADMIN_PASSWORD=패스워드
MYSQL_PASSWORD=패스워드
RABBIT_PASSWORD=패스워드
SERVICE_PASSWORD=패스워드
SERVICE_TOKEN=admin

# Cinder configuration
VOLUME_GROUP="cinder-volumes"
VOLUME_NAME_PREFIX="volume-"

# Heat service
enable_service heat
enable_service h-api
enable_service h-api-cfn
enable_service h-api-cw
enable_service h-eng

# Murano service
enable_service murano
enable_service murano-api
enable_service murano-engine

# Ceilometer service
CEILOMETER_BACKEND=mongo
CEILOMETER_NOTIFICATION_TOPICS=notifications,profiler
enable_service ceilometer
enable_service ceilometer-acompute
enable_service ceilometer-acentral
enable_service ceilometer-collector
enable_service ceilometer-api
enable_service ceilometer-alarm-evaluator
enable_service ceilometer-alarm-notifier

# Swift service
enable_service s-proxy
enable_service s-object
enable_service s-container
enable_service s-account

# Trove service
enable_service trove
enable_service tr-api
enable_service tr-tmgr
enable_service tr-cond

# Images
# Use this image when creating test instances
IMAGE_URLS+=",http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img"
# Use this image when working with Orchestration (Heat)
IMAGE_URLS+=",https://download.fedoraproject.org/pub/fedora/linux/releases/23/Cloud/x86_64/Images/Fedora-Cloud-Base-23-20151030.x86_64.qcow2"

KEYSTONE_CATALOG_BACKEND=sql
API_RATE_LIMIT=False
SWIFT_HASH=testing
SWIFT_REPLICAS=1
VOLUME_BACKING_FILE_SIZE=70000M

#scheduler
SCHEDULER=nova.scheduler.filter_scheduler.FilterScheduler

# A clean install every time
#RECLONE=yes


[ Multi Node Compute 세팅 방법 ]
# vi localrc
HOST_IP=192.168.230.137
SERVICE_HOST=192.168.230.136

# Compute 을 여러대 설치
MULTI_HOST=True

# Neutron configuration
Q_PLUGIN=ml2
Q_ML2_PLUGIN_TYPE_DRIVERS=local,flat,vlan,gre,vxlan
Q_ML2_TENANT_NETWORK_TYPE=vxlan
Q_ML2_PLUGIN_VXLAN_TYPE_OPTIONS=(vni_ranges=1001:2000)
Q_AGENT_EXTRA_AGENT_OPTS=(tunnel_types=vxlan vxlan_udp_port=8472)
Q_AGENT_EXTRA_SRV_OPTS=(local_ip=$HOST_IP)
#Q_AGENT=openvswitch
Q_ML2_PLUGIN_MECHANISM_DRIVERS=openvswitch,linuxbridge,l2population
Q_USE_NAMESPACE=True
Q_USE_SECGROUP=True

# RabbitMQ, Compute
disable_all_services
enable_service rabbit
enable_service n-cpu
enable_service n-novnc

Nova-network Service
#enable_service n-net
#FIXED_RANGE=10.0.0.0/24
#FIXED_NETWORK_SIZE=256
#FLOATING_RANGE=192.168.75.192/26
#FLAT_INTERFACE=eth0
#PUBLIC_INTERFACE=eth0

Neutron L2 Service
enable_service neutron
enable_service q-agt

# Cinder service
enable_service cinder

# Cinder configuration
#enable_service c-vol
#VOLUME_GROUP="cinder-volumes"
#VOLUME_NAME_PREFIX="volume-"

# Controller Node
Q_HOST=$SERVICE_HOST
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST

# vnc
VNCSERVER_LISTEN=0.0.0.0
VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP

# logs
DEST=/opt/stack
LOGFILE=$DEST/logs/stack.sh.log
SCREEN_LOGDIR=$DEST/logs/screen

# system password
MYSQL_PASSWORD=패스워드
RABBIT_PASSWORD=패스워드

# A clean install every time
#RECLONE=yes

# vi /etc/nova/nova.conf 수정
neutron_admin_password = 패스워드
sql_connection = mysql://root:패스워드@192.168.230.136/nova?charset=utf8

# vi /etc/cinder/cinder.conf 수정
sql_connection = mysql://root:패스워드@192.168.230.136/cinder?charset=utf8
my_ip = 192.168.230.137




[ Murano 설치 ]
$ git clone git://git.openstack.org/openstack/murano
$ cd murano/contrib/devstack
$ cp lib/murano ${DEVSTACK_DIR}/lib
$ cp lib/murano-dashboard ${DEVSTACK_DIR}/lib
$ cp extras.d/70-murano.sh ${DEVSTACK_DIR}/extras.d


[ Heat OSprofiler enabled ]
$ echo -e "[profiler]\nprofiler_enabled = True\ntrace_sqlalchemy = True\n" >> /etc/heat/heat.conf

$ heat --profile SECRET_KEY stack-list
# it will print <Trace ID>

osprofiler trace show --html <Trace ID>


[ vi  localrc ]
git 프로토콜로 다운로드가 안될 경우 http 로 변경
GIT_BASE=http://git.openstack.org

[ devstack 설치 ]
./stack.sh


[ tempest 에러 시 해결 ]
$ wget https://pymox.googlecode.com/files/mox-0.5.3.tar.gz
$ tar xvf mox-0.5.3.tar.gz
$ cd mox-0.5.3
$ sudo python setup.py install

$ vi ~/.pydistutils.cfg
[easy_install]
index_url =  http://mirror.dfw.rax.openstack.org/pypi/simple
allow_hosts = *.openstack.org




[ public 연결 세팅 - Neutron ]
br-ex 에 gateway 192.168.75.2 가 추가되어 public ip 통신이 안되므로 삭제
VM과 외부 external 을 연결할려면 add-port 를 수행, 단 이렇게 하면 host 에서 외부연결이 안됨
sudo ip link set up br-int
sudo ip link set up br-tun
sudo ip addr del 192.168.75.2/24 dev br-ex
sudo ovs-vsctl add-port br-ex eth0
#ifconfig br-ex promisc up

[ host 와 인터넷 연결 세팅 - Neutron ]
host 에서 인터넷 연결을 할려면 del-port 를 수행
sudo ovs-vsctl del-port eth0

[ public 연결 세팅 - nova-network ]
eth1 의 host-only 네트워크에 대한 dhcp 를 끈다. 이걸 안끄면 vm 생성 시 내부 ip 가 192.168.230.x 대역을 받음
br100 은 eth1 내부 네트워크와만 연결되어야 하므로 br100 과 eth0 연결을 끊는다.
br100 이 eth0 로 부터 가져온 외부 네트워크 ip 는 eth0 에 돌려준다.
sudo brctl show br100
sudo brctl delif br100 eth0
sudo ip addr del 192.168.75.136/24 dev br100
sudo ip addr add 192.168.75.136/24 dev eth0

[ default gateway 수정 - nova-network ]
sudo route del -net 0.0.0.0/0 gw 192.168.208.2 dev br100
sudo route add -net 0.0.0.0/0 gw 192.168.208.2 dev eth0

[ cinder.conf  수정 - 메세지 호출을 위해서 ]
notification_driver=messagingv2


[ cli 호출 ]
. openrc admin demo

[ 서비스 start ]
screen -c stack-screenrc


[ default sec group rule 추가 ]
openstack security group rule create --proto icmp --src-ip 0.0.0.0/0 --dst-port -1 --ingress 5f7fe4ab-7069-490e-b95d-946a0148e523

openstack security group rule create --proto tcp --src-ip 0.0.0.0/0 --dst-port 1:65535 --ingress 5f7fe4ab-7069-490e-b95d-946a0148e523

[ nova boot ]
nova boot --flavor m1.tiny --image 32dc6f3e-83fc-4b18-ba08-c06a28bdac38 --nic net-id=7fa105b5-fcc7-4ce9-abbe-c49b867bb0b3  --key-name magnum-key --security-groups 6b84dbca-3e20-4ce5-9774-9c3128a2eb5f test-01


sudo ip netns
qrouter-0e8971de-9119-4bed-9c70-288a0ed15581
qdhcp-7fa105b5-fcc7-4ce9-abbe-c49b867bb0b3


[ vi stopnova.sh ]
서비스를 내리기 위해서 shell 작성
#!/bin/bash

rm -rf /opt/stack/status/stack/*

cd /usr/local/bin
for i in $( ls nova-* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls cinder-* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls keystone-* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls glance-* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls heat* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls ceilometer* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls trove* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls neutron* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done

for i in $( ls ovs* )
    do sudo kill -9 `ps aux | grep -v grep | grep $i  | awk '{print $2}'`
done


[ devstack 초기화 ]
./unstack.sh
./stopnova.sh

# 컴파일 소스 초기화
cd /opt/stack
find -name "*.pyc" | xargs rm

# VM 초기화
sudo rm -rf /etc/libvirt/qemu/inst*
sudo virsh list | grep inst | awk '{print $1}' | xargs -n1 virsh destroy

# br-tun 삭제
sudo ip link set dev br-tun down
sudo ovs-vsctl del-br br-tun

# vxlan device 삭제
sudo ip link delete dev vxlan_sys_4789

./clean.sh --all (필요시)
sudo apt-get purge mysql-server  (필요시)
sudo apt-get autoremove    (필요시)


[ 설치된 패키지 지우기 ]
# cd /usr/local/lib/python2.7/dist-packages
find -depth -maxdepth 1 -name "*swift*" | xargs sudo rm -rf


[ swift 가 실행안되는 오류 해결방안 ]
해당 포트로 떠 있는 프로세스를 찾아 죽인다.
netstat -apn | grep 6011
netstat -apn | grep 6012
netstat -apn | grep 6013       swift object server


[ cinder volume 없을 경우 새로 생성 ]
$ cd /opt/stack/data

$ sudo losetup -a
$ file /opt/stack/data/cinder-volumes-lvmdriver-1-backing-file

$ dd if=/dev/zero of=cinder-volumes-lvmdriver-1-backing-file bs=1 count=0 seek=10G ( 원하는 용량)
$ sudo losetup /dev/loop2 cinder-volumes-lvmdriver-1-backing-file
$ sudo fdisk /dev/loop2
#Type in the followings:
n
p
1
ENTER
ENTER
t
8e
w

$ sudo pvcreate /dev/loop2
$ vgcreate cinder-volumes-lvmdriver-1 /dev/loop2


[ br-tun, br-ex, br-int 가 ip a 로 안보일 때 ]
openvswitch restart 시킴
$ sudo service openvswitch-switch restart


[ Glance Image 가 DB 에는 보이나 file 이 Upload 되지 않았을 때 ]
$ sudo losetup -a

/dev/loop0: [2049]:1733858 (/opt/stack/data/swift/drives/images/swift.img)

/dev/loop1: [2049]:1733859 (/opt/stack/data/cinder-volumes-default-backing-file)

/dev/loop2: [2049]:1733860 (/opt/stack/data/cinder-volumes-lvmdriver-1-backing-file)


# swift 스토리지 마운트

$ sudo mount -t xfs -o loop,noatime,nodiratime,nobarrier,logbufs=8 /opt/stack/data/swift/drives/images/swift.img /opt/stack/data/swift/drives/sdb1


$ sudo losetup /dev/loop1 /opt/stack/data/cinder-volumes-default-backing-file
$ sudo losetup /dev/loop2 /opt/stack/data/cinder-volumes-lvmdriver-1-backing-file



# swift 스토리지 생성
$ mkfs.xfs -f -i size=1024 /opt/stack/data/swift/drives/images/swift.img

# image 가 없으면 image 업로드
$ . openrc
$ ./tools/upload_image.sh http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-uec.tar.gz

[ 서버가 뜰 때 자동으로 cinder-volume, swift 자동으로 연결하기 ]
$ sudo vi /etc/init.d/init-devstack

#! /bin/sh
### BEGIN INIT INFO
# Provides:          init-devstack
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Execute bind storage.
# Description:
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

case "$1" in
  start)
    losetup /dev/loop1 /opt/stack/data/cinder-volumes-backing-file
    mount -t xfs -o loop,noatime,nodiratime,nobarrier,logbufs=8 /opt/stack/data/swift/drives/images/swift.img /opt/stack/data/swift/drives/sdb1
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  *)
    echo "Usage: $0 start" >&2
    exit 3
    ;;
esac

$ sudo  update-rc.d init-devstack defaults


[ nova-compute LOG 를 파일로 떨어뜨리고 싶을 때 ]
cd /opt/stack/nova && nohup /usr/local/bin/nova-compute > /opt/stack/logs/screen/nova-compute.log 2>&1 &



[ Ubuntu Server 14.04 Image Upload ]
이름 : Ubuntu Server 14.04 64-bit
경로 : http://uec-images.ubuntu.com/releases/14.04.2/14.04.2/ubuntu-14.04-server-cloudimg-amd64-disk1.img
포맷 : QCOW2 - QEMU Emulator
최소 디스크 : 5
최소 RAM : 1024

./tools/upload_image.sh http://uec-images.ubuntu.com/releases/14.04.2/14.04.2/ubuntu-14.04-server-cloudimg-amd64-disk1.img

glance image-update --min-disk 5 --min-ram 1024 5f1949a1-60da-475d-83a3-a4f49be35d77

아래 사이트 이미지 참고
http://cloud-images.ubuntu.com/lucid/current/lucid-server-cloudimg-amd64-disk1.img (Ubuntu Server 10.04 64-bit)
https://help.ubuntu.com/community/UEC/Images
http://uec-images.ubuntu.com/releases/


[ Source Contribution 방법 ]

# clone a project
git clone git://github.com/openstack/nova.git

# port 확인 (브라우저에서 확인)
https://review.openstack.org/ssh_info

# Testing Gerrit Connections
ssh -p 29418 StephenAhn@review.openstack.org

# Setting username
git config --global --add gitreview.username "StephenAhn"

# 단축 경로 저장
vi ~/.ssh/config
Host review
  Hostname review.openstack.org
  Port 29418
  User StephenAhn

# gerrit remote 확인
git review -s

# gerrit remote 확인 시 에러나면 remote 추가
git remote add gerrit ssh://StephenAhn@review.openstack.org:29418/openstack/nova.git

# 최신 소스로 다운받기
git remote update
git checkout master
git pull --ff-only origin master

# blueprint 채널 생성
git checkout -b bp/local-storage-volume-scheduling

# .mailmap 에 본인 email 추가
vi .mailmap
    <skanddh@gmail.com> <seungkyu.ahn@samsung.com>

# commit message 입력
git commit --amend

첫번째 라인은 50자 이내로 간단히 요약을 쓴다.
[공백라인]
설명을 적되 라인은 72자가 넘어가면 다음 라인에 쓴다.
.....
Implements: blueprint local-storage-volume-scheduling

Change-Id 는 자동으로 지정되므로 적지 않는다.

# git review 등록 (샘플 이외에 셋 중 아무거나 쓰면 됨)
# 샘플 양식
git push ssh://StephenAhn@review.openstack.org:29418/<Project Name> HEAD:refs/for/<Branch Name>

git push ssh://StephenAhn@review.openstack.org:29418/openstack/cinder HEAD:refs/for/bp/local-storage-volume-scheduling
git push review:openstack/cinder HEAD:refs/for/bp/local-storage-volume-scheduling
git review

# 아래 두 명령어가 같은 내용임
ssh -p 29418 review.openstack.org gerrit ls-projects
ssh review gerrit ls-projects



[ unittest 수행 ]
sudo apt-get install python-dev libssl-dev python-pip git-core libmysqlclient-dev libpq-dev
sudo apt-get install libxml2-dev libxslt-dev libvirt-dev
sudo apt-get install python-virtualenv testrepository


[ nova unit test ]
cd /opt/stack/nova
./run_tests.sh

# pep8 코딩 표준 테스트
./run_tests.sh -p

# netaddr>=0.7.6 에서 에러 발생 시
$ source .venv/bin/activate
$ wget https://github.com/downloads/drkjam/netaddr/netaddr-0.7.9.zip
$ unzip netaddr-0.7.9.zip
$ cd netaddr-0.7.9
$ python setup.py install

# ubuntu 12.04 에서 libvirt-python 1.2.5 설치 시 에러
ubuntu 12.04 에서는 libvirt 0.9.8 이 기본이므로 libvirt 1.2.0 으로 업그레이드 해야함
$ sudo apt-get update
sudo apt-get -y install \
    gcc \
    make \
    pkg-config \
    libxml2-dev \
    libgnutls-dev \
    libdevmapper-dev \
    libcurl4-gnutls-dev \
    python-dev \
    libpciaccess-dev \
    libxen-dev \
    libyajl-dev \
    libnl-dev

sudo mkdir -p /opt/libvirt
$ sudo chmod 00755 /opt/libvirt
$ sudo chown root:root /opt/libvirt
$ sudo chmod a+w /opt/libvirt
$ cd /opt/libvirt
$ wget http://libvirt.org/sources/libvirt-1.2.0.tar.gz
$ tar xzvf libvirt-1.2.0.tar.gz
$ mv libvirt-1.2.0 libvirt
$ cd libvirt
./configure \
    --prefix=/usr \
    --localstatedir=/var \
    --sysconfdir=/etc \
    --with-esx=yes \
    --with-xen=yes
$ make -j
$ sudo make install

$ ./run_tests.sh

[ 단위 모듈로 테스트 하기 ]
To run the tests in the cinder/tests/scheduler directory:
./run_tests.sh scheduler

To run the tests in the cinder/tests/test_libvirt.py file:
$ ./run_tests.sh test_libvirt

To run the tests in the HostStateTestCase class in cinder/tests/test_libvirt.py:
$ ./run_tests.sh test_libvirt.HostStateTestCase

To run the ToPrimitiveTestCase.test_dict test method in cinder/tests/test_utils.py:
$ ./run_tests.sh test_utils.ToPrimitiveTestCase.test_dict


[ tempest 테스트 ]

# 옛날 방식 
$ cd /opt/stack/tempest
$ nosetests tempest/scenario/test_network_basic_ops.py


# 최신 방식
$ cd /opt/stack/tempest
$ ostestr    혹은   testr


$ git clone https://github.com/openstack/tempest/
$ pip install tempest/
$ cd tempest
$ tempest init cloud-01
$ cd cloud-01
$ cp -r /opt/stack/tempest/etc/ .
$ ../run_tempest.sh -C etc/tempest.conf

# tempest.conf
[DEFAULT]
debug = True
log_file = tempest.log
use_stderr = False
use_syslog = False

[oslo_concurrency]
lock_path = /opt/stack/data/tempest

[compute]
fixed_network_name = private
ssh_connect_method = floating
flavor_ref_alt = 84
flavor_ref = 42
image_alt_ssh_user = cirros
image_ref_alt = 8bbeeb3d-fea4-43ee-8c27-5b1015693590
image_ref = 8bbeeb3d-fea4-43ee-8c27-5b1015693590
ssh_user = cirros
build_timeout = 196

[volume]
build_timeout = 196

[identity]
auth_version = v2
uri_v3 = http://192.168.230.161:5000/v3
uri = http://192.168.230.161:5000/v2.0/

[auth]
use_dynamic_credentials = True
tempest_roles = Member
admin_domain_name = Default
admin_tenant_id = b96b0deb693842b2a09a0d91832e41ea
admin_tenant_name = admin
admin_password = imsi00
admin_username = admin

[image-feature-enabled]
deactivate_image = True

[validation]
network_for_ssh = private
image_ssh_user = cirros
ssh_timeout = 196
ip_version_for_ssh = 4
run_validation = False
connect_method = floating

[compute-feature-enabled]
allow_duplicate_networks = True
attach_encrypted_volume = True
live_migrate_paused_instances = True
preserve_ports = True
api_extensions = all
block_migration_for_live_migration = False
change_password = False
live_migration = False
resize = True
max_microversion = latest

[network]
default_network = 10.0.0.0/24
public_router_id =
public_network_id = 9353aab8-5f65-4daa-8c30-d90b588ec36d
tenant_networks_reachable = false
api_version = 2.0

[network-feature-enabled]
api_extensions = all
ipv6_subnet_attributes = True
ipv6 = True

[orchestration]
stack_owner_role = _member_
build_timeout = 900
instance_type = m1.heat


[scenario]
large_ops_number = 0
img_file = cirros-0.3.4-x86_64-disk.img
aki_img_file = cirros-0.3.4-x86_64-vmlinuz
ari_img_file = cirros-0.3.4-x86_64-initrd
ami_img_file = cirros-0.3.4-x86_64-blank.img
img_dir = /home/stack/Documents/github/devstack/files/images/cirros-0.3.4-x86_64-uec

[telemetry-feature-enabled]
events = True

[object-storage-feature-enabled]
discoverable_apis = all

[volume-feature-enabled]
api_extensions = all
volume_services = True
incremental_backup_force = True

[dashboard]
dashboard_url = http://192.168.230.161/

[cli]
cli_dir = /usr/local/bin

[service_available]
trove = True
ironic = False
sahara = False
horizon = True
ceilometer = True
heat = True
swift = True
cinder = True
neutron = True
nova = True
glance = True
key = True





[ 최신 버전으로 설치 ]
# devstack 최신소스 다운로드
$ cd Git/devstack
$ git pull --ff-only origin master

# OpenStack 최신소스 다운로드
$ vi git_update.sh

#! /bin/bash

cd /opt/stack/ceilometer/
git checkout master
git pull origin master

cd /opt/stack/cinder/
git checkout master
git pull origin master

cd /opt/stack/cliff/
git checkout master
git pull origin master

cd /opt/stack/data/
git checkout master
git pull origin master

cd /opt/stack/glance/
git checkout master
git pull origin master

cd /opt/stack/heat/
git checkout master
git pull origin master

cd /opt/stack/horizon/
git checkout master
git pull origin master

cd /opt/stack/keystone/
git checkout master
git pull origin master

cd /opt/stack/logs/
git checkout master
git pull origin master

cd /opt/stack/neutron/
git checkout master
git pull origin master

cd /opt/stack/nova/
git checkout master
git pull origin master

cd /opt/stack/noVNC/
git checkout master
git pull origin master

cd /opt/stack/oslo.config/
git checkout master
git pull origin master

cd /opt/stack/oslo.messaging/
git checkout master
git pull origin master

cd /opt/stack/oslo.rootwrap/
git checkout master
git pull origin master

cd /opt/stack/oslo.vmware/
git checkout master
git pull origin master

cd /opt/stack/pbr/
git checkout master
git pull origin master

cd /opt/stack/pycadf/
git checkout master
git pull origin master

cd /opt/stack/python-ceilometerclient/
git checkout master
git pull origin master

cd /opt/stack/python-cinderclient/
git checkout master
git pull origin master

cd /opt/stack/python-glanceclient/
git checkout master
git pull origin master

cd /opt/stack/python-heatclient/
git checkout master
git pull origin master

cd /opt/stack/python-keystoneclient/
git checkout master
git pull origin master

cd /opt/stack/python-neutronclient/
git checkout master
git pull origin master

cd /opt/stack/python-novaclient/
git checkout master
git pull origin master

cd /opt/stack/python-openstackclient/
git checkout master
git pull origin master

cd /opt/stack/python-swiftclient/
git checkout master
git pull origin master

cd /opt/stack/requirements/
git checkout master
git pull origin master

cd /opt/stack/stevedore/
git checkout master
git pull origin master

cd /opt/stack/swift/
git checkout master
git pull origin master

cd /opt/stack/taskflow/
git checkout master
git pull origin master

cd /opt/stack/tempest/
git checkout master
git pull origin master


# devstack 재설치
$ ./stack.sh


[ 이전 Package 제거 ]
$ vi clean_package.sh

#! /bin/bash

cd /usr/local/lib/python2.7/dist-packages
find -depth -maxdepth 1 -name "*nova*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*ceilometer*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*cinder*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*glance*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*keystone*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*horizon*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*neutron*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*oslo*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*heat*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*pbr*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*pycadf*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*openstackclient*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*swift*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*stevedore*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*taskflow*" | xargs sudo rm -rf
find -depth -maxdepth 1 -name "*tempest*" | xargs sudo rm -rf



[ Volume Attach 시에 VM 안에서 Volume 을 인식 못할 때 ]
아래 명령을 수행한 후 /dev/vdb 가 보이는지 확인
# echo 1 > /sys/bus/pci/rescan 

[ root를 EBS Boot on Volume 으로 생성하면서 Volume Attach 를 할 경우 ]
# nova boot [name] --flavor [flavorid] --block-device id=[imageid],source=image,dest=volume,size=10,bootindex=0,shutdown=remove 
--block-device id=[volumeid],source=volume,dest=volume,size=100,bootindex=1

[ pip 패키지를 캐시에 다운로드만 하려고 할 때 (설치는 하지 않음) ]
# sudo pip install python-openstackclient --download=/var/cache/pip


[ cpu, memory overcommit 설정 ]
$ vi /etc/nova/nova.conf

scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,CoreFilter,RamFilter,ComputeFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
cpu_allocation_ratio = 16.0
ram_allocation_ratio = 100.0
disk_allocation_ratio = 100.0



[ vm 이 DNS를 찾는지 확인 ]
$ sudo tcpdump -i tap2404d0f1-25 -n -v udp port 53



[ vm 에 할당되는 DNS 변경 ]
$ neutron subnet-list
$ neutron subnet-update <subnet> --dns_nameservers list=true 8.8.8.8 8.8.4.4




[ Horizon 접속 시 no such table: django_session 에러가 날 때 ]
아래 명령으로 db 테이블을 생성해야 함
$ cd /opt/stack/horizon
$ python manage.py syncdb




[ Murano WordPress Package Import ]
$ export MURANO_REPO_URL=http://storage.apps.openstack.org
$ murano package-import io.murano.apps.WordPress

wordpress 접속
http://192.168.75.209/wordpress




[ OpenStack Source virtualenv pip install ]
$ mkdir -p ~/.pip
$ vi ~/.pip/pip.conf
[global]
#index-url=https://pypi.python.org/pypi/
#index-url=http://pypi.gocept.com/simple/
index-url=https://pypi.python.org/simple/

$ cd ~Documents/github/Virtualenvs
$ virtualenv mitaka
$ cd mitaka
$ . bin/activate
$ pip install -r requirements.txt --trusted-host pypi.python.org








반응형
Posted by seungkyua@gmail.com
,
반응형

[ 숯불갈비 ]

- 8월 28일 kbs2 생생정보통 달마루 (원주시 개운동 313-12, 010-3032-9353, 033-764-9900)

 

[ 간장게장 ]

- 9월 23일 kbs2 생생정보통 오가네 간장게장 (가평군 청평면 고성리 611-2, 031-585-2452)

 

[ 왕새우 양식장 ]

- 9월 23일 kbs2 생생정보통 담미수산 (전라남도 신안군 압해읍 대천리, 010-8710-8577)

 

 

 

 

1월

-

 

 

2월

-

 

 

3월

-

 

 

4월

- 4월 25일 kbs 생생 정보통

   . 섬진강 참게 요리

 

5월

-

 

6월

-

 

7월

-

 

8월

-

 

9월

-

 

10월

-

 

11월

-

 

12월

-

 

 

반응형
Posted by seungkyua@gmail.com
,