Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Z
zmops-test
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sanshi
zmops-test
Commits
83c4a24e
Commit
83c4a24e
authored
Dec 16, 2019
by
sanshi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
资产
parent
f767b4de
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
259 additions
and
18 deletions
+259
-18
test_device_get.py
WorkCase/APP/Device/test_device_get.py
+9
-9
test_device_update.py
WorkCase/APP/Device/test_device_update.py
+250
-0
__init__.py
WorkCase/APP/__init__.py
+0
-9
No files found.
WorkCase/APP/Device/test_device_get.py
View file @
83c4a24e
...
...
@@ -126,7 +126,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
name
=
self
.
base_name
+
"05"
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"name"
,
_value
=
self
.
base_name
+
"05"
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"name"
,
_value
=
self
.
base_name
+
"05"
)
@allure.title
(
"device.get:type查询"
)
@allure.story
(
"查询资产:type查询"
)
...
...
@@ -137,7 +137,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
_type
=
self
.
base_type_snmp
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"hostType"
,
_value
=
self
.
base_type_snmp
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"hostType"
,
_value
=
self
.
base_type_snmp
)
@allure.title
(
"device.get:manageLevel查询"
)
@allure.story
(
"查询资产:manageLevel查询"
)
...
...
@@ -148,7 +148,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
manageLevel
=
1
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"manageLevel"
,
_value
=
1
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"manageLevel"
,
_value
=
1
)
@allure.title
(
"device.get:monitorStatus查询"
)
@allure.story
(
"查询资产:monitorStatus查询"
)
...
...
@@ -159,7 +159,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
monitorStatus
=
1
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"monitorStatus"
,
_value
=
1
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"monitorStatus"
,
_value
=
1
)
@allure.title
(
"device.get:available查询"
)
@allure.story
(
"查询资产:available查询"
)
...
...
@@ -170,7 +170,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
available
=
1
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"available"
,
_value
=
1
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"available"
,
_value
=
1
)
@allure.title
(
"device.get:businessIds查询"
)
@allure.story
(
"查询资产:businessIds查询"
)
...
...
@@ -181,7 +181,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"businessesNames"
,
_value
=
self
.
base_business_name_1
+
","
+
self
.
base_business_name_2
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"businessesNames"
,
_value
=
self
.
base_business_name_1
+
","
+
self
.
base_business_name_2
)
@allure.title
(
"device.get:memberId查询"
)
@allure.story
(
"查询资产:memberId查询"
)
...
...
@@ -192,7 +192,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
memberId
=
11
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"memberName"
,
_value
=
"sanshi"
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"memberName"
,
_value
=
"sanshi"
)
@allure.title
(
"device.get:factoryId查询"
)
@allure.story
(
"查询资产:factoryId查询"
)
...
...
@@ -203,7 +203,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
factoryId
=
1
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"factoryId"
,
_value
=
1
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"factoryId"
,
_value
=
1
)
@allure.title
(
"device.get:manageIp查询"
)
@allure.story
(
"查询资产:manageIp查询"
)
...
...
@@ -214,7 +214,7 @@ class TestDeviceGet(object):
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_get
(
token
=
self
.
token
,
manageIp
=
self
.
base_ip
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
app
.
check_
data_keyValue
(
response
=
response
,
_key
=
"manageIp"
,
_value
=
self
.
base_ip
)
self
.
app
.
check_
keyValue
(
response
=
UtilsResponse
()
.
get_data
(
response
=
response
)
,
_key
=
"manageIp"
,
_value
=
self
.
base_ip
)
@allure.title
(
"device.get:menuId查询"
)
@allure.story
(
"查询资产:menuId查询"
)
...
...
WorkCase/APP/Device/test_device_update.py
View file @
83c4a24e
# -*- coding: utf-8 -*-
# 测试用例
# 作者: 陈磊
# 时间: 2019-12-16
from
__future__
import
division
from
WorkCase
import
CaseBase
from
WorkData.Zabbix.interface
import
DataInterface
from
WorkUtils.UtilsLog
import
UtilsLog
from
WorkUtils.UtilsDataBase
import
UtilsDataBase
from
WorkUtils.UtilsResponse
import
UtilsResponse
from
WorkApi.APP.Api.api_login
import
ApiLogin
from
WorkApi.APP.Device.device_create
import
DeviceCreate
from
WorkApi.APP.Device.device_update
import
DeviceUpdate
from
WorkData.Argus.members
import
DataMembers
from
WorkData.Argus.hosts
import
DataHosts
from
WorkData.Zabbix.hosts
import
DataHosts
as
DataHostsZabbix
from
WorkData.Argus.alarm_rule
import
DataAlarmRule
import
allure
from
WorkCase.APP
import
AppBase
@allure.feature
(
"测试模块:device.update"
)
class
TestDeviceUpdate
(
object
):
log
=
UtilsLog
()
env
=
CaseBase
()
.
app_environment_host
host
=
env
[
"host"
]
db_url
=
env
[
"db_url"
]
db_port
=
env
[
"db_port"
]
db_user
=
env
[
"db_user"
]
db_pw
=
env
[
"db_pw"
]
db_base
=
env
[
"db_base"
]
db_base_zabbix
=
env
[
"db_base_zabbix"
]
login_name
=
"SS测试用户名"
base_id
=
10
base_password
=
"123456"
base_type_agent
=
126
base_type_snmp
=
127
base_ip
=
"172.16.3.170"
base_dns
=
"sanshi.zmops.com"
base_port
=
161
base_update_ip
=
"172.16.5.170"
base_update_dns
=
"sanshi.zmops.com"
base_update_port
=
171
base_name
=
"SS 自动化专用"
base_business_id_1
=
"12"
base_business_id_2
=
"13"
@classmethod
def
setup_class
(
cls
):
cls
.
log
.
debug
(
"开始执行测试套件......."
)
session
=
UtilsDataBase
()
.
conn_mysql
(
db_url
=
cls
.
db_url
,
db_port
=
cls
.
db_port
,
db_base
=
cls
.
db_base
,
db_user
=
cls
.
db_user
,
db_pw
=
cls
.
db_pw
)
DataHosts
()
.
delete_like_host_name
(
session
=
session
,
host_name
=
cls
.
base_name
)
@classmethod
def
teardown_class
(
cls
):
cls
.
log
.
debug
(
"结束执行测试套件......."
)
def
setup_method
(
self
):
self
.
log
.
debug
(
"测试用例执行开始..."
)
self
.
app
=
AppBase
(
host
=
self
.
host
)
self
.
app
.
update_members_del_flag
(
session
=
self
.
db_session
(),
members_id
=
self
.
base_id
,
value
=
CaseBase
()
.
del_flag
[
"OFF"
])
self
.
app
.
update_members_status
(
session
=
self
.
db_session
(),
members_id
=
self
.
base_id
,
value
=
CaseBase
()
.
status
[
"ON"
])
self
.
token
=
self
.
app
.
get_base_token
(
login_name
=
self
.
login_name
,
base_password
=
self
.
base_password
)
def
teardown_method
(
self
):
self
.
log
.
debug
(
"测试用例执行结束..."
)
self
.
app
.
update_members_del_flag
(
session
=
self
.
db_session
(),
members_id
=
self
.
base_id
,
value
=
CaseBase
()
.
del_flag
[
"OFF"
])
self
.
app
.
update_members_status
(
session
=
self
.
db_session
(),
members_id
=
self
.
base_id
,
value
=
CaseBase
()
.
status
[
"ON"
])
@allure.step
(
"连接数据库:Argus"
)
def
db_session
(
self
):
session
=
UtilsDataBase
()
.
conn_mysql
(
db_url
=
self
.
db_url
,
db_port
=
self
.
db_port
,
db_base
=
self
.
db_base
,
db_user
=
self
.
db_user
,
db_pw
=
self
.
db_pw
)
return
session
@allure.step
(
"连接数据库:Zabbix"
)
def
db_session_zabbix
(
self
):
session
=
UtilsDataBase
()
.
conn_mysql
(
db_url
=
self
.
db_url
,
db_port
=
self
.
db_port
,
db_base
=
self
.
db_base_zabbix
,
db_user
=
self
.
db_user
,
db_pw
=
self
.
db_pw
)
return
session
@allure.step
(
"查询表:hosts"
)
def
select_hosts
(
self
,
hostid
=
None
,
host_name
=
None
,
available
=
None
,
monitor_status
=
None
):
session
=
self
.
db_session
()
sql
=
DataHosts
()
.
select_all_from_allKeys
(
session
=
session
,
hostid
=
hostid
,
host_name
=
host_name
,
available
=
available
,
monitor_status
=
monitor_status
)
return
sql
@allure.step
(
"查询表:hosts"
)
def
select_hosts_zabbix
(
self
,
hostid
=
None
):
session
=
self
.
db_session_zabbix
()
sql
=
DataHostsZabbix
()
.
select_all_from_allKeys
(
session
=
session
,
hostid
=
hostid
)
return
sql
@allure.step
(
"查询表:interface"
)
def
select_interface
(
self
,
hostid
=
None
):
session
=
self
.
db_session_zabbix
()
sql
=
DataInterface
()
.
select_all_from_allKeys
(
session
=
session
,
hostid
=
hostid
)
return
sql
@allure.step
(
"校验Zabbix接口数据"
)
def
check_interface
(
self
,
host_id
,
_type
,
useip
,
ip
,
dns
,
port
):
sql
=
self
.
select_interface
(
hostid
=
host_id
)
assert
sql
!=
[]
for
x
,
y
in
enumerate
(
sql
):
assert
y
.
main
==
1
assert
y
.
type
==
_type
assert
y
.
useip
==
useip
assert
y
.
ip
==
ip
assert
y
.
dns
==
dns
assert
y
.
port
==
str
(
port
)
assert
x
==
0
@allure.step
(
"校验查询结果"
)
def
check_select
(
self
,
response
,
name
,
manage_ip
,
manage_level
,
host_type
,
parent_host
,
monitor_type
,
monitor_status
,
iplist
,
dns
,
monitor_interface
,
ops_person
,
factoryId
,
model
,
version
,
serialnumber
,
description
,
snmp_community
,
ipmi_authtype
,
ipmi_privilege
,
ipmi_username
,
ipmi_password
,
businessIds
,
hostTypeTree
,
businessTree
):
data
=
UtilsResponse
()
.
get_data
(
response
=
response
)
sql
=
self
.
select_hosts
(
hostid
=
data
)
assert
sql
!=
[]
for
x
,
y
in
enumerate
(
sql
):
assert
y
.
host_name
==
name
assert
y
.
asset_code
!=
""
assert
y
.
manage_ip
==
manage_ip
# assert y.departmentid == departmentid
assert
y
.
manage_level
==
manage_level
assert
y
.
host_type
==
host_type
assert
y
.
parent_host
==
parent_host
# assert y.available == available
assert
y
.
monitor_type
==
monitor_type
assert
y
.
monitor_status
==
monitor_status
assert
y
.
iplist
==
iplist
assert
y
.
dns
==
dns
assert
int
(
y
.
monitor_interface
)
==
monitor_interface
assert
y
.
business_ids
==
businessIds
assert
y
.
host_type_tree
==
hostTypeTree
assert
y
.
business_tree
==
businessTree
# assert y.port == port
assert
y
.
ops_person
==
ops_person
assert
y
.
factory_id
==
factoryId
assert
y
.
model
==
model
assert
y
.
version
==
version
assert
y
.
serialnumber
==
serialnumber
assert
y
.
description
==
description
assert
y
.
snmp_community
==
snmp_community
assert
y
.
ipmi_authtype
==
ipmi_authtype
assert
y
.
ipmi_privilege
==
ipmi_privilege
assert
y
.
ipmi_username
==
ipmi_username
assert
y
.
ipmi_password
==
ipmi_password
assert
x
==
0
@allure.title
(
"device.update:token未传"
)
@allure.story
(
"更新资产:token未传"
)
@allure.severity
(
"blocker"
)
def
test_case_01
(
self
):
response
=
self
.
app
.
device_update
()
self
.
app
.
check_code
(
response
=
response
,
code
=
2001
)
self
.
app
.
check_msg
(
response
=
response
,
msg
=
"无token,请重新登录"
)
@allure.title
(
"device.update:token的用户已删除"
)
@allure.story
(
"更新资产:token的用户已删除"
)
@allure.severity
(
"blocker"
)
def
test_case_02
(
self
):
self
.
app
.
update_members_del_flag
(
session
=
self
.
db_session
(),
members_id
=
self
.
base_id
,
value
=
CaseBase
()
.
del_flag
[
"ON"
])
response
=
self
.
app
.
device_update
(
token
=
self
.
token
)
self
.
app
.
check_code
(
response
=
response
,
code
=
2004
)
self
.
app
.
check_msg
(
response
=
response
,
msg
=
"用户不存在"
)
@allure.title
(
"device.update:token的用户已禁用"
)
@allure.story
(
"更新资产:token的用户已禁用"
)
@allure.severity
(
"blocker"
)
def
test_case_03
(
self
):
self
.
app
.
update_members_status
(
session
=
self
.
db_session
(),
members_id
=
self
.
base_id
,
value
=
CaseBase
()
.
status
[
"OFF"
])
response
=
self
.
app
.
device_update
(
token
=
self
.
token
)
self
.
app
.
check_code
(
response
=
response
,
code
=
2003
)
self
.
app
.
check_msg
(
response
=
response
,
msg
=
"账户已被禁用"
)
@allure.title
(
"device.update:更新所有字段"
)
@allure.story
(
"更新资产:更新所有字段"
)
@allure.severity
(
"blocker"
)
def
test_case_04
(
self
):
name
=
self
.
base_name
+
"04"
host_id
=
self
.
app
.
case_create_host
(
name
=
name
,
host_type
=
self
.
base_type_agent
,
iplist
=
self
.
base_ip
,
port
=
self
.
base_port
,
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
)
response
=
self
.
app
.
device_update
(
token
=
self
.
token
,
hostid
=
host_id
,
hostName
=
name
+
"修改"
,
dns
=
self
.
base_update_dns
,
monitorInterface
=
self
.
base_update_port
,
monitorType
=
2
,
manageLevel
=
1
,
parentHost
=
1
,
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
,
hostTypeTree
=
"hostTypeTree"
,
businessTree
=
"businessTree"
,
opsPerson
=
11
,
snmpCommunity
=
"snmpCommunity"
,
ipmiAuthtype
=
1
,
ipmiPrivilege
=
1
,
ipmiUsername
=
"ipmiUsername"
,
ipmiPassword
=
"ipmiPassword"
,
factoryId
=
1
,
model
=
"model"
,
version
=
"version"
,
serialnumber
=
"serialnumber"
,
description
=
"description"
,
monitorStatus
=
0
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
check_select
(
response
=
response
,
name
=
name
+
"修改"
,
manage_ip
=
self
.
base_update_dns
,
manage_level
=
1
,
host_type
=
self
.
base_type_agent
,
monitor_type
=
2
,
monitor_status
=
0
,
iplist
=
""
,
dns
=
self
.
base_update_dns
,
monitor_interface
=
self
.
base_update_port
,
ops_person
=
11
,
snmp_community
=
"snmpCommunity"
,
ipmi_authtype
=
1
,
ipmi_privilege
=
1
,
ipmi_username
=
"ipmiUsername"
,
ipmi_password
=
"ipmiPassword"
,
parent_host
=
1
,
factoryId
=
1
,
model
=
"model"
,
version
=
"version"
,
serialnumber
=
"serialnumber"
,
description
=
"description"
,
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
,
hostTypeTree
=
"hostTypeTree"
,
businessTree
=
"businessTree"
)
self
.
check_interface
(
host_id
=
host_id
,
_type
=
1
,
useip
=
0
,
ip
=
""
,
dns
=
self
.
base_update_dns
,
port
=
self
.
base_update_port
)
response
=
self
.
app
.
device_update
(
token
=
self
.
token
,
hostid
=
host_id
,
hostName
=
name
+
"修改1"
,
iplist
=
self
.
base_ip
,
monitorInterface
=
self
.
base_port
,
monitorType
=
1
,
manageLevel
=
2
,
parentHost
=
1
,
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
,
hostTypeTree
=
"hostTypeTree1"
,
businessTree
=
"businessTree1"
,
opsPerson
=
11
,
snmpCommunity
=
"snmpCommunity1"
,
ipmiAuthtype
=
1
,
ipmiPrivilege
=
1
,
ipmiUsername
=
"ipmiUsername1"
,
ipmiPassword
=
"ipmiPassword1"
,
factoryId
=
1
,
model
=
"1model"
,
version
=
"1version"
,
serialnumber
=
"1serialnumber"
,
description
=
"1description"
,
monitorStatus
=
0
)
self
.
app
.
check_code
(
response
=
response
,
code
=
0
)
self
.
check_select
(
response
=
response
,
name
=
name
+
"修改1"
,
manage_ip
=
self
.
base_ip
,
manage_level
=
2
,
host_type
=
self
.
base_type_agent
,
monitor_type
=
1
,
monitor_status
=
0
,
iplist
=
self
.
base_ip
,
dns
=
""
,
monitor_interface
=
self
.
base_port
,
ops_person
=
11
,
snmp_community
=
"snmpCommunity1"
,
ipmi_authtype
=
1
,
ipmi_privilege
=
1
,
ipmi_username
=
"ipmiUsername1"
,
ipmi_password
=
"ipmiPassword1"
,
parent_host
=
1
,
factoryId
=
1
,
model
=
"1model"
,
version
=
"1version"
,
serialnumber
=
"1serialnumber"
,
description
=
"1description"
,
businessIds
=
self
.
base_business_id_1
+
","
+
self
.
base_business_id_2
,
hostTypeTree
=
"hostTypeTree1"
,
businessTree
=
"businessTree1"
,
)
self
.
check_interface
(
host_id
=
host_id
,
_type
=
1
,
useip
=
1
,
ip
=
self
.
base_ip
,
dns
=
""
,
port
=
self
.
base_port
)
if
__name__
==
"__main__"
:
from
WorkUtils.UtilsPyTest
import
UtilsPyTest
from
WorkUtils.UtilsCmd
import
UtilsCmd
import
os
# 执行自动化测试用例
case_info
=
os
.
path
.
split
(
__file__
)
case
=
UtilsCmd
()
.
pytest_cmd
()
r
=
UtilsPyTest
(
case
=
case
,
case_info
=
case_info
)
r
.
run_main
()
# a = TestDeviceUpdate()
# a.setup_class()
# a.setup_method()
# a.test_case_04()
WorkCase/APP/__init__.py
View file @
83c4a24e
...
...
@@ -406,15 +406,6 @@ class AppBase(object):
assert
_msg
==
msg
@allure.step
(
"校验数据"
)
def
check_data_keyValue
(
self
,
response
,
_key
,
_value
,
isIn
=
None
):
data
=
UtilsResponse
()
.
get_data
(
response
=
response
)
for
x
,
y
in
enumerate
(
data
[
"list"
]):
if
isIn
==
1
:
assert
_value
in
y
[
_key
]
else
:
assert
y
[
_key
]
==
_value
@allure.step
(
"校验数据"
)
def
check_keyValue
(
self
,
_json
,
_key
,
_value
,
isIn
=
None
):
for
x
,
y
in
enumerate
(
_json
):
if
isIn
==
1
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment