def handle(self, *args, **options):
     """
     access control register
     """
     app_name = get_settings_value("SERVICE_CONF").get("NAME", None)
     secret = get_settings_value("ACCESS_CONTROL").get("SECRET", None)
     api_path = get_settings_value("ACCESS_CONTROL").get(
         "REGISTER_API_PATH", None)
     service_conf = get_settings_value("ACCESS_CONTROL").get(
         "ACCESS_CONTROL_SERVICE", None)
     access_control_class_path = get_settings_value("ACCESS_CONTROL").get(
         "ACCESS_CONTROL_CLASS", None)
     if all([access_control_class_path, app_name, secret, service_conf]):
         access_control_cls = get_resource_cls()
         attribute_name_list = [
             _ for _ in dir(access_control_cls)
             if _.startswith('permission_')
         ]
         data = [
             getattr(access_control_cls, _) for _ in attribute_name_list
         ]
         payload = {"app_name": app_name, "secret": secret, "data": data}
         try:
             rest_client.post(service_conf, api_path=api_path, json=payload)
             print("resource register success!!!")
         except Exception as ex:
             print("resource register failed, message:{}".format(
                 ex.__str__()))
Esempio n. 2
0
 def test_post_err(self, mock_post):
     service_address = settings.SERVICE_ADDRESS
     try:
         rest_client.post(service_address=service_address, api_path=API_PATH, data=DATA)
     except Exception as ex:
         message = ex.__str__()
         self.assertEqual(message, 'rest_client error, service_name:sparrow_cloud, protocol:http, method:post, '
                                   'request_service_address:sparrow-test-svc:8000, api_path:/api/xxx/, message:')
Esempio n. 3
0
def register(api_list):
    sparrow_permission_register_conf = settings.SPARROW_PERMISSION_REGISTER_CONF
    api_path = sparrow_permission_register_conf['API_PATH']
    permission_service_conf = sparrow_permission_register_conf["PERMISSION_SERVICE"]
    try:
        rest_client.post(permission_service_conf, api_path, json=api_list)
        print("api 注册成功")
    except HTTPException as ex:
        print("api 注册失败. message={}, service_name={}".format(ex.detail, "SPARROW_PERMISSION_REGISTER_NAME"))
Esempio n. 4
0
 def test_post(self, acl_token, mock_post, mock_service):
     api_path = "/api/xxx/"
     data = {
         "key": "value",
     }
     from django.conf import settings
     settings.CONSUL_CLIENT_ADDR = {"HOST": "127.0.0.1", "PORT": 8500}
     settings.SERVICE_CONF = SERVICE_CONF
     try:
         rest_client.post(SERVICE_CONF, api_path, data=data)
     except Exception as ex:
         message = ex.__str__()
         self.assertEqual(
             message, 'rest_client error, service_name: , '
             'request_service:sprrow-permission-svc, api_path:/api/xxx/, message: '
         )
Esempio n. 5
0
def add_lock(key: str, expire_time: int, *args, **kwargs):
    """
        # ConfigMap:
            SC_SPARROW_DISTRIBUTED_LOCK_SVC
            SC_SPARROW_DISTRIBUTED_LOCK_API
    """
    service_conf = get_settings_value("SERVICE_CONF")
    service_name = service_conf.get("NAME", None)
    service_secret = service_conf.get("SECRET", None)
    if not service_name or not service_secret:
        raise Exception(
            "NAME or SECRET is not configured in SERVICE_CONF settings")
    data = {
        "service_name": service_name,
        "secret": service_secret,
        "key": key,
        "expire_time": expire_time,
    }
    try:
        res = rest_client.post(sc_distributed_lock_svc,
                               sc_distributed_lock_api,
                               json=data,
                               *args,
                               **kwargs)
        logging.info(
            "sparrow_cloud distributed lock add lock, data:{}".format(data))
        return res
    except HTTPException as ex:
        logging.error(
            "sparrow_cloud distributed lock add lock error: {}".format(ex))
        raise HTTPException(ex)
Esempio n. 6
0
def send_message(msg,
                 code_list,
                 channel="dingtalk",
                 message_type="text",
                 *args,
                 **kwargs):
    """钉钉群发消息机器人 client """
    if not isinstance(msg, str) and not isinstance(code_list, list):
        raise TypeError(
            "参数类型错误:msg type not string or code_list type not list")
    data = {
        "msg": msg,
        "group_code_list": code_list,
        "channel": channel,
        "message_type": message_type
    }
    sparrow_ding_talk_conf = get_settings_value("SPARROW_DING_TALK_CONF")
    try:
        res = rest_client.post(sparrow_ding_talk_conf["SERVICE_DING_TALK"],
                               sparrow_ding_talk_conf["PATH"],
                               data=data,
                               *args,
                               **kwargs)
        logging.info(
            "sparrow_cloud ding_talk send_message: msg:{}, group_code_list:{}".
            format(msg, code_list))
        return res
    except HTTPException as ex:
        logging.error(
            "sparrow_cloud ding_talk send_message error: {}".format(ex))
        raise HTTPException(ex)
