Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 31 additions & 31 deletions fab_admin/addon/confcenter/views_confcenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
@author: chenwen9
"""
import logging
from app import appbuilder, autodoc, redis_master, redis_slave
from app import appbuilder, autodoc, redis_main, redis_subordinate
from fab_admin.models import ConfItem
from flask_appbuilder.baseviews import expose, BaseView
from flask_appbuilder.security.decorators import has_access_api, permission_name
Expand Down Expand Up @@ -32,10 +32,10 @@ class ConfCenterView(BaseView):
def add_project(self, project=None):
"""Add confcenter project api method."""
if project and not ' ' in project:
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project):
return jsonify({'message': 'project name exists'}), 400
else:
pipe = redis_master.pipeline()
pipe = redis_main.pipeline()
pipe.sadd(CONF_PROJECTS_KEY_FORMAT, project)
pipe.sadd(CONF_PROJECT_WRITE_PERM_FORMAT.format(p=project), g.user.username)
pipe.sadd(CONF_PROJECT_READ_PERM_FORMAT.format(p=project), g.user.username)
Expand All @@ -52,7 +52,7 @@ def get_projects(self):
"""fetch all of the project lists by permission."""
#---scan the projects key
available_proj = []
for proj in redis_slave.sscan_iter(CONF_PROJECTS_KEY_FORMAT):
for proj in redis_subordinate.sscan_iter(CONF_PROJECTS_KEY_FORMAT):
if self._check_conf_permission(proj, 'read'):
available_proj.append(proj)
return jsonify({'code': 200, 'data': available_proj})
Expand All @@ -62,7 +62,7 @@ def get_projects(self):
@permission_name('confcenterWrite')
def add_configs_byproject(self, project):
"""add config item by project api method."""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project):
if self._check_conf_permission(project, 'write'):
data = request.get_json()
if data.get('name') and data.get('value'):
Expand All @@ -73,7 +73,7 @@ def add_configs_byproject(self, project):
value = data.get('value')
item = ConfItem(project, data.get('name'), value)
#---we are going to use rejson to wrap the use custmize config item value into JSON type
pipe = redis_master.pipeline()
pipe = redis_main.pipeline()
pipe.jsonset(CONF_KEY_FORMAT.format(p=project, k=data.get('name')), '.', item)
pipe.sadd(CONF_PROJECT_KEYSET_FORMAT.format(p=project), data.get('name'))
pipe.execute()
Expand All @@ -94,24 +94,24 @@ def add_configs_byproject(self, project):
@permission_name('confcenterWrite')
def update_configs_byproject(self, project):
"""update config value by project and config key."""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if self._check_conf_permission(project, 'write'):
data = request.get_json()
if data.get('name') and data.get('value'):
if self._check_conf_exists(project, data['name']):
#---key history is a kind of json list, which item is one of the ConfItem value.
ori_item = redis_slave.jsonget(CONF_KEY_FORMAT.format(p=project, k=data.get('name')))
if redis_slave.exists(CONF_KEY_HISTORY_LIST_FORMAT.format(p=project, k=data.get('name'))):
redis_master.jsonarrinsert(CONF_KEY_HISTORY_LIST_FORMAT.format(p=project, \
ori_item = redis_subordinate.jsonget(CONF_KEY_FORMAT.format(p=project, k=data.get('name')))
if redis_subordinate.exists(CONF_KEY_HISTORY_LIST_FORMAT.format(p=project, k=data.get('name'))):
redis_main.jsonarrinsert(CONF_KEY_HISTORY_LIST_FORMAT.format(p=project, \
k=data.get('name')), '.', 0, ori_item)
else:
redis_master.jsonset(CONF_KEY_HISTORY_LIST_FORMAT.format(p=project, k=data.get('name')), \
redis_main.jsonset(CONF_KEY_HISTORY_LIST_FORMAT.format(p=project, k=data.get('name')), \
'.', [ori_item])
try:
value = json.loads(data.get('value'))
except Exception:
value = data.get('value')
pipe = redis_master.pipeline()
pipe = redis_main.pipeline()
pipe.jsonset(CONF_KEY_FORMAT.format(p=project, k=data.get('name')), '.value', value)
pipe.jsonset(CONF_KEY_FORMAT.format(p=project, k=data.get('name')), '.changed_on', time.time())
pipe.jsonset(CONF_KEY_FORMAT.format(p=project, k=data.get('name')), '.changed_by', \
Expand Down Expand Up @@ -150,10 +150,10 @@ def get_config_byproject(self, project, name):
}
}
"""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if self._check_conf_permission(project, 'read'):
try:
value = redis_slave.jsonget(CONF_KEY_FORMAT.format(p=project, k=name), '.value')
value = redis_subordinate.jsonget(CONF_KEY_FORMAT.format(p=project, k=name), '.value')
if value:
return jsonify({'data': value})
else:
Expand All @@ -171,12 +171,12 @@ def get_config_byproject(self, project, name):
@permission_name('confcenterRead')
def get_allconfig_byproject(self, project):
"""get all config item by project name."""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if self._check_conf_permission(project, 'read'):
try:
confs = []
for key in redis_slave.sscan_iter(CONF_PROJECT_KEYSET_FORMAT.format(p=project)):
confs.append(redis_slave.jsonget(CONF_KEY_FORMAT.format(p=project, k=key)))
for key in redis_subordinate.sscan_iter(CONF_PROJECT_KEYSET_FORMAT.format(p=project)):
confs.append(redis_subordinate.jsonget(CONF_KEY_FORMAT.format(p=project, k=key)))
return jsonify({'data': confs})
except Exception as e:
log.error(e)
Expand All @@ -190,9 +190,9 @@ def get_allconfig_byproject(self, project):
@has_access_api
def get_project_permission(self, project):
"""get the project permission list reader and writer."""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
writer = redis_slave.smembers(CONF_PROJECT_WRITE_PERM_FORMAT.format(p=project))
reader = redis_slave.smembers(CONF_PROJECT_READ_PERM_FORMAT.format(p=project))
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
writer = redis_subordinate.smembers(CONF_PROJECT_WRITE_PERM_FORMAT.format(p=project))
reader = redis_subordinate.smembers(CONF_PROJECT_READ_PERM_FORMAT.format(p=project))
return jsonify({"reader": list(reader), "writer": list(writer)})
else:
return jsonify({'message': 'project doesn\'t exists'}), 400
Expand All @@ -201,7 +201,7 @@ def get_project_permission(self, project):
@has_access_api
def update_project_permission(self, project):
"""update project permission list by project and the permision catagory."""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
data = request.get_json()
if data.get('perm') and data.get('users'):
if data.get('perm') == 'write':
Expand All @@ -210,7 +210,7 @@ def update_project_permission(self, project):
conf_proj_perm_key = CONF_PROJECT_READ_PERM_FORMAT
else:
return jsonify({'message': 'wrong permission params'}), 400
pipe = redis_master.pipeline()
pipe = redis_main.pipeline()
pipe.delete(conf_proj_perm_key.format(p=project))
pipe.sadd(conf_proj_perm_key.format(p=project), *data.get('users'))
pipe.execute()
Expand All @@ -227,13 +227,13 @@ def update_project_permission(self, project):
@permission_name('confcenterWrite')
def del_config_byproject(self, project, name):
"""delte config by project name."""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if self._check_conf_permission(project, 'write'):
try:
#----delete the project item and its history
del_keys = [CONF_KEY_FORMAT.format(p=project, k=name), \
CONF_KEY_HISTORY_LIST_FORMAT.format(p=project, k=name)]
pipe = redis_master.pipeline()
pipe = redis_main.pipeline()
pipe.delete(*del_keys)
pipe.srem(CONF_PROJECT_KEYSET_FORMAT.format(p=project), name)
pipe.execute()
Expand All @@ -253,18 +253,18 @@ def del_config_byproject(self, project, name):
@permission_name('confcenterWrite')
def del_project_byname(self, project):
"""delte all the project by name."""
if redis_slave.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if redis_subordinate.sismember(CONF_PROJECTS_KEY_FORMAT, project.strip()):
if self._check_conf_permission(project, 'write'):
try:
#----get this projects keyset
keys = redis_slave.smembers(CONF_PROJECT_KEYSET_FORMAT.format(p=project))
keys = redis_subordinate.smembers(CONF_PROJECT_KEYSET_FORMAT.format(p=project))
for name in keys:
del_keys = [CONF_KEY_FORMAT.format(p=project, k=name), CONF_KEY_HISTORY_LIST_FORMAT. \
format(p=project, k=name)]
redis_master.delete(*del_keys)
redis_master.delete(CONF_PROJECT_KEYSET_FORMAT.format(p=project), CONF_PROJECT_WRITE_PERM_FORMAT. \
redis_main.delete(*del_keys)
redis_main.delete(CONF_PROJECT_KEYSET_FORMAT.format(p=project), CONF_PROJECT_WRITE_PERM_FORMAT. \
format(p=project), CONF_PROJECT_READ_PERM_FORMAT.format(p=project))
redis_master.srem(CONF_PROJECTS_KEY_FORMAT, project)
redis_main.srem(CONF_PROJECTS_KEY_FORMAT, project)
log.info("Successfully delete project byname for project {p} by {u}".format(p=project, \
u=g.user.username))
return jsonify({'message': 'success'})
Expand All @@ -282,11 +282,11 @@ def _check_conf_permission(self, project, perm):
for role in g.user.roles:
if appbuilder.get_app.config['AUTH_ROLE_ADMIN'] == role.name:
return True
return redis_slave.sismember("cfg:{0}:perm:{1}".format(project, perm), g.user.username)
return redis_subordinate.sismember("cfg:{0}:perm:{1}".format(project, perm), g.user.username)

def _check_conf_exists(self, project, key):
"""inner method check config exists or not."""
return redis_slave.exists(CONF_KEY_FORMAT.format(p=project, k=key))
return redis_subordinate.exists(CONF_KEY_FORMAT.format(p=project, k=key))


appbuilder.add_view_no_menu(ConfCenterView)
4 changes: 2 additions & 2 deletions fab_admin/addon/sse/sse.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,8 @@ def redis(self):
# if not redis_url:
# raise KeyError("Must set a redis connection URL in app config.")
# return StrictRedis.from_url(redis_url)
sse_master = current_app.extensions['sse_master']
return sse_master
sse_main = current_app.extensions['sse_main']
return sse_main

def publish(self, data, type=None, id=None, retry=None, channel='sse'):
"""
Expand Down
12 changes: 6 additions & 6 deletions fab_admin/app_templates/app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@
autodoc = app.extensions['autodoc']
app.config.setdefault('REDIS_ENCODER', CustomJsonEncoder())
# primary redis clients
redis_master, redis_slave = redis_sentinel_client_factory(app, service_name=app.config['REDISSN'])
redis_main, redis_subordinate = redis_sentinel_client_factory(app, service_name=app.config['REDISSN'])
# sse redis client
sse_master, _ = redis_sentinel_client_factory(app, service_name=app.config['REDISSN'], config_prefix='SSE_REDIS')
app.extensions['sse_master'] = sse_master
sse_main, _ = redis_sentinel_client_factory(app, service_name=app.config['REDISSN'], config_prefix='SSE_REDIS')
app.extensions['sse_main'] = sse_main
# rq redis client
rq_redis_master, _ = redis_sentinel_client_factory(app, service_name=app.config['REDISSN'], config_prefix='RQ_REDIS')
rq = RQ(app, client=rq_redis_master)
rq_redis_main, _ = redis_sentinel_client_factory(app, service_name=app.config['REDISSN'], config_prefix='RQ_REDIS')
rq = RQ(app, client=rq_redis_main)
from . import views, models
if app.config.get('AUTO_UPDATE_PERM'):
Base.metadata.create_all(appbuilder.get_session.get_bind(mapper=None, clause=None))
Expand Down Expand Up @@ -67,7 +67,7 @@ def load_user_from_request(request):
from flask_appbuilder.security.sqla.models import Role
if appbuilder.get_app.config['FAB_AUTH_REDIS_CACHE']:
# API-KEY auth and Redis cache enable
user_dict = redis_slave.jsonget(appbuilder.get_app.config['FAB_AUTH_REDIS_UAPIK_KEY'], \
user_dict = redis_subordinate.jsonget(appbuilder.get_app.config['FAB_AUTH_REDIS_UAPIK_KEY'], \
".apikey_{0}".format(api_key))
if not user_dict:
raise Exception("cache missed")
Expand Down
4 changes: 2 additions & 2 deletions fab_admin/app_templates/app/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def say_hi():
# @cli_app.command("syncauth")
# def sync_auth_redis():
# """Try to sync fab auth structure data into redis"""
# from . import redis_master
# from . import redis_main
# from fab_admin.models import MyUser
# from sqlalchemy.orm import joinedload
# from flask_appbuilder.security.sqla.models import Role, PermissionView, Permission, ViewMenu
Expand Down Expand Up @@ -64,7 +64,7 @@ def say_hi():
# r_pv[json_key].append(r[1])
# else:
# r_pv[json_key] = [r[1]]
# pipe = redis_master.pipeline()
# pipe = redis_main.pipeline()
# pipe.jsonset(appbuilder.get_app.config['FAB_AUTH_REDIS_UAPIK_KEY'], '.', u_apik)
# pipe.jsonset(appbuilder.get_app.config['FAB_AUTH_REDIS_RPV_KEY'], '.', r_pv)
# pipe.expire(appbuilder.get_app.config['FAB_AUTH_REDIS_UAPIK_KEY'], 360)
Expand Down
2 changes: 1 addition & 1 deletion fab_admin/app_templates/app/config_prod.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
SECURITY_CLEANUP = False
AUTO_UPDATE_PERM = os.environ.get('AUTO_UPDATE_PERM', False)
# redis credential on prod
REDISSN = 'mymaster'
REDISSN = 'mymain'
REDISPASS = os.environ.get('REDIS_PASSWORD', config_local.REDISPASS if config_local else None)
REDIS_URL = os.environ.get('REDIS_URL', \
"redis+sentinel://:{0}@localhost:6379/{1}/0".format(REDISPASS, REDISSN))
Expand Down
2 changes: 1 addition & 1 deletion fab_admin/app_templates/app/config_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
SECURITY_CLEANUP = False
AUTO_UPDATE_PERM = os.environ.get('AUTO_UPDATE_PERM', False)
# redis credential on prod
REDISSN = 'mymaster'
REDISSN = 'mymain'
REDISPASS = os.environ.get('REDIS_PASSWORD', config_local.REDISPASS if config_local else None)
REDIS_URL = os.environ.get('REDIS_URL', \
"redis+sentinel://:{0}@localhost:26379/{1}/0".format(REDISPASS, REDISSN))
Expand Down
2 changes: 1 addition & 1 deletion fab_admin/app_templates/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
class config(config_base.config):
"""Customize your config."""
SECRET_KEY = '{* secret_key *}'
REDISSN = 'mymaster'
REDISSN = 'mymain'
REDISPASS = os.environ.get('REDIS_PASSWORD', config_local.REDISPASS if config_local else None)
# default just use Redis schema, but we support for redis+sentinel schema
REDIS_URL = os.environ.get('REDIS_URL', \
Expand Down
4 changes: 2 additions & 2 deletions fab_admin/app_templates/config_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ class config(config.config):
COMMON_LOCAL_USER_VIEW = ['UserInfoEditView', 'ResetMyPasswordView']

#---config center config items
REDISSN = 'mymaster'
REDISSN = 'mymain'
REDISPASS = os.environ.get('REDIS_PASSWORD', config_local.REDISPASS if config_local else None)
REDIS_URL = os.environ.get('REDIS_URL', \
"redis+sentinel://:{0}@localhost:26379/{1}/0".format(REDISPASS, REDISSN))
Expand All @@ -176,7 +176,7 @@ class config(config.config):
RQ_REDIS_URL = os.environ.get('RQ_REDIS_URL', \
"redis+sentinel://:{0}@localhost:26379/{1}/2".format(REDISPASS, REDISSN))
RQ_DASHBOARD_REDIS_SENTINELS = 'localhost:26379'
RQ_DASHBOARD_REDIS_MASTER_NAME = 'mymaster'
RQ_DASHBOARD_REDIS_MASTER_NAME = 'mymain'
RQ_DASHBOARD_REDIS_PASSWORD = REDISPASS
RQ_DASHBOARD_REDIS_DB = '2'
RQ_DASHBOARD_POLL_INTERVAL = 2500 # : Web interface poll period for updates in ms
Expand Down
6 changes: 3 additions & 3 deletions fab_admin/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
@cli_app.command("ssehb")
def sse_heart_beat():
"""The heart beat command to check the invalid subscribe."""
from app import appbuilder, redis_master
from app import appbuilder, redis_main
from fab_admin.addon.sse import sse
import datetime
click.echo('{0}:start sse heart beat polling.'.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
Expand All @@ -30,7 +30,7 @@ def sse_heart_beat():
@cli_app.command("syncauth")
def sync_auth_redis():
"""Try to sync fab auth structure data into redis"""
from app import appbuilder, redis_master
from app import appbuilder, redis_main
from fab_admin.models import MyUser
from sqlalchemy.orm import joinedload
from flask_appbuilder.security.sqla.models import Role, PermissionView, Permission, ViewMenu
Expand Down Expand Up @@ -60,7 +60,7 @@ def sync_auth_redis():
r_pv[json_key].append(r[1])
else:
r_pv[json_key] = [r[1]]
pipe = redis_master.pipeline()
pipe = redis_main.pipeline()
pipe.jsonset(appbuilder.get_app.config['FAB_AUTH_REDIS_UAPIK_KEY'], '.', u_apik)
pipe.jsonset(appbuilder.get_app.config['FAB_AUTH_REDIS_RPV_KEY'], '.', r_pv)
pipe.expire(appbuilder.get_app.config['FAB_AUTH_REDIS_UAPIK_KEY'], 360)
Expand Down
4 changes: 2 additions & 2 deletions fab_admin/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ class config(object):
COMMON_LOCAL_USER_VIEW = ['UserInfoEditView', 'ResetMyPasswordView']

#---config center config items
REDISSN = 'mymaster'
REDISSN = 'mymain'
REDISPASS = os.environ.get('REDIS_PASSWORD', config_local.REDISPASS if config_local else None)
REDIS_URL = os.environ.get('REDIS_URL', "redis+sentinel://:{0}@localhost:26379/{1}/0".format(REDISPASS, REDISSN))
REDIS_DECODE_RESPONSES = True
Expand All @@ -172,7 +172,7 @@ class config(object):
RQ_REDIS_URL = os.environ.get('RQ_REDIS_URL', \
"redis+sentinel://:{0}@localhost:26379/{1}/2".format(REDISPASS, REDISSN))
RQ_DASHBOARD_REDIS_SENTINELS = 'localhost:26379'
RQ_DASHBOARD_REDIS_MASTER_NAME = 'mymaster'
RQ_DASHBOARD_REDIS_MASTER_NAME = 'mymain'
RQ_DASHBOARD_REDIS_PASSWORD = REDISPASS
RQ_DASHBOARD_REDIS_DB = '2'
RQ_DASHBOARD_POLL_INTERVAL = 2500 # : Web interface poll period for updates in ms
Expand Down
Loading