HCE Project Python language Distributed Tasks Manager Application, Distributed Crawler Application and client API bindings.  2.0.0-chaika
Hierarchical Cluster Engine Python language binding
ProxyJsonWrapper.py
Go to the documentation of this file.
1 # coding: utf-8
2 
3 """
4 HCE project, Python bindings, Distributed Tasks Manager application.
5 It's wrapper proxy data struct.
6 
7 @package: dc_crawler
8 @file ProxyJsonWrapper.py
9 @author Alexander Vybornyh <alexander.hce.cluster@gmail.com>
10 @link: http://hierarchical-cluster-engine.com/
11 @copyright: Copyright &copy; 2013-2017 IOIX Ukraine
12 @license: http://hierarchical-cluster-engine.com/license/
13 @since: 0.1
14 """
15 
16 from dc.EventObjects import Proxy
17 
18 
19 class ProxyJsonWrapper(object):
20  # #Constants used in class
21  PROXIES_HOST_NAME = 'host'
22  PROXIES_DOMAINS_NAME = 'domains'
23  PROXIES_PRIORITY_NAME = 'priority'
24  PROXIES_LIMITS_NAME = 'limits'
25  PROXIES_STATE_NAME = 'state'
26  PROXIES_FREQ_NAME = 'freq'
27  PROXIES_FAULTS_NAME = 'faults'
28  PROXIES_FAULTS_MAX_NAME = 'faultsMax'
29 
30  PROXIES_DATA_LIST_NAMES = [PROXIES_HOST_NAME, PROXIES_DOMAINS_NAME, PROXIES_PRIORITY_NAME, PROXIES_LIMITS_NAME, \
31  PROXIES_STATE_NAME, PROXIES_FREQ_NAME, PROXIES_FAULTS_NAME, PROXIES_FAULTS_MAX_NAME]
32  # support state values
33  PROXY_STATE_DISABLED = 0
34  PROXY_STATE_ENABLED = 1
35 
36  DEFAULT_VALUE_JSON_DATA = {}
37  DEFAULT_VALUE_PROXIES_DOMAIN = ['*']
38  DEFAULT_VALUE_PROXIES_PRIORITY = 10
39  DEFAULT_VALUE_PROXIES_LIMITS = None
40  DEFAULT_VALUE_PROXIES_STATE = PROXY_STATE_ENABLED
41  DEFAULT_VALUE_PROXIES_FREQ = 0
42  DEFAULT_VALUE_PROXIES_FAULTS = 0
43  DEFAULT_VALUE_PROXIES_FAULTS_MAX = 0
44 
45  DEFAULT_VALUE_INCREMENT_FREQUENCY = 1
46  DEFAULT_VALUE_INCREMENT_FAULTS = 1
47  DEFAULT_VALUE_UNLIMITED_FAULTS_MAX = 0
48 
49 
50  # # Initialization
51  #
52  # @param jsonData - json data
53  def __init__(self, jsonData):
54  self.jsonData = (jsonData if isinstance(jsonData, dict) else self.DEFAULT_VALUE_JSON_DATA)
55 
56 
57  # # set proxies data value to json
58  #
59  # @param proxyData - proxy data value
60  # @return - None
61  def setProxyData(self, proxyData):
62  if isinstance(proxyData, dict):
63  if self.PROXIES_HOST_NAME in proxyData.keys() and proxyData[self.PROXIES_HOST_NAME] not in self.jsonData:
64 
65  proxyData[self.PROXIES_DOMAINS_NAME] = proxyData[self.PROXIES_DOMAINS_NAME] \
66  if self.PROXIES_PRIORITY_NAME in proxyData.keys() and proxyData[self.PROXIES_DOMAINS_NAME] is not None \
67  and len(proxyData[self.PROXIES_DOMAINS_NAME]) > 0 else self.DEFAULT_VALUE_PROXIES_DOMAIN
68 
69  proxyData[self.PROXIES_PRIORITY_NAME] = proxyData[self.PROXIES_PRIORITY_NAME] \
70  if self.PROXIES_PRIORITY_NAME in proxyData.keys() and proxyData[self.PROXIES_PRIORITY_NAME] is not None \
71  and int(proxyData[self.PROXIES_PRIORITY_NAME]) > 0 else self.DEFAULT_VALUE_PROXIES_PRIORITY
72 
73  proxyData[self.PROXIES_LIMITS_NAME] = proxyData[self.PROXIES_LIMITS_NAME] \
74  if self.PROXIES_LIMITS_NAME in proxyData.keys() else self.DEFAULT_VALUE_PROXIES_LIMITS
75 
76  proxyData[self.PROXIES_STATE_NAME] = proxyData[self.PROXIES_STATE_NAME] \
77  if self.PROXIES_STATE_NAME in proxyData.keys() else self.DEFAULT_VALUE_PROXIES_STATE
78 
79  proxyData[self.PROXIES_FREQ_NAME] = proxyData[self.PROXIES_FREQ_NAME] \
80  if self.PROXIES_FREQ_NAME in proxyData.keys() else self.DEFAULT_VALUE_PROXIES_FREQ
81 
82  proxyData[self.PROXIES_FAULTS_NAME] = proxyData[self.PROXIES_FAULTS_NAME] \
83  if self.PROXIES_FAULTS_NAME in proxyData.keys() else self.DEFAULT_VALUE_PROXIES_FAULTS
84 
85  proxyData[self.PROXIES_FAULTS_MAX_NAME] = proxyData[self.PROXIES_FAULTS_MAX_NAME] \
86  if self.PROXIES_FAULTS_MAX_NAME in proxyData.keys() else self.DEFAULT_VALUE_PROXIES_FAULTS_MAX
87 
88  self.jsonData[proxyData[self.PROXIES_HOST_NAME]] = proxyData
89 
90 
91  # # get proxies data value from json
92  #
93  # @param proxyName - proxy name
94  # @return - proxy data value
95  def getProxyData(self, proxyName):
96  # variable for result
97  ret = None
98  if proxyName in self.jsonData:
99  ret = self.jsonData[proxyName]
100 
101  return ret
102 
103 
104  # # get full json data
105  #
106  # @param - None
107  # @return json data
108  def getData(self):
109  return self.jsonData
110 
111 
112  # # add list of Proxy objects to json
113  #
114  # @param proxyList - list of Proxy objects
115  # @return - None
116  def addProxyList(self, proxyList):
117  if isinstance(proxyList, list):
118  for proxy in proxyList:
119  if isinstance(proxy, Proxy):
120  proxyData = {}
121  for name in self.PROXIES_DATA_LIST_NAMES:
122  if hasattr(proxy, name):
123  proxyData[name] = getattr(proxy, name)
124 
125  self.setProxyData(proxyData)
126 
127 
128  # # get list of Proxy objects from json
129  #
130  # @param state - state of proxy (default value None return full list enabled and disabled proxies)
131  # @return list of Proxy objects
132  def getProxyList(self, state=None):
133  # variable for result
134  proxyList = []
135 
136  for proxyName in self.jsonData.keys():
137  proxyData = self.getProxyData(proxyName)
138 
139  proxy = Proxy(siteId='0', host='')
140  for name in self.PROXIES_DATA_LIST_NAMES:
141  if name in proxyData:
142  setattr(proxy, name, proxyData[name])
143 
144  if self.PROXIES_FREQ_NAME in proxyData:
145  setattr(proxy, self.PROXIES_FREQ_NAME, int(proxyData[self.PROXIES_FREQ_NAME]))
146 
147  if proxy.host != "" and (proxy.state == state if state is not None else True):
148  proxyList.append(proxy)
149 
150  return proxyList
151 
152 
153  # # add frequency value for proxy
154  #
155  # @param proxyName - proxy name
156  # @param incrementSize - value for increment of frequency counter
157  def addFrequency(self, proxyName, incrementSize=DEFAULT_VALUE_INCREMENT_FREQUENCY):
158  proxyData = self.getProxyData(proxyName)
159  if proxyData is not None:
160  # increment frequency counter
161  frequency = int(proxyData[self.PROXIES_FREQ_NAME]) if self.PROXIES_FREQ_NAME in proxyData \
163  frequency += int(incrementSize)
164  proxyData[self.PROXIES_FREQ_NAME] = frequency
165 
166  # apply changes
167  self.setProxyData(proxyData)
168 
169 
170  # # add faults to counter
171  #
172  # @param proxyName - proxy host name
173  # @param incrementSize - value for increment of faults counter
174  # @return - None
175  def addFaults(self, proxyName, incrementSize=DEFAULT_VALUE_INCREMENT_FAULTS):
176  proxyData = self.getProxyData(proxyName)
177  if proxyData is not None:
178  # increment faults counter
179  faults = int(proxyData[self.PROXIES_FAULTS_NAME]) if self.PROXIES_FAULTS_NAME in proxyData \
181  faults += incrementSize
182  proxyData[self.PROXIES_FAULTS_NAME] = faults
183 
184  # get faults max value
185  faultsMax = int(proxyData[self.PROXIES_FAULTS_MAX_NAME]) if self.PROXIES_FAULTS_MAX_NAME in proxyData \
187 
188  # check max allowed faults and disable if necessary
189  if faultsMax != self.DEFAULT_VALUE_UNLIMITED_FAULTS_MAX and faults >= faultsMax:
190  # disable proxy
191  proxyData[self.PROXIES_STATE_NAME] = self.PROXY_STATE_DISABLED
192 
193  # apply changes
194  self.setProxyData(proxyData)
def addFaults(self, proxyName, incrementSize=DEFAULT_VALUE_INCREMENT_FAULTS)
def addFrequency(self, proxyName, incrementSize=DEFAULT_VALUE_INCREMENT_FREQUENCY)