deepfos 1.1.60__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. deepfos/__init__.py +6 -0
  2. deepfos/_version.py +21 -0
  3. deepfos/algo/__init__.py +0 -0
  4. deepfos/algo/graph.py +171 -0
  5. deepfos/algo/segtree.py +31 -0
  6. deepfos/api/V1_1/__init__.py +0 -0
  7. deepfos/api/V1_1/business_model.py +119 -0
  8. deepfos/api/V1_1/dimension.py +599 -0
  9. deepfos/api/V1_1/models/__init__.py +0 -0
  10. deepfos/api/V1_1/models/business_model.py +1033 -0
  11. deepfos/api/V1_1/models/dimension.py +2768 -0
  12. deepfos/api/V1_2/__init__.py +0 -0
  13. deepfos/api/V1_2/dimension.py +285 -0
  14. deepfos/api/V1_2/models/__init__.py +0 -0
  15. deepfos/api/V1_2/models/dimension.py +2923 -0
  16. deepfos/api/__init__.py +0 -0
  17. deepfos/api/account.py +167 -0
  18. deepfos/api/accounting_engines.py +147 -0
  19. deepfos/api/app.py +626 -0
  20. deepfos/api/approval_process.py +198 -0
  21. deepfos/api/base.py +983 -0
  22. deepfos/api/business_model.py +160 -0
  23. deepfos/api/consolidation.py +129 -0
  24. deepfos/api/consolidation_process.py +106 -0
  25. deepfos/api/datatable.py +341 -0
  26. deepfos/api/deep_pipeline.py +61 -0
  27. deepfos/api/deepconnector.py +36 -0
  28. deepfos/api/deepfos_task.py +92 -0
  29. deepfos/api/deepmodel.py +188 -0
  30. deepfos/api/dimension.py +486 -0
  31. deepfos/api/financial_model.py +319 -0
  32. deepfos/api/journal_model.py +119 -0
  33. deepfos/api/journal_template.py +132 -0
  34. deepfos/api/memory_financial_model.py +98 -0
  35. deepfos/api/models/__init__.py +3 -0
  36. deepfos/api/models/account.py +483 -0
  37. deepfos/api/models/accounting_engines.py +756 -0
  38. deepfos/api/models/app.py +1338 -0
  39. deepfos/api/models/approval_process.py +1043 -0
  40. deepfos/api/models/base.py +234 -0
  41. deepfos/api/models/business_model.py +805 -0
  42. deepfos/api/models/consolidation.py +711 -0
  43. deepfos/api/models/consolidation_process.py +248 -0
  44. deepfos/api/models/datatable_mysql.py +427 -0
  45. deepfos/api/models/deep_pipeline.py +55 -0
  46. deepfos/api/models/deepconnector.py +28 -0
  47. deepfos/api/models/deepfos_task.py +386 -0
  48. deepfos/api/models/deepmodel.py +308 -0
  49. deepfos/api/models/dimension.py +1576 -0
  50. deepfos/api/models/financial_model.py +1796 -0
  51. deepfos/api/models/journal_model.py +341 -0
  52. deepfos/api/models/journal_template.py +854 -0
  53. deepfos/api/models/memory_financial_model.py +478 -0
  54. deepfos/api/models/platform.py +178 -0
  55. deepfos/api/models/python.py +221 -0
  56. deepfos/api/models/reconciliation_engine.py +411 -0
  57. deepfos/api/models/reconciliation_report.py +161 -0
  58. deepfos/api/models/role_strategy.py +884 -0
  59. deepfos/api/models/smartlist.py +237 -0
  60. deepfos/api/models/space.py +1137 -0
  61. deepfos/api/models/system.py +1065 -0
  62. deepfos/api/models/variable.py +463 -0
  63. deepfos/api/models/workflow.py +946 -0
  64. deepfos/api/platform.py +199 -0
  65. deepfos/api/python.py +90 -0
  66. deepfos/api/reconciliation_engine.py +181 -0
  67. deepfos/api/reconciliation_report.py +64 -0
  68. deepfos/api/role_strategy.py +234 -0
  69. deepfos/api/smartlist.py +69 -0
  70. deepfos/api/space.py +582 -0
  71. deepfos/api/system.py +372 -0
  72. deepfos/api/variable.py +154 -0
  73. deepfos/api/workflow.py +264 -0
  74. deepfos/boost/__init__.py +6 -0
  75. deepfos/boost/py_jstream.py +89 -0
  76. deepfos/boost/py_pandas.py +20 -0
  77. deepfos/cache.py +121 -0
  78. deepfos/config.py +6 -0
  79. deepfos/core/__init__.py +27 -0
  80. deepfos/core/cube/__init__.py +10 -0
  81. deepfos/core/cube/_base.py +462 -0
  82. deepfos/core/cube/constants.py +21 -0
  83. deepfos/core/cube/cube.py +408 -0
  84. deepfos/core/cube/formula.py +707 -0
  85. deepfos/core/cube/syscube.py +532 -0
  86. deepfos/core/cube/typing.py +7 -0
  87. deepfos/core/cube/utils.py +238 -0
  88. deepfos/core/dimension/__init__.py +11 -0
  89. deepfos/core/dimension/_base.py +506 -0
  90. deepfos/core/dimension/dimcreator.py +184 -0
  91. deepfos/core/dimension/dimension.py +472 -0
  92. deepfos/core/dimension/dimexpr.py +271 -0
  93. deepfos/core/dimension/dimmember.py +155 -0
  94. deepfos/core/dimension/eledimension.py +22 -0
  95. deepfos/core/dimension/filters.py +99 -0
  96. deepfos/core/dimension/sysdimension.py +168 -0
  97. deepfos/core/logictable/__init__.py +5 -0
  98. deepfos/core/logictable/_cache.py +141 -0
  99. deepfos/core/logictable/_operator.py +663 -0
  100. deepfos/core/logictable/nodemixin.py +673 -0
  101. deepfos/core/logictable/sqlcondition.py +609 -0
  102. deepfos/core/logictable/tablemodel.py +497 -0
  103. deepfos/db/__init__.py +36 -0
  104. deepfos/db/cipher.py +660 -0
  105. deepfos/db/clickhouse.py +191 -0
  106. deepfos/db/connector.py +195 -0
  107. deepfos/db/daclickhouse.py +171 -0
  108. deepfos/db/dameng.py +101 -0
  109. deepfos/db/damysql.py +189 -0
  110. deepfos/db/dbkits.py +358 -0
  111. deepfos/db/deepengine.py +99 -0
  112. deepfos/db/deepmodel.py +82 -0
  113. deepfos/db/deepmodel_kingbase.py +83 -0
  114. deepfos/db/edb.py +214 -0
  115. deepfos/db/gauss.py +83 -0
  116. deepfos/db/kingbase.py +83 -0
  117. deepfos/db/mysql.py +184 -0
  118. deepfos/db/oracle.py +131 -0
  119. deepfos/db/postgresql.py +192 -0
  120. deepfos/db/sqlserver.py +99 -0
  121. deepfos/db/utils.py +135 -0
  122. deepfos/element/__init__.py +89 -0
  123. deepfos/element/accounting.py +348 -0
  124. deepfos/element/apvlprocess.py +215 -0
  125. deepfos/element/base.py +398 -0
  126. deepfos/element/bizmodel.py +1269 -0
  127. deepfos/element/datatable.py +2467 -0
  128. deepfos/element/deep_pipeline.py +186 -0
  129. deepfos/element/deepconnector.py +59 -0
  130. deepfos/element/deepmodel.py +1806 -0
  131. deepfos/element/dimension.py +1254 -0
  132. deepfos/element/fact_table.py +427 -0
  133. deepfos/element/finmodel.py +1485 -0
  134. deepfos/element/journal.py +840 -0
  135. deepfos/element/journal_template.py +943 -0
  136. deepfos/element/pyscript.py +412 -0
  137. deepfos/element/reconciliation.py +553 -0
  138. deepfos/element/rolestrategy.py +243 -0
  139. deepfos/element/smartlist.py +457 -0
  140. deepfos/element/variable.py +756 -0
  141. deepfos/element/workflow.py +560 -0
  142. deepfos/exceptions/__init__.py +239 -0
  143. deepfos/exceptions/hook.py +86 -0
  144. deepfos/lazy.py +104 -0
  145. deepfos/lazy_import.py +84 -0
  146. deepfos/lib/__init__.py +0 -0
  147. deepfos/lib/_javaobj.py +366 -0
  148. deepfos/lib/asynchronous.py +879 -0
  149. deepfos/lib/concurrency.py +107 -0
  150. deepfos/lib/constant.py +39 -0
  151. deepfos/lib/decorator.py +310 -0
  152. deepfos/lib/deepchart.py +778 -0
  153. deepfos/lib/deepux.py +477 -0
  154. deepfos/lib/discovery.py +273 -0
  155. deepfos/lib/edb_lexer.py +789 -0
  156. deepfos/lib/eureka.py +156 -0
  157. deepfos/lib/filterparser.py +751 -0
  158. deepfos/lib/httpcli.py +106 -0
  159. deepfos/lib/jsonstreamer.py +80 -0
  160. deepfos/lib/msg.py +394 -0
  161. deepfos/lib/nacos.py +225 -0
  162. deepfos/lib/patch.py +92 -0
  163. deepfos/lib/redis.py +241 -0
  164. deepfos/lib/serutils.py +181 -0
  165. deepfos/lib/stopwatch.py +99 -0
  166. deepfos/lib/subtask.py +572 -0
  167. deepfos/lib/sysutils.py +703 -0
  168. deepfos/lib/utils.py +1003 -0
  169. deepfos/local.py +160 -0
  170. deepfos/options.py +670 -0
  171. deepfos/translation.py +237 -0
  172. deepfos-1.1.60.dist-info/METADATA +33 -0
  173. deepfos-1.1.60.dist-info/RECORD +175 -0
  174. deepfos-1.1.60.dist-info/WHEEL +5 -0
  175. deepfos-1.1.60.dist-info/top_level.txt +1 -0
