示例#1
0
def set_data_replace_reserv_var():
    """
    置換処理のテストに必要なデータをDBに登録
    """

    now = datetime.datetime.now(pytz.timezone('UTC'))

    trace_id = EventsRequestCommon.generate_trace_id(now)
    rhdm_response_action = None
    action_history = None

    try:
        with transaction.atomic():

            # イベントリクエスト
            events_request = EventsRequest(
                trace_id=trace_id,
                request_type_id=1,
                rule_type_id=1,
                request_reception_time=now,
                request_user='******',
                request_server='pytest_server',
                event_to_time=now,
                event_info='{"EVENT_INFO":["置換テスト"]}',
                status='1',
                status_update_id='pytest_id',
                retry_cnt=0,
                last_update_timestamp=now,
                last_update_user='******')
            events_request.save(force_insert=True)

    except Exception as e:
        print(e)

    return events_request
示例#2
0
def test_generate_trace_id_ok():
    """
    トレースID生成テスト
    ※正常系
    """

    trace_id = EventsRequestCommon.generate_trace_id()

    assert len(trace_id) == 55
示例#3
0
def test_check_events_request_len_ng_errlen():
    """
    イベント情報チェック
    ※異常系(データなし)
    """

    req = {
        'eventinfo' : ['pytest1', 'pytest2']
    }

    result = EventsRequestCommon.check_events_request_len(req, 1)

    assert result == EventsRequestCommon.REQUEST_ERR_EVINFO_LENGTH
示例#4
0
def test_check_events_request_len_ng_notlist():
    """
    イベント情報チェック
    ※異常系(データなし)
    """

    req = {
        'eventinfo' : 'pytest1'
    }

    result = EventsRequestCommon.check_events_request_len(req, 1)

    assert result == EventsRequestCommon.REQUEST_ERR_EVINFO_TYPE
示例#5
0
def test_check_events_request_len_ng_lenzero():
    """
    イベント情報チェック
    ※異常系(データなし)
    """

    req = {
        'eventinfo' : []
    }

    result = EventsRequestCommon.check_events_request_len(req, 0)

    assert result == EventsRequestCommon.REQUEST_ERR_EVINFO_LENGTH
示例#6
0
def test_check_events_request_len_ok():
    """
    イベント情報チェック
    ※正常系
    """

    req = {
        'eventinfo' : ['pytest1', 'pytest2']
    }

    result = EventsRequestCommon.check_events_request_len(req, 2)

    assert result == EventsRequestCommon.REQUEST_OK
示例#7
0
def test_check_events_request_key_ng_keyerr_evtime():
    """
    トレースID生成テスト
    ※異常系(キーなし'eventdatetime')
    """

    req = {
        'decisiontable' : 'pytest_table',
        'requesttype' : 0,
        'eventinfo' : []
    }

    result = EventsRequestCommon.check_events_request_key(req)

    assert result == EventsRequestCommon.REQUEST_ERR_DATETIME_KEY
示例#8
0
def test_check_events_request_key_ng_keyerr_reqtype():
    """
    トレースID生成テスト
    ※異常系(キーなし'requesttype')
    """

    req = {
        'decisiontable' : 'pytest_table',
        'eventdatetime' : '2020-01-01 00:00:00',
        'eventinfo' : []
    }

    result = EventsRequestCommon.check_events_request_key(req)

    assert result == EventsRequestCommon.REQUEST_ERR_REQTYPE_KEY
示例#9
0
def test_check_events_request_key_ok():
    """
    トレースID生成テスト
    ※正常系
    """

    req = {
        'decisiontable' : 'pytest_table',
        'requesttype' : 0,
        'eventdatetime' : '2020-01-01 00:00:00',
        'eventinfo' : []
    }

    result = EventsRequestCommon.check_events_request_key(req)

    assert result == EventsRequestCommon.REQUEST_OK
示例#10
0
def set_test_regist_data():
    """
    テストで使用するデータの作成
    """
    now = datetime.datetime.now(pytz.timezone('UTC'))
    trace_id = EventsRequestCommon.generate_trace_id(now)
    response_id = 1

    act_his = ActionHistory(response_id=response_id,
                            trace_id=trace_id,
                            rule_type_id=1,
                            rule_type_name='pytest_ruletable',
                            rule_name='pytest_rule',
                            execution_order=1,
                            action_start_time=now,
                            action_type_id=1,
                            status=2106,
                            status_detail=0,
                            status_update_id='pytest_id',
                            retry_flag=False,
                            retry_status=None,
                            retry_status_detail=None,
                            action_retry_count=0,
                            last_act_user='******',
                            last_update_timestamp=now,
                            last_update_user='******')
    act_his.save(force_insert=True)

    now = datetime.datetime.now(pytz.timezone('UTC'))

    user = User(
        user_id=Cstobj.DB_OASE_USER,
        user_name='unittest_procedure',
        login_id='',
        mail_address='',
        password='',
        disp_mode_id=DISP_MODE.DEFAULT,
        lang_mode_id=LANG_MODE.JP,
        password_count=0,
        password_expire=datetime.datetime.now(pytz.timezone('UTC')),
        last_update_user='******',
        last_update_timestamp=datetime.datetime.now(pytz.timezone('UTC')),
    )
    user.save(force_insert=True)
