770 lines
30 KiB
Python
770 lines
30 KiB
Python
#!/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""
|
|
/***************************************************************************
|
|
*
|
|
* @file test_sys_time_zone.py
|
|
*
|
|
**************************************************************************/
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import time
|
|
import datetime
|
|
import pytest
|
|
|
|
from data import partition as DATA
|
|
sys.path.append("../")
|
|
from lib import palo_config
|
|
from lib import palo_client
|
|
import pymysql
|
|
from lib import util
|
|
from lib import palo_job
|
|
from lib import common
|
|
|
|
config = palo_config.config
|
|
broker_name = config.broker_name
|
|
broker_property = config.broker_property
|
|
broker_info = palo_config.broker_info
|
|
repo_location = config.repo_location
|
|
|
|
LOG = palo_client.LOG
|
|
L = palo_client.L
|
|
repo_name = "backup_restore_repo_zone"
|
|
|
|
|
|
def setup_module():
|
|
"""
|
|
setUp
|
|
"""
|
|
global Palo_client
|
|
global mysql_cursor
|
|
Palo_client = palo_client.PaloClient(config.fe_host, config.fe_query_port,
|
|
config.palo_db, config.fe_user, config.fe_password)
|
|
Palo_client.init()
|
|
master = Palo_client.get_master_host()
|
|
Palo_client = common.get_client(master)
|
|
|
|
connect = pymysql.connect(host=config.mysql_host, port=config.mysql_port,\
|
|
user=config.mysql_user, passwd=config.mysql_password)
|
|
mysql_cursor = connect.cursor()
|
|
try:
|
|
ret = Palo_client.create_repository(repo_name, broker_name, repo_location=repo_location,
|
|
repo_properties=broker_property)
|
|
assert ret, "palo create_repository failed"
|
|
except Exception as e:
|
|
print(str(e))
|
|
sql = "set time_zone = '+08:00'"
|
|
check2(sql)
|
|
|
|
|
|
def mysql_execute(sql, db=None):
|
|
"""
|
|
连接mysql执行语句
|
|
"""
|
|
try:
|
|
if db is None:
|
|
db = os.environ["MYSQL_DB"]
|
|
mysql_cursor.execute("use %s" % db)
|
|
mysql_cursor.execute(sql)
|
|
LOG.info(L('mysql execute sql', db=db, sql=sql))
|
|
return mysql_cursor.fetchall()
|
|
except Exception as error:
|
|
LOG.error(L('error', error=error))
|
|
assert False, "execute error. %s" % str(error)
|
|
|
|
|
|
def get_timestamp(res):
|
|
"""将字符串转为时间戳, '18:01:10' -> 数字时间戳,这样好比较大小,不存在两个时间差1s,分钟对应的数值差1"""
|
|
res1 = str(res[0][0])
|
|
timeArray = time.strptime(res1, "%H:%M:%S")
|
|
timestamp = time.mktime(timeArray)
|
|
LOG.info(L('get_timestamp, input, output', res=res, timestamp=timestamp))
|
|
return timestamp
|
|
|
|
|
|
def check2(psql, msql=None):
|
|
"""palo & mysql execute sql
|
|
:sql: execute sql
|
|
:msql: mysql 执行的sql
|
|
"""
|
|
if not msql:
|
|
msql = psql
|
|
LOG.info(L('palo sql', palo_sql=psql))
|
|
res1= Palo_client.execute(psql)
|
|
LOG.info(L('mysql sql', mysql_sql=msql))
|
|
res2 = mysql_execute(msql)
|
|
if "CURTIME" in psql:
|
|
##可能会差1s左右,故转为时间戳个数
|
|
timestamp_res1 = get_timestamp(res1)
|
|
timestamp_res2 = get_timestamp(res2)
|
|
LOG.info(L('CURTIME sql : palo res; mysql res', \
|
|
timestamp_res1=timestamp_res1, timestamp_res2=timestamp_res2))
|
|
assert abs(timestamp_res1 - timestamp_res2) <= 1, "palo %s, mysql %s, \
|
|
excepted res1 - res2 <= 1" % (timestamp_res1, timestamp_res2)
|
|
else:
|
|
util.check(res1, res2)
|
|
|
|
|
|
def show_be_broker_time():
|
|
"""show be,broker time,把be、broker里和时间相关的变量,非空则放到list里,逐条比较是否相等
|
|
show be:LastStartTime:上次启动的时间,不会一直变,格式2019-09-04 20:54:55
|
|
show broker:LastStartTime:上次启动的时间,不会一直变,格式2019-09-04 20:54:55
|
|
"""
|
|
be_list = Palo_client.get_alive_backend_list()
|
|
be_info = be_list[0]
|
|
list = []
|
|
LOG.info(L('be info is', be_info=be_info))
|
|
be_start_time = palo_job.BackendProcInfo(be_info).get_backend_start_time()
|
|
LOG.info(L('palo be start time', start_time=be_start_time))
|
|
list.append(be_start_time)
|
|
broker = Palo_client.get_broker_start_update_time()
|
|
if broker:
|
|
LOG.info(L('broker start_time', start_time=broker))
|
|
list += [broker]
|
|
return list
|
|
|
|
|
|
def unity_datetime_format(time, snapshot_flag=False):
|
|
"""统一datetime的格式",snapshot_flag是否是snapshot,格式不一样"""
|
|
LOG.info(L('unity datetime format', time=time, snapshot=snapshot_flag))
|
|
try:
|
|
if snapshot_flag:
|
|
unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d-%H-%M-%S')
|
|
else:
|
|
unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d %H:%M:%S')
|
|
except ValueError as e:
|
|
if snapshot_flag:
|
|
unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d-%H-%M-%S.%f')
|
|
else:
|
|
unity_time = datetime.datetime.strptime('%s' % time, '%Y-%m-%d %H:%M:%S.%f')
|
|
return unity_time
|
|
|
|
|
|
def recombinate_time(origin_time, offset_hour, offset_minutes):
|
|
"""在origin_time时间上叠加上offset_time时间
|
|
-01:10 和+06:10 距离+08:00的分钟计算方式不一样
|
|
"""
|
|
seconds = 0
|
|
if offset_hour < 0:
|
|
##+09:10
|
|
seconds = (offset_hour * 60 - offset_minutes) * 60
|
|
elif offset_hour >= 8:
|
|
##-01:10
|
|
seconds = (offset_hour * 60 + offset_minutes) * 60
|
|
else:
|
|
##+06:10
|
|
seconds = (offset_hour * 60 - offset_minutes) * 60
|
|
offset_time = datetime.timedelta(days=0, seconds=seconds, microseconds=0)
|
|
assert isinstance(offset_time, datetime.timedelta)
|
|
offert_time = (origin_time - offset_time).isoformat()
|
|
try:
|
|
offert_time = datetime.datetime.strptime(offert_time, '%Y-%m-%dT%H:%M:%S')
|
|
except ValueError as e:
|
|
offert_time = datetime.datetime.strptime(offert_time, '%Y-%m-%dT%H:%M:%S.%f')
|
|
return offert_time
|
|
|
|
|
|
def wait_for_integer_min():
|
|
"""Waiting time to judge in the same minute"""
|
|
sql = "select SECOND(now())"
|
|
ret = Palo_client.execute(sql)
|
|
if int(ret[0][0]) > 50:
|
|
time.sleep(20)
|
|
|
|
|
|
def check2_gap_time_zone(palo_res, mysql_res, zone, snapshot_flag=False):
|
|
"""比较两个tiemdate时间的差;如:2019-09-19 04:05:59 格式
|
|
参数:palo_res, mysql_res,要对比的两个时间;zone 新设置的时区值"""
|
|
res = get_day_and_second(zone)
|
|
hour = 8 - int(res[0])
|
|
second = int(res[1])
|
|
for palo_data, mysql_data in zip(palo_res, mysql_res):
|
|
if palo_data == 'N/A' or palo_data == '':
|
|
###没broker时,返回的是N/A
|
|
assert palo_data == mysql_data, "err: excepted %s == %s" % (palo_data, mysql_data)
|
|
continue
|
|
unity_palo = unity_datetime_format(palo_data, snapshot_flag)
|
|
unity_mysql = unity_datetime_format(mysql_data, snapshot_flag)
|
|
|
|
##小于+08:00,如+01:10,-03:10. 偏移量是正数
|
|
palo_date = recombinate_time(unity_palo, hour, second)
|
|
assert palo_date == unity_mysql, "res %s, excepted %s" % (palo_date, unity_mysql)
|
|
|
|
|
|
def get_day_and_second(date_delta):
|
|
"""从datetime里获取小时和分钟 eg:-08:10,取出 8和10"""
|
|
if date_delta:
|
|
res_list = date_delta.split(':')
|
|
day = res_list[0]
|
|
second = res_list[1]
|
|
return day, second
|
|
return False
|
|
|
|
|
|
def backup(repo_name, database_name, table_name, snapshot_label):
|
|
"""创建仓库,备份"""
|
|
ret = Palo_client.backup(snapshot_label=snapshot_label, backup_list=[table_name],
|
|
repo_name=repo_name, database_name=database_name,
|
|
is_wait=True)
|
|
LOG.info(L("backup res", snapshot_label=snapshot_label, repo_name=repo_name, \
|
|
table_name=table_name, res=ret))
|
|
assert ret
|
|
|
|
|
|
def restore(repo_name, database_name, table_name, snapshot_label):
|
|
"""恢复到新表里"""
|
|
##restore
|
|
new_table_name = table_name + "_new"
|
|
restore_list = list()
|
|
restore_list.append('%s AS %s' % (table_name, new_table_name))
|
|
ret = Palo_client.restore(snapshot_name=snapshot_label, repo_name=repo_name,
|
|
restore_list=restore_list, database_name=database_name,
|
|
is_wait=True)
|
|
LOG.info(L("restore res", snapshot_label=snapshot_label, repo_name=repo_name, \
|
|
table_name=table_name, res=ret))
|
|
assert ret
|
|
# check
|
|
line1 = 'select * from %s order by k1' % table_name
|
|
line2 = 'select * from %s order by k1' % new_table_name
|
|
LOG.info(L('palo sql 1', palo_sql=line1))
|
|
ret1 = Palo_client.execute(line1)
|
|
LOG.info(L('palo sql 2', palo_sql=line2))
|
|
ret2 = Palo_client.execute(line2)
|
|
util.check(ret1, ret2)
|
|
|
|
|
|
def get_backup_time(backup_db):
|
|
"""获取备份相关时间信息"""
|
|
##backup
|
|
snapshot_name = ''
|
|
res_backup = ''
|
|
time_list = []
|
|
|
|
res_backup = Palo_client.show_backup(backup_db)
|
|
LOG.info(L('show backup res', res_backup=res_backup))
|
|
assert res_backup
|
|
|
|
backup_info = res_backup[-1]
|
|
time_list = [palo_job.BackupJob(backup_info).get_create_time(), \
|
|
palo_job.BackupJob(backup_info).get_snap_finish_time(),\
|
|
palo_job.BackupJob(backup_info).get_upload_finish_time(), \
|
|
palo_job.BackupJob(backup_info).get_finished_time()]
|
|
snapshot_name = palo_job.BackupJob(backup_info).get_snapshotName()
|
|
return time_list, snapshot_name
|
|
|
|
|
|
def get_restore_time(restore_db):
|
|
"""获取备份恢复相关时间信息"""
|
|
##restore
|
|
snapshot_name = ''
|
|
res_backup = ''
|
|
time_list = []
|
|
|
|
res = Palo_client.show_restore(restore_db)
|
|
LOG.info(L('show RESTORE res', res_restore=res))
|
|
assert res
|
|
time_list += [palo_job.RestoreJob(res[-1]).get_create_time(),\
|
|
palo_job.RestoreJob(res[-1]).get_meta_prepare_time(),
|
|
palo_job.RestoreJob(res[-1]).get_snapshot_finished_time(),
|
|
palo_job.RestoreJob(res[-1]).get_down_load_finished(),
|
|
palo_job.RestoreJob(res[-1]).get_finished()]
|
|
return time_list, snapshot_name
|
|
|
|
|
|
def get_repo_time():
|
|
"""获取备repo相关时间信息"""
|
|
##repo
|
|
time_list = []
|
|
res = Palo_client.show_repository()
|
|
assert res
|
|
LOG.info(L('show REPOSITORIES res', res=res[0]))
|
|
time_list = [palo_job.RepoInfo(res[0]).get_create_time()]
|
|
return time_list, palo_job.RepoInfo(res[0]).get_repo_name()
|
|
|
|
|
|
def get_snapshot_time(repo, snapshot_name=None):
|
|
"""获取备snapshot相关时间信息"""
|
|
snap_res = Palo_client.show_snapshot(repo, snapshot_name)
|
|
LOG.info(L('show snapshot repo, snapshot_name, res',\
|
|
repo=repo, snapshot_name=snapshot_name, res=snap_res))
|
|
assert snap_res
|
|
time_list = [palo_job.SnapshotInfo(snap_res[0]).get_timestamp()]
|
|
LOG.info(L('get snapshot time', time_list=time_list))
|
|
return time_list
|
|
|
|
|
|
def create_table(database_name, table_name):
|
|
"""建表"""
|
|
Palo_client.clean(database_name)
|
|
Palo_client.create_database(database_name)
|
|
Palo_client.use(database_name)
|
|
sql = "drop table if exists %s" % table_name
|
|
LOG.info(L('palo sql', palo_sql=sql))
|
|
res = Palo_client.execute(sql)
|
|
# 建表
|
|
partition_name_list = ['partition_a', 'partition_b', 'partition_c', 'partition_d']
|
|
partition_value_list = ['100', '500', '1000', 'MAXVALUE']
|
|
|
|
partition_info = palo_client.PartitionInfo('k3',
|
|
partition_name_list, partition_value_list)
|
|
distribution_type_d = 'HASH(k1, k2, k5)'
|
|
distribution_info_d = palo_client.DistributionInfo(distribution_type_d, 31)
|
|
Palo_client.create_table(table_name, DATA.schema_1, partition_info, distribution_info_d)
|
|
assert Palo_client.show_tables(table_name)
|
|
for partition_name in partition_name_list:
|
|
assert Palo_client.get_partition(table_name, partition_name)
|
|
|
|
|
|
def test_set_sys_time_zone():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_sys_time_zone",
|
|
"describe": "设置系统变量system_time_zone。系统不允许,会报错",
|
|
"tag": "function,p1,fuzz"
|
|
}
|
|
"""
|
|
"""
|
|
设置系统变量system_time_zone。系统不允许,会报错
|
|
"""
|
|
zone = '+08:00'
|
|
excepted = "%s variable '%s' is read-only. Use SET %s to assign the value"
|
|
try:
|
|
sql = "set system_time_zone = '%s'" % zone
|
|
res = Palo_client.execute(sql)
|
|
assert 0 == 1, "palo sql %s shoud not ok" % sql
|
|
except Exception as err:
|
|
LOG.info(L('test_set_sys_time_zone err', error=err))
|
|
assert excepted in str(err), "diff: res %s, excepted %s" % (err, excepted)
|
|
try:
|
|
sql = "set global system_time_zone = '%s'" % zone
|
|
Palo_client.execute(sql)
|
|
assert 0 == 1, "palo sql %s shoud not ok" % sql
|
|
except Exception as err:
|
|
LOG.info(L('test_set_sys_time_zone err', error=err))
|
|
assert excepted in str(err), "diff: res %s, excepted %s" % (err, excepted)
|
|
|
|
|
|
def test_set_time_zone():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone",
|
|
"describe": "设置time_zone变量。测试点:多种方式;与system_time_zone不匹配等",
|
|
"tag": "function,p1,fuzz"
|
|
}
|
|
"""
|
|
"""
|
|
设置time_zone变量。
|
|
测试点:多种方式;与system_time_zone不匹配等
|
|
"""
|
|
zone_ok = ['America/Los_Angeles', 'Asia/Shanghai', '-00:00', '+00:00', '-08:00', '+09:00',\
|
|
'-08:10', '+08:10', '+12:00', '-12:00']
|
|
zone_err = ['met', 'CMT', 'CTT', 'CAT','UTC','utc', 'CST', 'cst', '-12:01',\
|
|
'+12:01', '-08:90', '+08:90', '09:00', 'SYSTEM']
|
|
for zone in zone_ok:
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
|
|
excepted = "Unknown or incorrect time zone"
|
|
for zone in zone_err:
|
|
try:
|
|
Palo_client.set_time_zone(zone)
|
|
LOG.error(L('err res', zone=zone))
|
|
except Exception as err:
|
|
assert excepted in str(err), "res %s, excepted %s" % (str(err), excepted)
|
|
try:
|
|
Palo_client.set_time_zone(zone)
|
|
LOG.error(L('err res', zone=zone))
|
|
except Exception as err:
|
|
assert excepted in str(err), "res %s, excepted %s" % (str(err), excepted)
|
|
|
|
|
|
def test_set_time_zone_show_proc():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_show_proc",
|
|
"describe": "验证时区设置对show proc相关的时间显示",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""
|
|
验证时区设置对show proc相关的时间显示
|
|
"""
|
|
zone_list = ['-01:10', '+03:30', '+09:01']
|
|
for zone in zone_list:
|
|
Palo_client.set_time_zone('+08:00')
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == "+08:00", "res %s, excepted +08:00" % res_var[1][1]
|
|
time.sleep(5)
|
|
res_before = show_be_broker_time()
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
#varify_time_zone_correct(zone, Palo_client, False, zone)
|
|
time.sleep(5)
|
|
res_after = show_be_broker_time()
|
|
assert res_after
|
|
LOG.info(L('zone, before res, after res',\
|
|
zone=zone, res_before=res_before, res_after=res_after))
|
|
check2_gap_time_zone(res_before, res_after, zone)
|
|
|
|
|
|
def test_set_time_zone_show_backup():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_show_backup",
|
|
"describe": "创建db,导入数据,备份,setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""show backup_restore
|
|
创建db,导入数据,备份
|
|
setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间
|
|
"""
|
|
Palo_client.set_time_zone('+08:00')
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == "+08:00", "res %s, excepted +08:00" % res_var[1][1]
|
|
|
|
database_name, table_name, index_name = util.gen_name_list()
|
|
create_table(database_name, table_name)
|
|
# 导入
|
|
data_desc_list = palo_client.LoadDataInfo(DATA.file_path_1, table_name)
|
|
assert Palo_client.batch_load(util.get_label(), data_desc_list, broker=broker_info)
|
|
##进行备份恢复
|
|
snapshot_label = util.get_snapshot_label('backup')
|
|
backup(repo_name, database_name, table_name, snapshot_label)
|
|
######第一次获取时间
|
|
res_before, snapshot = get_backup_time(database_name)
|
|
assert res_before
|
|
########set time zone
|
|
zone = "+01:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
LOG.info(L('zone, res', zone=zone, res=res_var))
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
time.sleep(5)
|
|
#######再次获取时间
|
|
res_after, snapshot = get_backup_time(database_name)
|
|
assert res_after
|
|
LOG.info(L('zone, before res, after res',\
|
|
zone=zone, res_before=res_before, res_after=res_after))
|
|
check2_gap_time_zone(res_before, res_after, zone)
|
|
Palo_client.clean(database_name)
|
|
|
|
|
|
def test_set_time_zone_show_backup_restore():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_show_backup_restore",
|
|
"describe": "创建db,导入数据,备份,后恢复, setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""show backup_restore
|
|
创建db,导入数据,备份,后恢复
|
|
setUp里会设置时区为+08:00,有这些数据后,先获取时间信息,然后设置新时区,再次获取时间
|
|
"""
|
|
Palo_client.set_time_zone("+08:00")
|
|
database_name, table_name, index_name = util.gen_name_list()
|
|
create_table(database_name, table_name)
|
|
# 导入
|
|
data_desc_list = palo_client.LoadDataInfo(DATA.file_path_1, table_name)
|
|
assert Palo_client.batch_load(util.get_label(), data_desc_list, broker=broker_info, is_wait=True)
|
|
##进行备份恢复
|
|
snapshot_label = util.get_snapshot_label('backup_restore')
|
|
backup(repo_name, database_name, table_name, snapshot_label)
|
|
restore(repo_name, database_name, table_name, snapshot_label)
|
|
######第一次获取时间
|
|
res_before, snapshot = get_restore_time(database_name)
|
|
#有内容才继续
|
|
assert res_before
|
|
zone = "+01:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
LOG.info(L('zone, res', zone=zone, res=res_var))
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
time.sleep(5)
|
|
#######再次获取时间
|
|
res_after, snapshot = get_restore_time(database_name)
|
|
assert res_after
|
|
###因为标准是+08:00,现在设置+01:00,时间相差7小时,0分钟
|
|
LOG.info(L('zone, before res, after res, excepted',\
|
|
zone=zone, res_before=res_before, res_after=res_after))
|
|
check2_gap_time_zone(res_before, res_after, zone)
|
|
Palo_client.clean(database_name)
|
|
|
|
|
|
def test_set_time_zone_show_repo():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_show_repo",
|
|
"describe": "setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""show repo
|
|
setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间
|
|
"""
|
|
##set time zone
|
|
zone = "+08:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
res_before = get_repo_time()
|
|
assert res_before
|
|
##set time zone
|
|
zone = "+01:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
time.sleep(5)
|
|
res_after = get_repo_time()
|
|
assert res_after
|
|
LOG.info(L('zone, before res, after res',\
|
|
zone=zone, res_before=res_before, res_after=res_after))
|
|
check2_gap_time_zone(res_before[0], res_after[0], zone)
|
|
|
|
|
|
def test_set_time_zone_show_snapshot():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_show_snapshot",
|
|
"describe": "setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间",
|
|
"tag": "function,p1,fuzz"
|
|
}
|
|
"""
|
|
"""show snapshot
|
|
setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间
|
|
"""
|
|
###snapshot, 与时间无关
|
|
res_repo = get_repo_time()
|
|
assert res_repo
|
|
repo = res_repo[1]
|
|
snapshot_name = None
|
|
LOG.info(L('repo,snapshot_name', repo=repo, snapshot_name=snapshot_name))
|
|
if repo:
|
|
zone = "+08:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
res_before = get_snapshot_time(repo, snapshot_name)
|
|
assert res_before
|
|
##set time zone
|
|
zone = "+01:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
time.sleep(5)
|
|
res_after = get_snapshot_time(repo, snapshot_name)
|
|
assert res_after
|
|
LOG.info(L('zone, before res, after res',\
|
|
zone=zone, res_before=res_before, res_after=res_after))
|
|
try:
|
|
check2_gap_time_zone(res_before, res_after, zone, True)
|
|
LOG.error(L('snapshot time zone varify err', res_before=res_before, res_after=res_after))
|
|
except Exception as err:
|
|
assert 'excepted' in str(err), "excepted excepted, err: %s" % str(err)
|
|
else:
|
|
raise pytest.skip('get zone failed')
|
|
|
|
|
|
def test_set_time_zone_alter_table():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_alter_table",
|
|
"describe": "setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""
|
|
设置time_zone变量,验证对导schema change的影响。
|
|
setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间
|
|
"""
|
|
database_name, table_name, index_name = util.gen_name_list()
|
|
#建表
|
|
create_table(database_name, table_name)
|
|
zone = "+08:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
##alter table
|
|
column_list = [('k11', 'INT KEY', None, '5')]
|
|
ret = Palo_client.schema_change_add_column(table_name, column_list,\
|
|
after_column_name='k1', is_wait_job=True)
|
|
assert ret
|
|
res_before = []
|
|
res_after = []
|
|
schema_change_job_list = Palo_client.get_table_schema_change_job_list(table_name, database_name)
|
|
LOG.info(L('palo db, table, res', db=database_name, table=table_name, res=schema_change_job_list))
|
|
res_before.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.CreateTime])
|
|
res_before.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.FinishTime])
|
|
##set time zone
|
|
zone = "+01:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
schema_change_job_list = Palo_client.get_table_schema_change_job_list(table_name, database_name)
|
|
LOG.info(L('palo db, table, res', db=database_name, table=table_name, res=schema_change_job_list))
|
|
res_after.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.CreateTime])
|
|
res_after.append(schema_change_job_list[-1][palo_job.SchemaChangeJob.FinishTime])
|
|
###check
|
|
LOG.info(L('zone, before res, after res',\
|
|
zone=zone, res_before=res_before, res_after=res_after))
|
|
check2_gap_time_zone(res_before, res_after, zone)
|
|
Palo_client.clean(database_name)
|
|
|
|
|
|
def test_set_time_zone_delete_job():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_delete_job",
|
|
"describe": "设置time_zone变量,验证对删除任务的影响。setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""
|
|
设置time_zone变量,验证对删除任务的影响。
|
|
setUp里会设置时区为+08:00,先获取时间信息,然后设置新时区,再次获取时间
|
|
"""
|
|
database_name, table_name, index_name = util.gen_name_list()
|
|
create_table(database_name, table_name)
|
|
##delete table
|
|
zone = "CST"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
ret = Palo_client.delete(table_name, [('k1', '=', '3')], 'partition_a')
|
|
assert ret
|
|
res = Palo_client.show_delete(database_name)
|
|
LOG.info(L('palo delete result', palo_result=res))
|
|
delete_time_before = palo_job.DeleteJob(res[-1]).get_create_time()
|
|
##set time zone
|
|
zone = "+01:00"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
res_2 = Palo_client.show_delete(database_name)
|
|
assert res_2
|
|
delete_time_after = palo_job.DeleteJob(res_2[-1]).get_create_time()
|
|
LOG.info(L('zone, before res, after res',\
|
|
zone=zone, res_before=[delete_time_before], res_after=[delete_time_after]))
|
|
print(delete_time_before)
|
|
print(delete_time_after)
|
|
check2_gap_time_zone([delete_time_before], [delete_time_after], zone)
|
|
Palo_client.clean(database_name)
|
|
|
|
|
|
def test_set_time_zone_select_time_function():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_select_time_function",
|
|
"describe": "设置time_zone变量,验证对时间相关函数的影响。测试点:5个函数,now(),curtime(),UNIX_TIMESTAMP() FROM_UNIXTIME(), CONVERT_TZ()",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""
|
|
设置time_zone变量,验证对时间相关函数的影响。
|
|
测试点:5个函数,now(),curtime(),UNIX_TIMESTAMP() FROM_UNIXTIME(), CONVERT_TZ()
|
|
"""
|
|
zone_list = ["+06:00", "+09:10", "-01:10", "+08:00"]
|
|
for zone in zone_list:
|
|
sql = "set time_zone = '%s'" % zone
|
|
check2(sql)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
#UNIX_TIMESTAMP
|
|
sql = "select UNIX_TIMESTAMP('1970-01-01 08:00:00'), UNIX_TIMESTAMP('1970-01-01 18:10:10')"
|
|
check2(sql)
|
|
##curtime
|
|
sql = "SELECT CURTIME()"
|
|
check2(sql)
|
|
##FROM_UNIXTIME
|
|
sql = "select FROM_UNIXTIME(123.4, '%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(-123,\
|
|
'%Y-%m-%d %H:%i:%s'), FROM_UNIXTIME(+123, '%Y-%m-%d %H:%i:%s')"
|
|
check2(sql)
|
|
#CONVERT_TZ
|
|
sql = "SELECT CONVERT_TZ('2004-01-01 12:00:00','+01:00','+10:00')"
|
|
check2(sql)
|
|
##now
|
|
wait_for_integer_min()
|
|
sql = "select date(now()), HOUR(now()), MINUTE(now()), DAY(now()),\
|
|
MONTH(now()), QUARTER(now()), YEAR(now())"
|
|
check2(sql)
|
|
|
|
|
|
def test_set_time_zone_insert_load_select():
|
|
"""
|
|
{
|
|
"title": "test_sys_time_zone.test_set_time_zone_insert_load_select",
|
|
"describe": "设置time_zone变量,验证对导入和查询时间相关函数的影响。测试点:导入数据里含now,curtime()和不受影响的函数utc_timestamp,验证查询结果",
|
|
"tag": "function,p1"
|
|
}
|
|
"""
|
|
"""
|
|
设置time_zone变量,验证对导入和查询时间相关函数的影响。
|
|
测试点:导入数据里含now,curtime()和不受影响的函数utc_timestamp,验证查询结果
|
|
"""
|
|
database_name, table_name, index_name = util.gen_name_list()
|
|
Palo_client.clean(database_name)
|
|
Palo_client.create_database(database_name)
|
|
Palo_client.use(database_name)
|
|
zone = "CST"
|
|
Palo_client.set_time_zone(zone)
|
|
res_var = Palo_client.show_variables("time_zone")
|
|
assert res_var[1][1] == zone, "res %s, excepted %s" % (res_var[1][1], zone)
|
|
sql = "drop table if exists %s" % table_name
|
|
LOG.info(L('palo&mysql sql', sql=sql))
|
|
res = Palo_client.execute(sql)
|
|
mysql_cursor.execute(sql)
|
|
sql = 'create table %s(k1 tinyint, k2 smallint NULL, k3 tinyint NULL, k4 tinyint NULL,\
|
|
k5 date NULL, k6 datetime NULL, k8 date NULL, k9 datetime NULL, \
|
|
k7 varchar(20) NULL, k10 double sum, k11 float sum) engine=olap \
|
|
distributed by hash(k1) buckets 5 properties("storage_type"="column")' % table_name
|
|
msql = 'create table %s(k1 tinyint, k2 smallint, k3 tinyint NULL, k4 tinyint NULL,\
|
|
k5 date, k6 datetime, k8 date, k9 datetime, k7 varchar(20),\
|
|
k10 double, k11 float)' % table_name
|
|
check2(sql, msql)
|
|
wait_for_integer_min()
|
|
insert_sql = "insert into %s values (1, HOUR(now()), MINUTE(now()),\
|
|
UNIX_TIMESTAMP('1970-01-01 08:00:00'), date(now()),\
|
|
'2019-09-09 09:00:00', date(now())," % table_name
|
|
insert_sql += "FROM_UNIXTIME(+123, '%Y-%m-%d %H:%i:%s'), '7', 10.10, 11.11)"
|
|
check2(insert_sql)
|
|
select_sql = "select * from %s" % table_name
|
|
check2(select_sql)
|
|
Palo_client.clean(database_name)
|
|
|
|
|
|
def teardown_module():
|
|
"""清理环境"""
|
|
sql = "set time_zone = '+08:00'"
|
|
check2(sql)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("test")
|
|
setup_module()
|
|
test_set_time_zone_select_time_function()
|
|
test_set_time_zone_insert_load_select()
|
|
|
|
|