| # encoding=utf-8 |
| from urlparse import urlparse, parse_qsl |
| |
| __author__ = 'caozupeng' |
| |
| |
| class ServiceURL(object): |
| protocol = 'jsonrpc' |
| location = '' # ip+port |
| path = '' # like /com.qianmi.dubbo.UserProvider |
| ip = '127.0.0.1' |
| port = '9090' |
| version = '' |
| group = '' |
| disabled = False |
| weight = 100 |
| has_disable_value = False |
| has_weight_value = False |
| |
| def __init__(self, url): |
| result = urlparse(url) |
| self.protocol = result[0] |
| self.location = result[1] |
| self.path = result[2] |
| if self.location.find(':') > -1: |
| self.ip, self.port = result[1].split(':') |
| params = parse_qsl(result[4]) |
| for key, value in params: |
| # url has a default.timeout property, but it can not add in python object |
| # so keep the last one |
| pos = key.find('.') |
| if pos > -1: |
| key = key[pos + 1:] |
| # print key |
| if key == 'disabled': |
| value = value.lower() == 'true' if value else False |
| self.has_disable_value = True |
| elif key == 'weight': |
| value = int(value) if value else 100 |
| self.has_weight_value = True |
| self.__dict__[key] = value |
| |
| def __repr__(self): |
| return str(self.__dict__) |
| |
| def init_default_config(self): |
| """ |
| 恢复默认设置,dubbo配置是覆盖形式,如果恢复默认值,那么configurators下的配置会被清空 |
| :return: |
| """ |
| self.disabled = False |
| self.weight = 100 |
| |
| def set_config(self, url_list): |
| """ |
| 设置自定义dubbo配置 |
| :param url_list: |
| :return: |
| """ |
| if not url_list: |
| return |
| |
| param_list = [] |
| for configuration_url in url_list: |
| result = urlparse(configuration_url) |
| params = parse_qsl(result[4]) |
| param_list.extend(params) |
| has_disable_value = False |
| has_weight_value = False |
| for key, value in param_list: |
| if key == 'disabled': |
| self.disabled = value.lower() == 'true' if value else False |
| has_disable_value = True |
| if key == 'weight': |
| self.weight = int(value) if value else 100 |
| has_weight_value = True |
| |
| if not has_disable_value: |
| self.disabled = False |
| if not has_weight_value: |
| self.weight = 100 |