示例#11
0
def check_evinfo_error(trace_id, json_str, ruletypeid, evinfo_length):
    """
    [メソッド概要]
      イベントリクエストのイベント情報の正常性チェック
      ※try の中で呼び出すこと
    """

    # イベント情報のチェック
    err_code = EventsRequestCommon.check_events_request_len(
        json_str, evinfo_length)
    if err_code != EventsRequestCommon.REQUEST_OK:
        if err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_TYPE:
            logger.user_log('LOSM22002', trace_id, ruletypeid, 0,
                            evinfo_length)
            raise Exception()

        elif err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_LENGTH:
            logger.user_log('LOSM22002', trace_id, ruletypeid,
                            len(json_str[EventsRequestCommon.KEY_EVENTINFO]),
                            evinfo_length)
            raise Exception()

        raise Exception()
示例#12
0
def check_key_error(trace_id, json_str):
    """
    [メソッド概要]
      イベントリクエストの各キーの正常性チェック
      ※try の中で呼び出すこと
    """

    err_code = EventsRequestCommon.check_events_request_key(json_str)
    if err_code != EventsRequestCommon.REQUEST_OK:
        err_keyname = ''
        if err_code == EventsRequestCommon.REQUEST_ERR_RULETYPE_KEY:
            err_keyname = EventsRequestCommon.KEY_RULETYPE

        elif err_code == EventsRequestCommon.REQUEST_ERR_REQTYPE_KEY:
            err_keyname = EventsRequestCommon.KEY_REQTYPE

        elif err_code == EventsRequestCommon.REQUEST_ERR_DATETIME_KEY:
            err_keyname = EventsRequestCommon.KEY_EVENTTIME

        elif err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_KEY:
            err_keyname = EventsRequestCommon.KEY_EVENTINFO

        logger.user_log('LOSM22001', err_keyname, trace_id)
        raise Exception()