Esempio n. 7
0
def get_app_token():
    """
    get app token
    REGISTRY_APP_CONF = {
        "SERVICE_ADDRESS": "sparrow-service-svc:8000",
        "PATH": "/api/get_app_token/",
        "ENABLE_TOKEN_CACHE": os.environ.get("ENABLE_TOKEN_CACHE", False)
    }
    :return:
    """
    app_token_key = get_hash_key(key_type="app")
    service_conf = get_settings_value("SERVICE_CONF")
    registry_app_conf = get_settings_value("REGISTRY_APP_CONF")
    enable_get_token_cache = registry_app_conf["ENABLE_TOKEN_CACHE"]
    if enable_get_token_cache:
        cache_app_token = cache.get(app_token_key)
        if cache_app_token:
            return cache_app_token["app_token"]
    try:
        data = {"name": service_conf["NAME"], "secret": service_conf["SECRET"]}
        data_to_send = json.dumps(data).encode("utf-8")
        app_token = rest_client.post(
            service_address=registry_app_conf["SERVICE_ADDRESS"],
            api_path=registry_app_conf["PATH"],
            timeout=0.5,
            data=data_to_send)
        cache.set(app_token_key, {'app_token': app_token},
                  timeout=app_token["expires_in"] - 120)
        return app_token["token"]
    except Exception as ex:
        raise Exception(
            'get_app_token error, no token available in cache and registry_app_error, '
            'message:{}'.format(ex.__str__()))
Esempio n. 8
0
 def update_task_result(self, task_id, consumer, **kwargs):
     # 如果出现消息结果更新失败的情况,需要等待interval_time时间间隔来重试
     interval_time = self._interval_time
     error_message = None
     for _ in range(self._retry_times):
         try:
             status = kwargs.get('status')
             data = {
                 "task_id": task_id,
                 "consumer": consumer,
                 "status": status,
                 "result": kwargs.get('result'),
                 "traceback": kwargs.get('traceback'),
             }
             # sparrow_task服务重启的过程中,可能会遇到连接失败的情况
             # 下次重试的时候需要通过consul重新获取新地址
             backend_service_conf = self._message_backend_conf.get(
                 'BACKEND_SERVICE_CONF', None)
             api_path = self._message_backend_conf.get('API_PATH', None)
             response = rest_client.post(backend_service_conf,
                                         api_path=api_path,
                                         json=data)
             logger.info(
                 ' [*] Update task database info task_id is {0}, status is {1}'
                 .format(task_id, status))
             return
         except Exception as ex:
             time.sleep(interval_time)
             interval_time += 2
             error_message = ex.__str__()
     raise Exception(
         "消息执行结果更新失败,消息id={}, 失败原因={},重试次数={},消息执行状态={},result={}, traceback={}"
         .format(task_id, error_message, self._retry_times, status,
                 kwargs.get('result'), kwargs.get('traceback')))
Esempio n. 9
0
def get_app_token():
    """
    get app token
    configmap:
        SC_MANAGE_SVC
        SC_MANAGE_API
    """
    app_token_key = get_hash_key(key_type="app")
    service_conf = get_settings_value("SERVICE_CONF")
    sc_manage_svc = get_cm_value("SC_MANAGE_SVC")
    sc_manage_api = get_cm_value("SC_MANAGE_API")
    try:
        cache_app_token = cache.get(app_token_key)
        if cache_app_token:
            return cache_app_token["app_token"]["token"]
        else:
            data = {
                "name": service_conf["NAME"],
                "secret": service_conf["SECRET"]
            }
            app_token = rest_client.post(service_address=sc_manage_svc,
                                         api_path=sc_manage_api,
                                         json=data)
            cache.set(app_token_key, {'app_token': app_token},
                      timeout=app_token["expires_in"] - 120)
            logger.info("sparrowcloud get app token: {}".format(
                app_token["token"]))
            return app_token["token"]
    except Exception as ex:
        raise Exception(
            'sparrowcloud/get_app_token error, no token available in cache and app_manage_error, '
            'message:{}'.format(ex.__str__()))
Esempio n. 10
0
def register(schema):
    sparrow_permission_register_conf = settings.SPARROW_SCHEMA_REGISTER_CONF
    api_path = sparrow_permission_register_conf['API_PATH']
    permission_service_conf = sparrow_permission_register_conf["SCHEMA_SERVICE"]
    try:
        r = rest_client.post(permission_service_conf, api_path, json=schema)
        print("schema 注册成功 resp body={}".format(r))
    except HTTPException as ex:
        print("schema 注册失败. message={} ".format(ex.detail))
Esempio n. 11
0
 def test_post(self, mock_post, mock_service):
     api_path = "/api/xxx/"
     data = {
         "key": "value",
     }
     from django.conf import settings
     settings.CONSUL_CLIENT_ADDR = {"HOST": "127.0.0.1", "PORT": 8500}
     settings.SERVICE_CONF = SERVICE_CONF
     res = rest_client.post(SERVICE_CONF, api_path, data=data)
     self.assertEqual(res, {'key1': 'value1'})
