OpenStack 의 QoS 기능 직접 쓰기 (2)

본문 주소:http://blog.csdn.net/spch2008/article/details/9281947
/ usr / share / pyshared / quantum / plugins / openvswitch / 에 새 패키지 extensions 를 만 든 다음 / usr / lib / python 2.7 / dist - packages / quantum / plugins / openvswitch 에 연결 합 니 다.
extensions 에서 ovsqos. py 를 만 들 려 면 소프트 연결 이 필요 합 니 다.Quantum 데이터베이스 추가 표 참조 
1. 우선, 자원 속성 맵 을 처리 하 는 것 은 속성 에 대해 제한 을 하 는 것 입 니 다.  
def convert_to_unsigned_int_or_none(val):
    if val is None:
        return
    try:
        val = int(val)
        if val < 0:
            raise ValueError
    except (ValueError, TypeError):
        msg = _("'%s' must be a non negative integer.") % val
        raise qexception.InvalidInput(error_message=msg)
    return val


# Attribute Map
RESOURCE_ATTRIBUTE_MAP = {
    'ovsqoss': {
        'id': {'allow_post': False, 'allow_put': False,
               'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'is_visible': True, 'default': '',
                 'validate': {'type:string': None}},
        'rate': {'allow_post': True, 'allow_put': True,
                'is_visible': True, 'default': '0',
                'convert_to': convert_to_unsigned_int_or_none},
        'burst': {'allow_post': True, 'allow_put': True,
                'is_visible': True, 'default': '0',
                'convert_to': convert_to_unsigned_int_or_none},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'required_by_policy': True,
                      'validate': {'type:string': None},
                      'is_visible': True},
    }
}
  convert_to_unsigned_int_or_none 속성 값 을 성형 으로 변환 합 니 다.
  RESOURCE_ATTRIBUTE_MAP 가 속성 을 제약 합 니 다.allow_put 사용자 가 수정 할 수 있 는 지 여부, 즉 update;allow_post 사용자 가 보 내 는 수 치 를 통 해 채 울 지 여부 입 니 다. 예 를 들 어 id,
  이 값 은 false 입 니 다. 사용자 가 제출 한 데이터 에 id 값 이 있 으 면 오류 가 발생 합 니 다. 즉, id 는 시스템 에서 분배 되 고 사용자 가 지정 하지 않 습 니 다.is_visible 이 속성 이 사용자 에 게 보 이 는 지 여부 입 니 다. false 라면,
  사용자 가 이 값 을 볼 수 없습니다.
2. 같은 이치 로 qos 는 port 의 한 속성 으로 qos 에 대해 서도 제한 을 가 합 니 다.
OVSQOS = 'ovsqoss'
EXTENDED_ATTRIBUTES_2_0 = {
    'ports': {OVSQOS: {'allow_post': True,
                               'allow_put': True,
                               'is_visible': True,
                               'default': attr.ATTR_NOT_SPECIFIED}}}

사용자 가 quentum port - list, port - update 등 명령 을 통 해 포트 를 수정 할 때 ovsqos 라 는 속성 을 수정 할 수 있 는 지, 사용자 에 게 볼 수 있 는 지 등 입 니 다.
3. 가장 중요 한 부류
   메모: 클래스 이름 은 파일 과 같은 이름 이 어야 하 며 이니셜 은 대문자 로 써 야 합 니 다.