示例#13
0
def eventsrequest(request):
    """
    [メソッド概要]
      テストリクエスト実行時のリクエストを処理する
    """

    now = datetime.datetime.now(pytz.timezone('UTC'))
    trace_id = EventsRequestCommon.generate_trace_id()
    resp_json = {}
    result = False
    msg = ''

    logger.system_log('LOSI13001', trace_id)

    try:
        #########################################
        # リクエストのチェック
        #########################################
        # メソッドのチェック
        if not request or request.method == 'GET':
            msg = 'Invalid request. Must be POST. Not GET.'
            logger.user_log('LOSM13001', trace_id)
            raise Exception(msg)

        # フォーマットのチェック
        try:
            json_str = json.loads(request.body.decode('UTF-8'))
        except json.JSONDecodeError:
            msg = 'Invalid request format. Must be JSON.'
            logger.user_log('LOSM13005', trace_id)
            raise Exception(msg)

        if json_str[EventsRequestCommon.KEY_REQTYPE] in [1,
                                                         '1']:  # 1:プロダクション環境

            # プロダクション環境
            json_str['traceid'] = trace_id
            json_str = json.dumps(json_str)

            # 初回の設定読込で落ちるのめんどくさいのでここに置いとく
            _rabbitMQ_conf()

            # RabbitMQへ送信
            mq_lock.acquire()
            _produce(json_str)
            mq_lock.release()

            result = True
            msg = 'Accept request.'

        elif json_str[EventsRequestCommon.KEY_REQTYPE] in [2,
                                                           '2']:  # 2:ステージング環境

            # ステージング環境
            user = User.objects.get(user_id=1)

            # キーのチェック
            err_code = EventsRequestCommon.check_events_request_key(json_str)
            if err_code != EventsRequestCommon.REQUEST_OK:
                err_keyname = ''
                if err_code == EventsRequestCommon.REQUEST_ERR_RULETYPE_KEY:
                    err_keyname = EventsRequestCommon.KEY_RULETYPE

                elif err_code == EventsRequestCommon.REQUEST_ERR_REQTYPE_KEY:
                    err_keyname = EventsRequestCommon.KEY_REQTYPE

                elif err_code == EventsRequestCommon.REQUEST_ERR_DATETIME_KEY:
                    err_keyname = EventsRequestCommon.KEY_EVENTTIME

                elif err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_KEY:
                    err_keyname = EventsRequestCommon.KEY_EVENTINFO

                msg = 'Invalid request.'
                logger.user_log('LOSM13002', err_keyname, trace_id)
                raise Exception(msg)

            # ルール情報の取得
            reqtypeid = json_str[EventsRequestCommon.KEY_REQTYPE]
            ruletablename = json_str[EventsRequestCommon.KEY_RULETYPE]
            ruletypeid = RuleType.objects.get(
                rule_type_name=ruletablename).rule_type_id
            evinfo_length = DataObject.objects.filter(
                rule_type_id=ruletypeid).values('label').distinct().count()

            # イベント情報のチェック
            err_code = EventsRequestCommon.check_events_request_len(
                json_str, evinfo_length)
            if err_code != EventsRequestCommon.REQUEST_OK:
                if err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_TYPE:
                    msg = 'Unmatch, Number of event information elements.'
                    logger.user_log('LOSM13003', trace_id, ruletypeid, 0,
                                    evinfo_length)
                    raise Exception(msg)

                elif err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_LENGTH:
                    msg = 'Unmatch, Number of event information elements.'
                    logger.user_log(
                        'LOSM13003', trace_id, ruletypeid,
                        len(json_str[EventsRequestCommon.KEY_EVENTINFO]),
                        evinfo_length)
                    raise Exception(msg)

                raise Exception()

            #########################################
            # リクエストをDBに保存
            #########################################
            # DB登録用に成形
            evinfo_str = ''
            rset = DataObject.objects.filter(
                rule_type_id=ruletypeid).order_by('data_object_id')

            label_list = []
            conditional_expression_id_list = []

            for a in rset:
                if a.label not in label_list:
                    label_list.append(a.label)
                    conditional_expression_id_list.append(
                        a.conditional_expression_id)

            for rs, v in zip(conditional_expression_id_list,
                             json_str[EventsRequestCommon.KEY_EVENTINFO]):
                if evinfo_str:
                    evinfo_str += ','

                # 条件式がリストの場合
                if rs in (13, 14):
                    if not isinstance(v, list):
                        evinfo_str += '%s' % (v)

                    else:
                        temp_val = '['
                        for i, val in enumerate(v):
                            if i > 0:
                                temp_val += ','

                            temp_val += '"%s"' % (val)

                        temp_val += ']'
                        evinfo_str += '%s' % (temp_val)

                # 条件式がリスト以外の場合
                else:
                    evinfo_str += '"%s"' % (v)

            evinfo_str = '{"EVENT_INFO":[%s]}' % (evinfo_str)
            event_dt = json_str[EventsRequestCommon.KEY_EVENTTIME]
            event_dt = TimeConversion.get_time_conversion_utc(
                event_dt, 'Asia/Tokyo')

            json_data = {
                'trace_id': trace_id,
                'request_type_id': reqtypeid,
                'rule_type_id': ruletypeid,
                'request_reception_time': now,
                'request_user': '******',
                'request_server': 'OASE Web',
                'event_to_time': event_dt,
                'event_info': evinfo_str,
                'status': defs.UNPROCESS,
                'status_update_id': '',
                'retry_cnt': 0,
                'last_update_timestamp': now,
                'last_update_user': user.user_name,
            }

            # バリデーションチェック
            oters = EventsRequestSerializer(data=json_data)
            result_valid = oters.is_valid()

            # バリデーションエラー
            if result_valid == False:
                msg = '%s' % oters.errors
                logger.user_log('LOSM13004', trace_id, msg)

            # 正常の場合はDB保存
            else:
                oters.save()
                result = True
                msg = 'Accept request.'

        else:  # 不明なリクエスト種別

            msg = 'Invalid request type.'
            logger.user_log('LOSM13023', trace_id,
                            json_str[EventsRequestCommon.KEY_REQTYPE])

    except Exception as e:
        if not msg:
            msg = 'Unexpected error.'

        logger.system_log('LOSM13013', trace_id, traceback.format_exc())

    # レスポンス情報の作成
    resp_json = {
        'result': result,
        'msg': msg,
        'trace_id': trace_id,
    }

    resp_json = json.dumps(resp_json, ensure_ascii=False)

    logger.system_log('LOSI13002', trace_id, result, msg)

    # 応答
    return HttpResponse(resp_json)