Esempio n. 12
0
def register(schema):
    '''
    configmap :
        SC_SCHEMA_SVC
        SC_SCHEMA_API
    '''
    sc_schema_svc = get_cm_value("SC_SCHEMA_SVC")
    sc_schema_api = get_cm_value("SC_SCHEMA_API")
    try:
        r = rest_client.post(sc_schema_svc, sc_schema_api, json=schema)
        print("schema 注册成功 resp body={}".format(r))
    except HTTPException as ex:
        print("schema 注册失败. message={} ".format(ex.detail))
Esempio n. 13
0
def send_message(msg_data,
                 code_type,
                 content_type="text",
                 msg_sender=None,
                 *args,
                 **kwargs):
    """
        # ConfigMap:
            SC_LY_MESSAGE
            SC_LY_MESSAGE_API
    """
    if msg_sender is None:
        msg_sender = get_service_name()
    sc_ly_message = get_cm_value("SC_LY_MESSAGE")
    sc_ly_message_api = get_cm_value("SC_LY_MESSAGE_API")
    data = {
        "shop_id": kwargs.pop("shop_id", None),
        "msg_sender": msg_sender,
        "code_type": code_type,
        "user_id_list": kwargs.pop("user_id_list", []),
        # msg数据格式是动态变化,由发送者根据服务要求填充发送该类型数据的必要数据
        # "msg": {
        #     "content_type": content_type,
        #     "data": msg_data
        # }
    }
    # 把kwargs里面剩余的有关数据放入msg中,发送的数据由服务发送者决定,此处不做校验
    msg = {"content_type": content_type, "data": msg_data}
    if kwargs.get("nickname"):
        msg.update({"nickname": kwargs.pop("nickname")})
    if kwargs.get("title"):
        msg.update({"title": kwargs.pop("title")})
    data.update({"msg": msg})
    try:
        res = rest_client.post(sc_ly_message,
                               sc_ly_message_api,
                               json=data,
                               *args,
                               **kwargs)
        logging.info(
            "sparrow_cloud ly_message send_message, data:{}, code_type:{}".
            format(data, code_type))
        return res
    except HTTPException as ex:
        logging.error(
            "sparrow_cloud ly_message send_message error: {}".format(ex))
        raise HTTPException(ex)
Esempio n. 14
0
def send_log(data):
    """
    :param data: dict
    :return:True, False
    """
    if not isinstance(data, dict):
        raise TypeError("参数类型错误:except=%s, get=%s" % ("dict", type(data)))
    service_conf = get_settings_value("SERVICE_CONF")
    service_log_conf = get_settings_value("SPARROW_SERVICE_LOG_CONF")
    data["service_name"] = service_conf["NAME"]
    try:
        response = post(service_log_conf["SERVICE_LOG"], service_log_conf["PATH"], data=data)
        logging.info("sparrow_cloud: service log sent successfully, message:{}".format(response))
        return True
    except HTTPException as ex:
        logging.error("sparrow_cloud: Service log sending failed, message:{}".format(ex.__str__()))
        return False
Esempio n. 15
0
def send_log(data):
    """
    :param data: dict
    :return:True, False
    """
    if not isinstance(data, dict):
        raise TypeError("参数类型错误:except=%s, get=%s" % ("dict", type(data)))
    data["service_name"] = get_service_name()
    service_log_svc = get_cm_value("SC_SERVICE_LOG_SVC")
    service_log_api = get_cm_value("SC_SERVICE_LOG_API")
    try:
        response = post(service_log_svc, service_log_api, data=data)
        logging.info(
            "sparrow_cloud: service log sent successfully, message:{}".format(
                response))
        return True
    except HTTPException as ex:
        logging.error(
            "sparrow_cloud: Service log sending failed, message:{}".format(
                ex.__str__()))
        return False
Esempio n. 16
0
def send_message(msg,
                 code_list,
                 channel="dingtalk",
                 message_type="text",
                 *args,
                 **kwargs):
    """
        群发消息机器人 client
        configmap:
            SC_MESSAGE_ROBOT
            SC_MESSAGE_ROBOT_API
    """
    if not isinstance(msg, str) and not isinstance(code_list, list):
        raise TypeError(
            "参数类型错误:msg type not string or code_list type not list")
    sc_message_robot = get_cm_value("SC_MESSAGE_ROBOT")
    sc_message_robot_api = get_cm_value("SC_MESSAGE_ROBOT_API")
    data = {
        "msg": msg,
        "group_code_list": code_list,
        "channel": channel,
        "message_type": message_type
    }
    try:
        res = rest_client.post(sc_message_robot,
                               sc_message_robot_api,
                               data=data,
                               *args,
                               **kwargs)
        logging.info(
            "sparrow_cloud ding_talk send_message: msg:{}, group_code_list:{}".
            format(msg, code_list))
        return res
    except HTTPException as ex:
        logging.error(
            "sparrow_cloud ding_talk send_message error: {}".format(ex))
        raise HTTPException(ex)
Esempio n. 17
0
 def test_post(self, mock_post):
     service_address = settings.SERVICE_ADDRESS
     res = rest_client.post(service_address=service_address, api_path=API_PATH, data=DATA)
     self.assertEqual(res, {'key1': 'value1'})