class Ovsqos(object):

    @classmethod
    def get_name(cls):
        return "ovsqos"

    @classmethod
    def get_alias(cls):
        return "ovsqos"

    @classmethod
    def get_description(cls):
        return "OVS QoS extension."

    @classmethod
    def get_namespace(cls):
        return "http://blog.csdn.net/spch2008"

    @classmethod
    def get_updated(cls):
        return "2013-06-05T10:00:00-00:00"

    @classmethod
    def get_resources(cls):
        """ Returns Ext Resources """
        exts = []
        plugin = manager.QuantumManager.get_plugin()
        resource_name = 'ovsqos'
        collection_name = resource_name.replace('_', '-') + "s"
        params = RESOURCE_ATTRIBUTE_MAP.get(resource_name + "s", dict())
        
        controller = base.create_resource(collection_name,
                                          resource_name,
                                          plugin, params, allow_bulk=False)

        ex = extensions.ResourceExtension(collection_name,
                                          controller)
        exts.append(ex)

        return exts

    def get_extended_resources(self, version):
        if version == "2.0":
            return EXTENDED_ATTRIBUTES_2_0
        else:
            return {}
  • get_extended_resources 에서 확장 속성 을 얻 은 다음 (quantum \ api \ v2 \ router. py) 의 APIRouter
  • 에 실제 보고 되 었 습 니 다.
                     __init__의 extmgr.extend_resources("2.0",  attributes.RESOURCE_ATTRIBUTE_MAP)
  • get_resources 자원 획득, 추가 경로 항목 만 들 기
  • get_alias 는 별명 을 되 돌려 줍 니 다. 이 이름 은 매우 중요 합 니 다.필요 한 것 은 ovsquantum_plguin. py 의 OVSQuantumPluginV 2 속성supported_extension_aliases

  •              이 별명 가입            
    supported_extension_aliases = ["provider", "router", "ovsqos"]

    4. quantum \ \ extensions \ \ extensions. py 파일 의 맨 끝
         def get_extensions_path () 는 확장 기능 파일 을 가 져 오 는 데 사 용 됩 니 다. 원본 코드 는 절대 경 로 를 사용 해 야 하지만 설정 문서 에서 상대 적 인 경 로 를 주 고 일치 하지 않 습 니 다.
         따라서 이 를 상대 경로 로 바 꾸 었 습 니 다. 코드 는 다음 과 같 습 니 다.   
    def get_extensions_path():
        #spch
        paths = ':'.join(quantum.extensions.__path__)
        
        #get the prefix path
        prefix = "/".join(quantum.__path__[0].split("/")[:-1])
          
        if cfg.CONF.api_extensions_path:
            #split the api_extensions_path by ":"
            ext_paths = cfg.CONF.api_extensions_path.split(":")
            #add prefix for each path
            for i in range(len(ext_paths)):
                ext_paths[i] = prefix + ext_paths[i]
            
            ext_paths.append(paths)
            paths = ":".join(ext_paths)
        
        return paths

    5. 확장 기능 을 프로필 에 기록 하여 OpenStack 시스템 이 qos 기능 을 불 러 올 수 있 도록 합 니 다.
        quantum.conf 중: 
    api_extensions_path = /quantum/plugins/openvswitch/extensions

     전체 코드 는 다음 과 같 습 니 다:
    '''
    Created on 2013-6-5
    
    @author: spch2008
    '''
    
    
    from abc import abstractmethod
    from quantum.api.v2 import attributes as attr
    from quantum.api.v2 import base
    from quantum.extensions import extensions
    from quantum.common import exceptions as qexception
    from quantum import manager
    import logging
    
    LOG = logging.getLogger(__name__)
    
    
    def convert_to_unsigned_int_or_none(val):
        if val is None:
            return
        try:
            val = int(val)
            if val < 0:
                raise ValueError
        except (ValueError, TypeError):
            msg = _("'%s' must be a non negative integer.") % val
            raise qexception.InvalidInput(error_message=msg)
        return val
    
    
    # Attribute Map
    RESOURCE_ATTRIBUTE_MAP = {
        'ovsqoss': {
            'id': {'allow_post': False, 'allow_put': False,
                   'is_visible': True,
                   'primary_key': True},
            'name': {'allow_post': True, 'allow_put': True,
                     'is_visible': True, 'default': '',
                     'validate': {'type:string': None}},
            'rate': {'allow_post': True, 'allow_put': True,
                    'is_visible': True, 'default': '0',
                    'convert_to': convert_to_unsigned_int_or_none},
            'burst': {'allow_post': True, 'allow_put': True,
                    'is_visible': True, 'default': '0',
                    'convert_to': convert_to_unsigned_int_or_none},
            'tenant_id': {'allow_post': True, 'allow_put': False,
                          'required_by_policy': True,
                          'validate': {'type:string': None},
                          'is_visible': True},
        }
    }
    
    OVSQOS = 'ovsqoss'
    EXTENDED_ATTRIBUTES_2_0 = {
        'ports': {OVSQOS: {'allow_post': True,
                                   'allow_put': True,
                                   'is_visible': True,
                                   'default': attr.ATTR_NOT_SPECIFIED}}}
    
    
    class Ovsqos(object):
    
        @classmethod
        def get_name(cls):
            return "ovsqos"
    
        @classmethod
        def get_alias(cls):
            return "ovsqos"
    
        @classmethod
        def get_description(cls):
            return "OVS QoS extension."
    
        @classmethod
        def get_namespace(cls):
            return "http://blog.csdn.net/spch2008"
    
        @classmethod
        def get_updated(cls):
            return "2013-06-05T10:00:00-00:00"
    
        @classmethod
        def get_resources(cls):
            """ Returns Ext Resources """
            exts = []
            plugin = manager.QuantumManager.get_plugin()
            resource_name = 'ovsqos'
            collection_name = resource_name.replace('_', '-') + "s"
            params = RESOURCE_ATTRIBUTE_MAP.get(resource_name + "s", dict())
            
            controller = base.create_resource(collection_name,
                                              resource_name,
                                              plugin, params, allow_bulk=False)
    
            ex = extensions.ResourceExtension(collection_name,
                                              controller)
            exts.append(ex)
    
            return exts
    
        def get_extended_resources(self, version):
            if version == "2.0":
                return EXTENDED_ATTRIBUTES_2_0
            else:
                return {}
    
    class OVSPluginBase(object):
        @abstractmethod
        def create_ovsqos(self, context, ovsqos):
            pass
    
        @abstractmethod
        def get_ovsqoss(self, context, filters, fields):
            pass
    
        @abstractmethod
        def get_ovsqos(self, context, rule_id, fields):
            pass
    
        @abstractmethod
        def delete_ovsqos(self, context, rule_id):
            pass
    
        @abstractmethod
        def update_ovsqos(self, context, rule_id, ovsqos):
            pass
    

    좋은 웹페이지 즐겨찾기