示例#14
0
def bulk_eventsrequest(request):
    """
    [メソッド概要]
      一括用のリクエストを処理する
    """

    resp_json = {}
    result = False
    rule_type_id_list = {}
    label_count_list = {}

    logger.system_log('LOSI13023')

    try:
        #########################################
        # リクエストのチェック
        #########################################
        # メソッドのチェック
        if not request or request.method == 'GET':
            logger.system_log('LOSM13025')
            raise Exception()

        # フォーマットのチェック
        try:
            json_str = json.loads(request.body.decode('UTF-8'))
        except json.JSONDecodeError:
            logger.system_log('LOSM13026')
            raise Exception()

        for data in json_str['request']:

            # キーのチェック
            err_code = EventsRequestCommon.check_events_request_key(data)
            if err_code != EventsRequestCommon.REQUEST_OK:
                err_keyname = ''
                if err_code == EventsRequestCommon.REQUEST_ERR_RULETYPE_KEY:
                    err_keyname = EventsRequestCommon.KEY_RULETYPE

                elif err_code == EventsRequestCommon.REQUEST_ERR_REQTYPE_KEY:
                    err_keyname = EventsRequestCommon.KEY_REQTYPE

                elif err_code == EventsRequestCommon.REQUEST_ERR_DATETIME_KEY:
                    err_keyname = EventsRequestCommon.KEY_EVENTTIME

                elif err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_KEY:
                    err_keyname = EventsRequestCommon.KEY_EVENTINFO

                logger.system_log('LOSM13027', err_keyname)
                raise Exception()

            # ルール情報の取得
            reqtypeid = data[EventsRequestCommon.KEY_REQTYPE]
            ruletablename = data[EventsRequestCommon.KEY_RULETYPE]

            if ruletablename not in rule_type_id_list:
                rule_type_id_list.update({ruletablename: 0})
                label_count_list.update({ruletablename: 0})

                rset = RuleType.objects.filter(
                    rule_type_name=ruletablename).values(
                        'rule_type_id', 'rule_type_name', 'label_count')
                for rs in rset:
                    rule_type_id_list.update(
                        {rs['rule_type_name']: rs['rule_type_id']})
                    label_count_list.update(
                        {rs['rule_type_name']: rs['label_count']})

            if ruletablename in rule_type_id_list:
                ruletypeid = rule_type_id_list[ruletablename]
                evinfo_length = label_count_list[ruletablename]

            # イベント情報のチェック
            err_code = EventsRequestCommon.check_events_request_len(
                data, evinfo_length)
            if err_code != EventsRequestCommon.REQUEST_OK:
                if err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_TYPE:
                    logger.system_log('LOSM13028', ruletypeid, 0,
                                      evinfo_length)
                    raise Exception()

                elif err_code == EventsRequestCommon.REQUEST_ERR_EVINFO_LENGTH:
                    logger.system_log(
                        'LOSM13028', ruletypeid,
                        len(data[EventsRequestCommon.KEY_EVENTINFO]),
                        evinfo_length)
                    raise Exception()

                raise Exception()

            trace_id = EventsRequestCommon.generate_trace_id()
            data['traceid'] = trace_id
            data = json.dumps(data)

            _rabbitMQ_conf()

            # RabbitMQへ送信
            mq_lock.acquire()
            _produce(data)
            mq_lock.release()

        result = True

    except Exception as e:
        logger.system_log('LOSM13029', traceback.format_exc())

    # レスポンス情報の作成
    resp_json = {
        'result': result,
    }

    resp_json = json.dumps(resp_json, ensure_ascii=False)

    logger.system_log('LOSI13024', result)

    # 応答
    return HttpResponse(resp_json)
