deepfos 1.1.76__tar.gz → 1.1.77__tar.gz
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.
- {deepfos-1.1.76 → deepfos-1.1.77}/CHANGELOG.md +8 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/PKG-INFO +1 -1
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/_version.py +3 -3
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/account.py +1 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/app.py +1 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/base.py +12 -1
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/platform.py +1 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/space.py +1 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/system.py +1 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/discovery.py +3 -0
- deepfos-1.1.77/deepfos/lib/k8s.py +101 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/options.py +19 -5
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos.egg-info/PKG-INFO +1 -1
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos.egg-info/SOURCES.txt +2 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/.gitattributes +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/.gitee/ISSUE_GUIDELINES.md +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/.gitee/ISSUE_TEMPLATE.md +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/.gitignore +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/MANIFEST.in +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/README.md +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/algo/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/algo/graph.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_1/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_1/business_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_1/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_1/models/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_1/models/business_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_1/models/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_2/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_2/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_2/models/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/V1_2/models/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/accounting_engines.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/approval_process.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/business_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/consolidation.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/consolidation_process.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/datatable.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/deep_pipeline.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/deepconnector.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/deepfos_task.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/deepmodel.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/financial_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/journal_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/journal_template.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/memory_financial_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/account.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/accounting_engines.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/app.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/approval_process.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/base.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/business_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/consolidation.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/consolidation_process.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/datatable_mysql.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/deep_pipeline.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/deepconnector.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/deepfos_task.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/deepmodel.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/financial_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/journal_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/journal_template.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/memory_financial_model.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/platform.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/python.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/reconciliation_engine.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/reconciliation_report.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/role_strategy.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/smartlist.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/space.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/system.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/variable.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/models/workflow.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/python.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/reconciliation_engine.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/reconciliation_report.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/role_strategy.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/smartlist.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/variable.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/api/workflow.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/boost/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/boost/jstream.c +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/boost/jstream.pyx +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/boost/pandas.c +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/boost/pandas.pyx +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/boost/py_jstream.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/boost/py_pandas.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/cache.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/config.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/_base.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/constants.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/cube.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/formula.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/syscube.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/typing.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/cube/utils.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/_base.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/dimcreator.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/dimexpr.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/dimmember.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/eledimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/filters.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/dimension/sysdimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/logictable/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/logictable/_cache.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/logictable/_operator.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/logictable/nodemixin.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/logictable/sqlcondition.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/core/logictable/tablemodel.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/cipher.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/clickhouse.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/connector.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/daclickhouse.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/dameng.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/damysql.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/dbkits.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/deepengine.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/deepmodel.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/deepmodel_kingbase.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/edb.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/gauss.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/kingbase.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/mysql.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/oracle.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/postgresql.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/sqlserver.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/db/utils.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/accounting.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/apvlprocess.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/base.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/bizmodel.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/datatable.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/deep_pipeline.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/deepconnector.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/deepmodel.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/dimension.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/fact_table.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/finmodel.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/journal.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/journal_template.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/pyscript.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/reconciliation.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/rolestrategy.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/smartlist.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/variable.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/element/workflow.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/exceptions/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/exceptions/hook.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lazy.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/__init__.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/_javaobj.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/asynchronous.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/concurrency.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/constant.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/decorator.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/deepchart.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/deepux.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/edb_lexer.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/eureka.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/filterparser.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/httpcli.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/jsonstreamer.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/msg.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/nacos.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/patch.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/redis.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/serutils.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/stopwatch.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/subtask.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/sysutils.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/lib/utils.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/local.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos/translation.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos.egg-info/dependency_links.txt +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos.egg-info/not-zip-safe +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos.egg-info/requires.txt +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/deepfos.egg-info/top_level.txt +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/requirements.txt +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/setup.cfg +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/setup.py +0 -0
- {deepfos-1.1.76 → deepfos-1.1.77}/versioneer.py +0 -0
|
@@ -8,11 +8,11 @@ import json
|
|
|
8
8
|
|
|
9
9
|
version_json = '''
|
|
10
10
|
{
|
|
11
|
-
"date": "2025-
|
|
11
|
+
"date": "2025-12-05T02:41:19+0000",
|
|
12
12
|
"dirty": false,
|
|
13
13
|
"error": null,
|
|
14
|
-
"full-revisionid": "
|
|
15
|
-
"version": "1.1.
|
|
14
|
+
"full-revisionid": "bd3d3dac6c3b6e4d9a695174c9064820da0912b6",
|
|
15
|
+
"version": "1.1.77"
|
|
16
16
|
}
|
|
17
17
|
''' # END VERSION_JSON
|
|
18
18
|
|
|
@@ -120,6 +120,7 @@ class UserImport(ChildAPI):
|
|
|
120
120
|
class AccountAPI(RootAPI):
|
|
121
121
|
"""账户中心"""
|
|
122
122
|
prefix = lambda: OPTION.server.account
|
|
123
|
+
server_name = "seepln-account"
|
|
123
124
|
|
|
124
125
|
def __init__(self, *args, **kwargs):
|
|
125
126
|
super(self.__class__.__base__, self).__init__(*args, **kwargs)
|
|
@@ -722,6 +722,7 @@ class RootAPI:
|
|
|
722
722
|
api_version = None
|
|
723
723
|
cls_name = None
|
|
724
724
|
module_name = None
|
|
725
|
+
server_name = None
|
|
725
726
|
builtin = True
|
|
726
727
|
|
|
727
728
|
if TYPE_CHECKING: # pragma: no cover
|
|
@@ -859,7 +860,17 @@ class RootAPI:
|
|
|
859
860
|
|
|
860
861
|
"""
|
|
861
862
|
clz = cls.resolve_cls(sync, SyncAPIBase, AsyncAPIBase)
|
|
862
|
-
|
|
863
|
+
if (
|
|
864
|
+
OPTION.discovery.enabled
|
|
865
|
+
and OPTION.discovery.take_over
|
|
866
|
+
and cls.server_name is not None
|
|
867
|
+
):
|
|
868
|
+
discovery = ServiceDiscovery.instantiate()
|
|
869
|
+
prefix = discovery.sync_get_url(cls.server_name)
|
|
870
|
+
else:
|
|
871
|
+
prefix = cls.prefix()
|
|
872
|
+
|
|
873
|
+
ins = clz(header=header, prefix=prefix)
|
|
863
874
|
ins.sync = sync
|
|
864
875
|
ins.multi_version = cls.multi_version
|
|
865
876
|
ins.default_version = cls.default_version
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
from functools import cached_property
|
|
4
|
+
from typing import TypedDict, Literal, Type, Dict, FrozenSet
|
|
5
|
+
|
|
6
|
+
from loguru import logger
|
|
7
|
+
from kubernetes_asyncio import client, config
|
|
8
|
+
from kubernetes_asyncio.client import (
|
|
9
|
+
V1ServiceList,
|
|
10
|
+
V1Endpoints,
|
|
11
|
+
V1EndpointSubset,
|
|
12
|
+
V1EndpointAddress,
|
|
13
|
+
CoreV1EndpointPort,
|
|
14
|
+
)
|
|
15
|
+
from deepfos.lib.discovery import ServiceDiscovery
|
|
16
|
+
from deepfos import OPTION
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class K8s(ServiceDiscovery):
|
|
20
|
+
def __init__(self):
|
|
21
|
+
super().__init__()
|
|
22
|
+
self._instance_lock: Dict[str, asyncio.Lock] = defaultdict(asyncio.Lock)
|
|
23
|
+
self._server_lock = asyncio.Lock()
|
|
24
|
+
self._cares = set()
|
|
25
|
+
self._ns = OPTION.k8s.namespace
|
|
26
|
+
|
|
27
|
+
async def on_close(self):
|
|
28
|
+
self._cares.clear()
|
|
29
|
+
self.server_cache.clear()
|
|
30
|
+
self._instance_lock.clear()
|
|
31
|
+
|
|
32
|
+
async def on_startup(self):
|
|
33
|
+
config.load_incluster_config()
|
|
34
|
+
|
|
35
|
+
@cached_property
|
|
36
|
+
def _api(self):
|
|
37
|
+
return client.CoreV1Api()
|
|
38
|
+
|
|
39
|
+
async def on_interval(self):
|
|
40
|
+
await self._update_cache()
|
|
41
|
+
|
|
42
|
+
async def _update_cache(self):
|
|
43
|
+
logger.opt(lazy=True).debug(f"Update cache for instance: {self._cares}")
|
|
44
|
+
await asyncio.gather(*(
|
|
45
|
+
self.update_instance_for_service(sn)
|
|
46
|
+
for sn in self._cares
|
|
47
|
+
))
|
|
48
|
+
|
|
49
|
+
async def update_service_cache(self, server_name: str):
|
|
50
|
+
async with self._server_lock:
|
|
51
|
+
if server_name not in self.server_cache:
|
|
52
|
+
await self.update_services()
|
|
53
|
+
|
|
54
|
+
async def update_instance_cache(self, server_name):
|
|
55
|
+
self._cares.add(server_name)
|
|
56
|
+
await self.update_instance_for_service(server_name)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async def _list_all_service_names(self) -> FrozenSet[str]:
|
|
60
|
+
svcs: V1ServiceList = await self._api.list_namespaced_service(self._ns)
|
|
61
|
+
return frozenset(svc.metadata.name for svc in svcs.items)
|
|
62
|
+
|
|
63
|
+
async def update_services(self):
|
|
64
|
+
new_services = await self._list_all_service_names()
|
|
65
|
+
cur_services = frozenset(self.server_cache.keys())
|
|
66
|
+
|
|
67
|
+
if added := new_services - cur_services:
|
|
68
|
+
for srv in added:
|
|
69
|
+
self.server_cache.__getitem__(srv)
|
|
70
|
+
logger.debug(f"Added services: {added}")
|
|
71
|
+
|
|
72
|
+
if removed := cur_services - new_services:
|
|
73
|
+
for srv in removed:
|
|
74
|
+
self.server_cache.pop(srv)
|
|
75
|
+
self._instance_lock.pop(srv, None) # noqa
|
|
76
|
+
logger.debug(f"Removed servieces: {removed}")
|
|
77
|
+
|
|
78
|
+
async def update_instance_for_service(self, server_name: str):
|
|
79
|
+
endpoints: V1Endpoints = await self._api.read_namespaced_endpoints(
|
|
80
|
+
server_name,
|
|
81
|
+
self._ns,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
no_active_nodes = True
|
|
85
|
+
async with self._instance_lock[server_name]:
|
|
86
|
+
cache = self.server_cache[server_name]
|
|
87
|
+
|
|
88
|
+
for subset in endpoints.subsets or []:
|
|
89
|
+
subset: V1EndpointSubset
|
|
90
|
+
for addr in subset.addresses or []:
|
|
91
|
+
addr: V1EndpointAddress
|
|
92
|
+
no_active_nodes = False
|
|
93
|
+
for port in subset.ports:
|
|
94
|
+
port: CoreV1EndpointPort
|
|
95
|
+
url = f"{port.name}://{addr.ip}:{port.port}"
|
|
96
|
+
cache.add(url)
|
|
97
|
+
|
|
98
|
+
if no_active_nodes:
|
|
99
|
+
logger.debug(f"{server_name} has no active endpoint, clear invalid...")
|
|
100
|
+
for item in list(cache):
|
|
101
|
+
cache.delete(item)
|
|
@@ -115,7 +115,8 @@ def _ensure_discovery_server_is_set(value):
|
|
|
115
115
|
impl = OPTION.discovery.implementation
|
|
116
116
|
server_opt = {
|
|
117
117
|
'eureka': OPTION.server.eureka,
|
|
118
|
-
'nacos': OPTION.nacos.server
|
|
118
|
+
'nacos': OPTION.nacos.server,
|
|
119
|
+
'k8s': OPTION.k8s.namespace,
|
|
119
120
|
}[impl]
|
|
120
121
|
|
|
121
122
|
if server_opt is None:
|
|
@@ -379,9 +380,9 @@ class _Category:
|
|
|
379
380
|
class _Server(_Category):
|
|
380
381
|
__id__ = 'server_url'
|
|
381
382
|
|
|
382
|
-
base = _Option('http://', val_type=str)
|
|
383
|
+
base = _Option('http://web-gateway', val_type=str)
|
|
383
384
|
app = _Option('http://app-server', val_type=str)
|
|
384
|
-
account = _Option('http://account
|
|
385
|
+
account = _Option('http://seepln-account', val_type=str)
|
|
385
386
|
system = _Option('http://system-server', val_type=str)
|
|
386
387
|
space = _Option('http://space-server', val_type=str)
|
|
387
388
|
platform_file = _Option('http://platform-file-server', val_type=str)
|
|
@@ -484,16 +485,18 @@ class _Boost(_Category):
|
|
|
484
485
|
class _ServiceDiscovery(_Category):
|
|
485
486
|
__id__ = 'service_discovery'
|
|
486
487
|
|
|
487
|
-
#:
|
|
488
|
+
#: 是否使用服务发现功能(仅影响DynamicAPI)
|
|
488
489
|
enabled = _Option(False, val_type=bool, on_set=_ensure_discovery_server_is_set)
|
|
489
490
|
#: 服务注册发现使用的实现
|
|
490
|
-
implementation = _Option('eureka', val_type=str, val_choices=('eureka', 'nacos'))
|
|
491
|
+
implementation = _Option('eureka', val_type=str, val_choices=('eureka', 'nacos', 'k8s'))
|
|
491
492
|
#: 服务注册发现使用的缓存策略
|
|
492
493
|
cache_strategy = _Option(
|
|
493
494
|
'ranked',
|
|
494
495
|
val_type=str,
|
|
495
496
|
val_choices=('ranked', 'roundrobin', 'random')
|
|
496
497
|
)
|
|
498
|
+
#: 是否完全使用服务发现获取请求地址(包括Root API)
|
|
499
|
+
take_over = _Option(False, val_type=bool)
|
|
497
500
|
|
|
498
501
|
def __get__(self, instance, owner) -> '_ServiceDiscovery':
|
|
499
502
|
"""defined to help ide"""
|
|
@@ -513,6 +516,16 @@ class _Nacos(_Category):
|
|
|
513
516
|
return super().__get__(instance, owner)
|
|
514
517
|
|
|
515
518
|
|
|
519
|
+
class _Kubernets(_Category):
|
|
520
|
+
"""Nacos 相关配置"""
|
|
521
|
+
|
|
522
|
+
namespace = _Option(None, val_type=str)
|
|
523
|
+
|
|
524
|
+
def __get__(self, instance, owner) -> '_Kubernets':
|
|
525
|
+
"""defined to help ide"""
|
|
526
|
+
return super().__get__(instance, owner)
|
|
527
|
+
|
|
528
|
+
|
|
516
529
|
# -----------------------------------------------------------------------------
|
|
517
530
|
# Options
|
|
518
531
|
class _GlobalOptions:
|
|
@@ -525,6 +538,7 @@ class _GlobalOptions:
|
|
|
525
538
|
discovery = _ServiceDiscovery()
|
|
526
539
|
nacos = _Nacos()
|
|
527
540
|
edgedb = _Edgedb()
|
|
541
|
+
k8s = _Kubernets()
|
|
528
542
|
|
|
529
543
|
def load_file(self, filepath):
|
|
530
544
|
parser = configparser.ConfigParser()
|
|
@@ -167,6 +167,7 @@ versioneer.py
|
|
|
167
167
|
./deepfos/lib/filterparser.py
|
|
168
168
|
./deepfos/lib/httpcli.py
|
|
169
169
|
./deepfos/lib/jsonstreamer.py
|
|
170
|
+
./deepfos/lib/k8s.py
|
|
170
171
|
./deepfos/lib/msg.py
|
|
171
172
|
./deepfos/lib/nacos.py
|
|
172
173
|
./deepfos/lib/patch.py
|
|
@@ -348,6 +349,7 @@ deepfos/lib/eureka.py
|
|
|
348
349
|
deepfos/lib/filterparser.py
|
|
349
350
|
deepfos/lib/httpcli.py
|
|
350
351
|
deepfos/lib/jsonstreamer.py
|
|
352
|
+
deepfos/lib/k8s.py
|
|
351
353
|
deepfos/lib/msg.py
|
|
352
354
|
deepfos/lib/nacos.py
|
|
353
355
|
deepfos/lib/patch.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|