deepfos/lib/eureka.py ADDED
@@ -0,0 +1,156 @@
1
+ from xml.etree import ElementTree
2
+
3
+ from loguru import logger
4
+
5
+ from deepfos import OPTION
6
+ from deepfos.lib.discovery import ServiceDiscovery
7
+ from deepfos.lib.httpcli import AioHttpCli
8
+ from deepfos.lib.utils import concat_url
9
+
10
+ __all__ = ['Eureka']
11
+
12
+
13
+ def http(ins):
14
+ port = ins.find('port')
15
+ enabled = port.get('enabled').lower() == "true"
16
+ if enabled:
17
+ ip = ins.find('ipAddr').text
18
+ return f"http://{ip}:{port.text}"
19
+
20
+
21
+ def https(ins):
22
+ port = ins.find('securePort')
23
+ enabled = port.get('enabled').lower() == "true"
24
+ if enabled:
25
+ ip = ins.find('ipAddr').text
26
+ return f"https://{ip}:{port.text}"
27
+
28
+
29
+ class EurekaCli(ServiceDiscovery):
30
+ def __init__(self):
31
+ super().__init__()
32
+ self.versions_delta = '' # 增量更新的versions_delta
33
+ self.apps_hashcode = '' # 增量更新的apps_hashcode
34
+ self.setup()
35
+
36
+ # noinspection PyAttributeOutsideInit
37
+ def setup(self):
38
+ from deepfos.lib.discovery import CACHE_STRATEGY, RankedCache
39
+ base_url = CACHE_STRATEGY.get(
40
+ OPTION.discovery.cache_strategy, RankedCache
41
+ )()
42
+ for url in OPTION.server.eureka.split(','):
43
+ base_url.add(url)
44
+ self.base_url = base_url
45
+
46
+ async def on_interval(self):
47
+ if self.server_cache: # 有全量数据时-保持增量更新,否则-全量更新
48
+ await self.get_delta_apps()
49
+ else:
50
+ await self._get_full_apps()
51
+
52
+ async def on_startup(self):
53
+ await self._get_full_apps()
54
+
55
+ async def get_url(self, server_name: str, include_cb: bool = False):
56
+ system_env = OPTION.general.task_info.get('system_env') or ''
57
+ server_name = f"{system_env}{server_name}"
58
+ return await super().get_url(server_name.upper(), include_cb)
59
+
60
+ def sync_get_url(self, server_name: str, include_cb: bool = False):
61
+ system_env = OPTION.general.task_info.get('system_env') or ''
62
+ server_name = f"{system_env}{server_name}"
63
+ return super().sync_get_url(server_name.upper(), include_cb)
64
+
65
+ async def update_service_cache(self, server_name: str):
66
+ await self.get_delta_apps()
67
+
68
+ async def update_instance_cache(self, server_name: str):
69
+ pass
70
+
71
+ async def _get_xml(self, end_point: str):
72
+ if not self.base_url:
73
+ # Maybe all deleted by punish
74
+ self.setup()
75
+
76
+ url = self.base_url.pick_best()
77
+ try:
78
+ resp = await AioHttpCli.get(concat_url(url, end_point))
79
+ raw_xml = await resp.text()
80
+ xml = ElementTree.fromstring(raw_xml)
81
+ except Exception:
82
+ self.base_url.punish(url)
83
+ raise
84
+ else:
85
+ self.base_url.reward(url)
86
+ return xml
87
+
88
+ async def _get_full_apps(self):
89
+ """全量获取eureka服务列表,并更新到缓存中"""
90
+ xml = await self._get_xml('apps')
91
+
92
+ # 全量更新:确保拿到数据后,先清缓存
93
+ if xml.find('apps__hashcode').text:
94
+ self.server_cache.clear()
95
+ server_memo = self.server_cache
96
+
97
+ for app in xml.iter('application'):
98
+ app_name = app.find('name').text.upper()
99
+ for instance in app.iter('instance'):
100
+ status = instance.find('status')
101
+ if status.text.upper() != "UP":
102
+ continue
103
+
104
+ addr = http(instance) or https(instance)
105
+
106
+ if addr is not None:
107
+ server_memo[app_name].add(addr) # 全量更新缓存
108
+
109
+ logger.opt(lazy=True).debug("FULL-XML cache updated.")
110
+ return server_memo
111
+
112
+ async def get_delta_apps(self):
113
+ """增量获取eureka服务列表,并更新到缓存中"""
114
+ xml = await self._get_xml('apps/delta')
115
+
116
+ server_memo = self.server_cache
117
+ if (
118
+ xml.find('versions__delta').text == self.versions_delta
119
+ and xml.find('apps__hashcode').text == self.apps_hashcode
120
+ ):
121
+ # 如果versions__delta和apps__hashcode完全一样,则不必更新
122
+ return server_memo
123
+
124
+ # versions__delta和apps__hashcode赋值为最新
125
+ self.versions_delta = xml.find('versions__delta').text
126
+ self.apps_hashcode = xml.find('apps__hashcode').text
127
+
128
+ for app in xml.iter('application'):
129
+ app_name = app.find('name').text.upper()
130
+ for instance in app.iter('instance'):
131
+ addr = http(instance) or https(instance)
132
+ if not addr:
133
+ continue
134
+ # instance的操作类型:ADDED,MODIFIED,DELETED;instacce的状态:UP,...
135
+ # 处理逻辑:只有操作类型在ADDED,MODIFIED中,并且状态是UP的才更新缓存,其他情况都删除
136
+ if (
137
+ instance.find('actionType').text in ('ADDED', 'MODIFIED')
138
+ and instance.find('status').text.upper() == "UP"
139
+ ):
140
+ # 增量更新缓存
141
+ server_memo[app_name].add(addr)
142
+ else:
143
+ server_memo[app_name].delete(addr)
144
+
145
+ # 增量更新后 - 计算此时全量 apps__hashcode与本次增量请求获取到的的apps__hashcode是否相等
146
+ up_count = 0
147
+ for server_obj in list(server_memo.values()):
148
+ up_count += len(server_obj)
149
+ now_apps_hashcode = f'UP_{up_count}_'
150
+ if now_apps_hashcode != self.apps_hashcode: # 如果不相等,做全量更新
151
+ self.server_cache = await self._get_full_apps()
152
+ logger.opt(lazy=True).debug("DELTA-XML cache updated.")
153
+ return server_memo
154
+
155
+
156
+ Eureka = EurekaCli()