示例#15
0
    def handle(self, *args, **options):

        random.seed()

        try:
            # パラメーター取得
            self.now = datetime.datetime.now(pytz.timezone('UTC'))
            self.host = options['host']
            self.port = options['port']
            self.rule_ids = self.get_target_ruleid_list(options['rule'])
            self.req_type = options['reqtype']
            self.count = options['reqcnt']
            self.repeat = options['repeat']
            self.interval = options['interval']
            self.data_objs = {}

            # パラメーターチェック
            if len(self.rule_ids) <= 0:
                raise Exception('送信対象のルール種別がありません')

            if self.req_type not in [0, 1, 2]:
                raise Exception('リクエスト種別が不正です')

            if self.count == 0:
                self.count = random.randint(1, 100)

            if self.count < 0:
                self.count = 1

            if self.count > 100:
                self.count = 100

            if self.repeat < 0:
                self.repeat = 0

            if self.interval <= 0:
                self.interval = 1

            if self.repeat == 0:
                self.interval = 0

            # ルール別データオブジェクト取得
            self.get_data_objects(options['filename'])

            # プロダクション向けのリクエストを送信する可能性がある場合は確認
            if self.req_type in [0, 1]:
                while True:
                    choice = input(
                        "プロダクション向けのリクエストを送信しようとしています。\n実行しても、よろしいですか? (y/n)\n"
                    ).lower()
                    if choice in ['y', 'yes']:
                        break

                    elif choice in ['n', 'no']:
                        return

            # リクエスト送信
            total_cnt = 0
            for repeat_cnt in range(self.repeat + 1):
                events_request_list = []

                for req_cnt in range(self.count):
                    rule_type_id = random.choice(self.rule_ids)
                    req_type_id = self.req_type
                    if req_type_id == 0:
                        req_type_id = random.randint(1, 2)

                    evinfo_str = ''
                    evinfo_str = random.choice(self.data_objs[rule_type_id])
                    evinfo_str = '{"EVENT_INFO":[%s]}' % (evinfo_str)

                    evreq_obj = EventsRequest(
                        trace_id=EventsRequestCommon.generate_trace_id(),
                        request_type_id=req_type_id,
                        rule_type_id=rule_type_id,
                        request_reception_time=self.now,
                        request_user='******',
                        request_server='TestCommand',
                        event_to_time=self.now,
                        event_info=evinfo_str,
                        status=defs.UNPROCESS,
                        status_update_id='',
                        retry_cnt=0,
                        last_update_timestamp=self.now,
                        last_update_user='******')

                    events_request_list.append(evreq_obj)

                if len(events_request_list) > 0:
                    EventsRequest.objects.bulk_create(events_request_list)

                if self.interval > 0:
                    time.sleep(self.interval)

        except Exception as e:
            print(e)
def set_data_action_stop(action_stop_interval, action_stop_count, exec_order):
    """
    抑止回数/抑止間隔のテストに必要なデータをDBに登録
    """

    now = datetime.datetime.now(pytz.timezone('UTC'))
    trace_id = EventsRequestCommon.generate_trace_id(now)
    rhdm_response_action = None
    action_history = None

    try:
        with transaction.atomic():

            # アクション種別
            action_type = ActionType(driver_type_id=1,
                                     disuse_flag='0',
                                     last_update_timestamp=now,
                                     last_update_user='******')
            action_type.save(force_insert=True)

            # イベントリクエスト
            events_request = EventsRequest(trace_id=trace_id,
                                           request_type_id=1,
                                           rule_type_id=1,
                                           request_reception_time=now,
                                           request_user='******',
                                           request_server='pytest_server',
                                           event_to_time=now,
                                           event_info='{"EVENT_INFO":["1"]}',
                                           status='3',
                                           status_update_id='pytest_id',
                                           retry_cnt=0,
                                           last_update_timestamp=now,
                                           last_update_user='******')
            events_request.save(force_insert=True)

            # ルールマッチング結果詳細
            rhdm_response_action = RhdmResponseAction(
                response_id=1,
                rule_name='pytest_rule',
                execution_order=exec_order,
                action_type_id=action_type.pk,
                action_parameter_info=
                '{"ACTION_PARAMETER_INFO": ["SERVER_LIST=localhost", "ITA_NAME=ITA176", "SYMPHONY_CLASS_ID=1"]}',
                action_pre_info='',
                action_retry_interval=1,
                action_retry_count=1,
                action_stop_interval=action_stop_interval,
                action_stop_count=action_stop_count,
                last_update_timestamp=now,
                last_update_user='******',
            )
            rhdm_response_action.save(force_insert=True)

            # アクション履歴
            action_history = ActionHistory(
                response_id=rhdm_response_action.response_id,
                trace_id=trace_id,
                rule_type_id=events_request.rule_type_id,
                rule_type_name='pytest_ruletable',
                rule_name=rhdm_response_action.rule_name,
                execution_order=rhdm_response_action.execution_order,
                action_start_time=now,
                action_type_id=rhdm_response_action.action_type_id,
                status=2,
                status_detail=0,
                status_update_id='pytest_id',
                retry_flag=False,
                retry_status=None,
                retry_status_detail=None,
                action_retry_count=0,
                last_act_user='******',
                last_update_timestamp=now,
                last_update_user='******',
            )
            action_history.save(force_insert=True)

    except Exception as e:
        print(e)

    return trace_id, rhdm_response_action, action_history