Support both Ely and Dundee in MOS9
Ely has changed the way of building supplemental package, this patch is to support both Ely and Dundee with MOS9 1. Change build-xenserver-suppack.sh to build ely package 2. Change the source code to install correct supplemental package Change-Id: Ieafb9f1c407b05c92bbf6769d35d8ccef06fc5f5
This commit is contained in:
parent
1c98684f16
commit
2142efbe52
12
Makefile
12
Makefile
|
@ -22,12 +22,13 @@ md5: output/${MD5_FILENAME}
|
||||||
|
|
||||||
docs: md5 $(DOC_NAMES:%=output/${PLUGIN_NAME}-${PLUGIN_VERSION}-%.pdf)
|
docs: md5 $(DOC_NAMES:%=output/${PLUGIN_NAME}-${PLUGIN_VERSION}-%.pdf)
|
||||||
|
|
||||||
iso: suppack/xenapi-plugins-${OPENSTACK_RELEASE}.iso
|
REQUIRED_ISOS=$(PLATFORMS:%=suppack/xcp_%/xenapi-plugins-${OPENSTACK_RELEASE}.iso)
|
||||||
|
iso: $(REQUIRED_ISOS)
|
||||||
|
|
||||||
suppack/xenapi-plugins-${OPENSTACK_RELEASE}.iso: plugin_source/deployment_scripts/patchset/xenhost
|
$(REQUIRED_ISOS): plugin_source/deployment_scripts/patchset/xenhost
|
||||||
suppack/build-xenserver-suppack.sh ${OPENSTACK_RELEASE} ${HYPERVISOR_NAME}
|
suppack/build-xenserver-suppack.sh ${OPENSTACK_RELEASE} ${HYPERVISOR_NAME}
|
||||||
|
|
||||||
${BUILDROOT}/${PLUGIN_NAME}/branded: ${BRANDING} suppack/xenapi-plugins-${OPENSTACK_RELEASE}.iso plugin_source
|
${BUILDROOT}/${PLUGIN_NAME}/branded: ${BRANDING} ${REQUIRED_ISOS} plugin_source
|
||||||
mkdir -p ${BUILDROOT}/${PLUGIN_NAME}
|
mkdir -p ${BUILDROOT}/${PLUGIN_NAME}
|
||||||
cp -r plugin_source/* ${BUILDROOT}/${PLUGIN_NAME}
|
cp -r plugin_source/* ${BUILDROOT}/${PLUGIN_NAME}
|
||||||
find ${BUILDROOT}/${PLUGIN_NAME} -type f -print0 | \
|
find ${BUILDROOT}/${PLUGIN_NAME} -type f -print0 | \
|
||||||
|
@ -38,8 +39,7 @@ ${BUILDROOT}/${PLUGIN_NAME}/branded: ${BRANDING} suppack/xenapi-plugins-${OPENST
|
||||||
-e s/@PLUGIN_VERSION@/${PLUGIN_VERSION}/g \
|
-e s/@PLUGIN_VERSION@/${PLUGIN_VERSION}/g \
|
||||||
-e s/@PLUGIN_REVISION@/${PLUGIN_REVISION}/g \
|
-e s/@PLUGIN_REVISION@/${PLUGIN_REVISION}/g \
|
||||||
-e s/@VERSION_HOTFIXES@/${VERSION_HOTFIXES}/g {}
|
-e s/@VERSION_HOTFIXES@/${VERSION_HOTFIXES}/g {}
|
||||||
cp suppack/xenapi-plugins-*.iso ${BUILDROOT}/${PLUGIN_NAME}/deployment_scripts/
|
cp -r suppack/xcp_* ${BUILDROOT}/${PLUGIN_NAME}/deployment_scripts/
|
||||||
cp suppack/conntrack-tools.iso ${BUILDROOT}/${PLUGIN_NAME}/deployment_scripts/
|
|
||||||
touch ${BUILDROOT}/${PLUGIN_NAME}/branded
|
touch ${BUILDROOT}/${PLUGIN_NAME}/branded
|
||||||
|
|
||||||
output/${RPM_NAME}: ${BUILDROOT}/${PLUGIN_NAME}/branded
|
output/${RPM_NAME}: ${BUILDROOT}/${PLUGIN_NAME}/branded
|
||||||
|
@ -75,4 +75,4 @@ output/${MD5_FILENAME}: output/${RPM_NAME}
|
||||||
md5sum $^ > $@
|
md5sum $^ > $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf ${BUILDROOT} output suppack/xenapi-plugins-${OPENSTACK_RELEASE}* suppack/conntrack-tools.* suppack/build
|
rm -rf ${BUILDROOT} output suppack/xcp_* suppack/build
|
||||||
|
|
|
@ -2,8 +2,8 @@ HYPERVISOR_NAME=XenServer
|
||||||
HYPERVISOR_LOWER=xenserver
|
HYPERVISOR_LOWER=xenserver
|
||||||
PLUGIN_NAME=fuel-plugin-xenserver
|
PLUGIN_NAME=fuel-plugin-xenserver
|
||||||
VERSION_HOTFIXES='{"6.5.0":["XS65ESP1013"]}'
|
VERSION_HOTFIXES='{"6.5.0":["XS65ESP1013"]}'
|
||||||
|
PLATFORMS=1.9.0 2.1.0 2.2.0
|
||||||
PLUGIN_BRANCHES="9.0 8.0 7.0 6.1"
|
PLUGIN_BRANCHES=9.0 8.0 7.0 6.1
|
||||||
PLUGIN_VERSION_6_1=1.0
|
PLUGIN_VERSION_6_1=1.0
|
||||||
PLUGIN_VERSION_7_0=2.0
|
PLUGIN_VERSION_7_0=2.0
|
||||||
PLUGIN_VERSION_8_0=3.1
|
PLUGIN_VERSION_8_0=3.1
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
# Source the branding file
|
# Source the branding file
|
||||||
. ${1}
|
source <(sed -e 's/\(.*\)=\(.*\)/\1="\2"/' ${1})
|
||||||
|
|
||||||
# Find shortest delta
|
# Find shortest delta
|
||||||
my_merge_base=$(git merge-base HEAD origin/master)
|
my_merge_base=$(git merge-base HEAD origin/master)
|
||||||
|
|
|
@ -14,7 +14,6 @@ from utils import HIMN_IP
|
||||||
INT_BRIDGE = 'br-int'
|
INT_BRIDGE = 'br-int'
|
||||||
XS_PLUGIN_ISO = 'xenapi-plugins-mitaka.iso'
|
XS_PLUGIN_ISO = 'xenapi-plugins-mitaka.iso'
|
||||||
DIST_PACKAGES_DIR = '/usr/lib/python2.7/dist-packages/'
|
DIST_PACKAGES_DIR = '/usr/lib/python2.7/dist-packages/'
|
||||||
CONNTRACK_ISO = 'conntrack-tools.iso'
|
|
||||||
CONNTRACK_CONF_SAMPLE =\
|
CONNTRACK_CONF_SAMPLE =\
|
||||||
'/usr/share/doc/conntrack-tools-1.4.2/doc/stats/conntrackd.conf'
|
'/usr/share/doc/conntrack-tools-1.4.2/doc/stats/conntrackd.conf'
|
||||||
|
|
||||||
|
@ -129,10 +128,13 @@ def route_to_compute(endpoints, himn_xs, himn_local, username):
|
||||||
'> /etc/udev/rules.d/90-reroute.rules'))
|
'> /etc/udev/rules.d/90-reroute.rules'))
|
||||||
|
|
||||||
|
|
||||||
def install_suppack(himn, username, package):
|
def install_suppack(himn, username, package, xcp_version):
|
||||||
"""Install xapi driver supplemental pack. """
|
"""Install xapi driver supplemental pack. """
|
||||||
tmp = utils.ssh(himn, username, 'mktemp', '-d')
|
tmp = utils.ssh(himn, username, 'mktemp', '-d')
|
||||||
utils.scp(himn, username, tmp, package)
|
real_pack = "xcp_%s/%s" % (xcp_version, package)
|
||||||
|
if not os.path.exists(real_pack):
|
||||||
|
utils.reportError('Package folder %s not exist' % real_pack)
|
||||||
|
utils.scp(himn, username, tmp, real_pack)
|
||||||
utils.ssh(himn, username, 'xe-install-supplemental-pack',
|
utils.ssh(himn, username, 'xe-install-supplemental-pack',
|
||||||
tmp + '/' + package, prompt='Y\n')
|
tmp + '/' + package, prompt='Y\n')
|
||||||
utils.ssh(himn, username, 'rm', tmp, '-rf')
|
utils.ssh(himn, username, 'rm', tmp, '-rf')
|
||||||
|
@ -357,21 +359,14 @@ def check_and_setup_ceilometer(himn, username, password):
|
||||||
restart_services('ceilometer-polling')
|
restart_services('ceilometer-polling')
|
||||||
|
|
||||||
|
|
||||||
def enable_conntrack_service(himn, username):
|
def enable_conntrack_service(himn, username, xcp_version):
|
||||||
xcp_ver = utils.ssh(himn, username,
|
if LooseVersion(xcp_version) < LooseVersion('2.1.0'):
|
||||||
('xe host-param-get uuid=$(xe host-list --minimal) '
|
|
||||||
'param-name=software-version '
|
|
||||||
'param-key=platform_version'))
|
|
||||||
if LooseVersion(xcp_ver) < LooseVersion('2.1.0'):
|
|
||||||
# Only support conntrack-tools since XS7.0(XCP2.1.0) and above
|
# Only support conntrack-tools since XS7.0(XCP2.1.0) and above
|
||||||
LOG.info('No need to enable conntrack-tools with XCP %s' % xcp_ver)
|
LOG.info('No need to enable conntrack-tools with XCP %s' % xcp_version)
|
||||||
return
|
return
|
||||||
|
|
||||||
conn_installed = utils.ssh(himn, username,
|
# use conntrack statistic mode, so change conntrackd.conf
|
||||||
'find', '/usr/sbin', '-name', 'conntrackd')
|
if not os.path.exists('/etc/conntrackd/conntrackd.conf.back'):
|
||||||
if not conn_installed:
|
|
||||||
install_suppack(himn, username, CONNTRACK_ISO)
|
|
||||||
# use conntrack statistic mode, so change conntrackd.conf
|
|
||||||
utils.ssh(himn, username,
|
utils.ssh(himn, username,
|
||||||
'mv',
|
'mv',
|
||||||
'/etc/conntrackd/conntrackd.conf',
|
'/etc/conntrackd/conntrackd.conf',
|
||||||
|
@ -389,6 +384,14 @@ def enable_conntrack_service(himn, username):
|
||||||
utils.ssh(himn, username, 'service', 'conntrackd', 'restart')
|
utils.ssh(himn, username, 'service', 'conntrackd', 'restart')
|
||||||
|
|
||||||
|
|
||||||
|
def get_xcp_version(himn, username):
|
||||||
|
xcp_ver = utils.ssh(himn, username,
|
||||||
|
('xe host-param-get uuid=$(xe host-list --minimal) '
|
||||||
|
'param-name=software-version '
|
||||||
|
'param-key=platform_version'))
|
||||||
|
return xcp_ver
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
install_xenapi_sdk()
|
install_xenapi_sdk()
|
||||||
astute = utils.get_astute()
|
astute = utils.get_astute()
|
||||||
|
@ -405,8 +408,9 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
if username and password and endpoints and himn_local:
|
if username and password and endpoints and himn_local:
|
||||||
route_to_compute(endpoints, HIMN_IP, himn_local, username)
|
route_to_compute(endpoints, HIMN_IP, himn_local, username)
|
||||||
|
xcp_version = get_xcp_version(HIMN_IP, username)
|
||||||
if install_xapi:
|
if install_xapi:
|
||||||
install_suppack(HIMN_IP, username, XS_PLUGIN_ISO)
|
install_suppack(HIMN_IP, username, XS_PLUGIN_ISO, xcp_version)
|
||||||
enable_linux_bridge(HIMN_IP, username)
|
enable_linux_bridge(HIMN_IP, username)
|
||||||
forward_from_himn(himn_eth)
|
forward_from_himn(himn_eth)
|
||||||
|
|
||||||
|
@ -421,7 +425,7 @@ if __name__ == '__main__':
|
||||||
install_logrotate_script(HIMN_IP, username)
|
install_logrotate_script(HIMN_IP, username)
|
||||||
|
|
||||||
# enable conntrackd service in Dom0
|
# enable conntrackd service in Dom0
|
||||||
enable_conntrack_service(HIMN_IP, username)
|
enable_conntrack_service(HIMN_IP, username, xcp_version)
|
||||||
|
|
||||||
# neutron-l2-agent in compute node
|
# neutron-l2-agent in compute node
|
||||||
modify_neutron_rootwrap_conf(HIMN_IP, username, password)
|
modify_neutron_rootwrap_conf(HIMN_IP, username, password)
|
||||||
|
|
|
@ -4,21 +4,39 @@ set -eux
|
||||||
|
|
||||||
# =============================================
|
# =============================================
|
||||||
# Usage of this script:
|
# Usage of this script:
|
||||||
# ./build-xenserver-suppack.sh xs-version xs-build git-branch plugin-version
|
# ./build-xenserver-suppack.sh os-release hypervisor-name xs-plugin-version key
|
||||||
# or
|
# Or
|
||||||
# ./build-xenserver-suppack.sh
|
# ./build-xenserver-suppack.sh
|
||||||
#
|
#
|
||||||
# You can provide explict input parameters or you can use the default ones:
|
# You can provide explict input parameters or you can use the default ones:
|
||||||
# XenServer version
|
# OpenStack release
|
||||||
# XenServer build
|
# Hypervisor name
|
||||||
# OpenStack release branch
|
|
||||||
# XenServer OpenStack plugin version
|
# XenServer OpenStack plugin version
|
||||||
|
# Key for building supplemental packages
|
||||||
|
# Keyfile for building supplemental packages
|
||||||
|
#
|
||||||
|
# Prerequisite:
|
||||||
|
# For Dundee:
|
||||||
|
# No
|
||||||
|
# For Ely:
|
||||||
|
# 1. Secret key is imported to the VM which is use for building suppack
|
||||||
|
# 2. Public keyfile is downloaded to this folder in the building VM
|
||||||
|
# 3. Below packages should be installed in advance:
|
||||||
|
# expect-5.45-14.el7_1.x86_64
|
||||||
|
# libarchive-3.1.2-7.el7.x86_64
|
||||||
|
# rpm-sign-4.11.3-17.el7.x86_64
|
||||||
|
|
||||||
|
|
||||||
THIS_FILE=$(readlink -f $0)
|
THIS_FILE=$(readlink -f $0)
|
||||||
FUELPLUG_UTILS_ROOT=$(dirname $THIS_FILE)
|
FUELPLUG_UTILS_ROOT=$(dirname $THIS_FILE)
|
||||||
BUILDROOT=${FUELPLUG_UTILS_ROOT}/build
|
BUILDROOT=${FUELPLUG_UTILS_ROOT}/build
|
||||||
rm -rf $BUILDROOT
|
SUPPACK_CREEDENCE=${FUELPLUG_UTILS_ROOT}/xcp_1.9.0
|
||||||
|
SUPPACK_DUNDEE=${FUELPLUG_UTILS_ROOT}/xcp_2.1.0
|
||||||
|
SUPPACK_ELY=${FUELPLUG_UTILS_ROOT}/xcp_2.2.0
|
||||||
|
rm -rf $BUILDROOT $SUPPACK_CREEDENCE $SUPPACK_DUNDEE $SUPPACK_ELY
|
||||||
|
mkdir -p $SUPPACK_CREEDENCE
|
||||||
|
mkdir -p $SUPPACK_DUNDEE
|
||||||
|
mkdir -p $SUPPACK_ELY
|
||||||
mkdir -p $BUILDROOT && cd $BUILDROOT
|
mkdir -p $BUILDROOT && cd $BUILDROOT
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,10 +47,15 @@ mkdir -p $BUILDROOT && cd $BUILDROOT
|
||||||
OS_RELEASE=${1:-"mitaka"}
|
OS_RELEASE=${1:-"mitaka"}
|
||||||
|
|
||||||
HYPERVISOR_NAME=${2:-"XenServer"}
|
HYPERVISOR_NAME=${2:-"XenServer"}
|
||||||
PLATFORM_VERSION=${3:-"1.9"}
|
|
||||||
|
|
||||||
# nova and neutron xenserver dom0 plugin version
|
# nova and neutron xenserver dom0 plugin version
|
||||||
XS_PLUGIN_VERSION=${4:-"13.0.0"}
|
XS_PLUGIN_VERSION=${3:-"13.0.0"}
|
||||||
|
|
||||||
|
# key of the public/secret OpenStack GPG key
|
||||||
|
SUPPACK_KEY=${4:-"Citrix OpenStack (XenServer Updates) <openstack@citrix.com>"}
|
||||||
|
|
||||||
|
# keyfile
|
||||||
|
SUPPACK_KEYFILE=${5:-"RPM-GPG-KEY-XS-OPENSTACK"}
|
||||||
|
|
||||||
# branch info
|
# branch info
|
||||||
GITBRANCH="stable/$OS_RELEASE"
|
GITBRANCH="stable/$OS_RELEASE"
|
||||||
|
@ -46,7 +69,7 @@ RPM_BUILDER_REPO="https://github.com/citrix-openstack/xenserver-nova-suppack-bui
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
# =============================================
|
# =============================================
|
||||||
# Install suppack builder
|
# Install suppack builder for Dundee (XCP 2.1.0)
|
||||||
RPM_ROOT=http://coltrane.uk.xensource.com/usr/groups/release/XenServer-7.x/XS-7.0/RTM-125380/binary-packages/RPMS/domain0/RPMS/noarch
|
RPM_ROOT=http://coltrane.uk.xensource.com/usr/groups/release/XenServer-7.x/XS-7.0/RTM-125380/binary-packages/RPMS/domain0/RPMS/noarch
|
||||||
wget $RPM_ROOT/supp-pack-build-2.1.0-xs55.noarch.rpm -O supp-pack-build.rpm
|
wget $RPM_ROOT/supp-pack-build-2.1.0-xs55.noarch.rpm -O supp-pack-build.rpm
|
||||||
wget $RPM_ROOT/xcp-python-libs-1.9.0-159.noarch.rpm -O xcp-python-libs.rpm
|
wget $RPM_ROOT/xcp-python-libs-1.9.0-159.noarch.rpm -O xcp-python-libs.rpm
|
||||||
|
@ -54,6 +77,16 @@ wget $RPM_ROOT/xcp-python-libs-1.9.0-159.noarch.rpm -O xcp-python-libs.rpm
|
||||||
# Don't install the RPM as we may not have root.
|
# Don't install the RPM as we may not have root.
|
||||||
rpm2cpio supp-pack-build.rpm | cpio -idm
|
rpm2cpio supp-pack-build.rpm | cpio -idm
|
||||||
rpm2cpio xcp-python-libs.rpm | cpio -idm
|
rpm2cpio xcp-python-libs.rpm | cpio -idm
|
||||||
|
|
||||||
|
# ==============================================
|
||||||
|
# Install suppack builder for Ely (XCP 2.2.0)
|
||||||
|
RPM_ROOT=http://coltrane.uk.xensource.com/release/XenServer-7.x/XS-7.1/RC/137005.signed/binary-packages/RPMS/domain0/RPMS/noarch/
|
||||||
|
wget $RPM_ROOT/python-libarchive-c-2.5-1.el7.centos.noarch.rpm -O python-libarchive.rpm
|
||||||
|
wget $RPM_ROOT/update-package-1.1.2-1.noarch.rpm -O update-package.rpm
|
||||||
|
|
||||||
|
rpm2cpio python-libarchive.rpm | cpio -idm
|
||||||
|
rpm2cpio update-package.rpm | cpio -idm
|
||||||
|
|
||||||
# Work around dodgy requirements for xcp.supplementalpack.setup function
|
# Work around dodgy requirements for xcp.supplementalpack.setup function
|
||||||
# Note that either root or a virtual env is needed here. venvs are better :)
|
# Note that either root or a virtual env is needed here. venvs are better :)
|
||||||
cp -f usr/bin/* .
|
cp -f usr/bin/* .
|
||||||
|
@ -125,9 +158,7 @@ EXTRA_RPMS="$EXTRA_RPMS $(find $FUELPLUG_UTILS_ROOT -name "libnetfilter_queue-*.
|
||||||
|
|
||||||
|
|
||||||
# =============================================
|
# =============================================
|
||||||
# Create Supplemental pack
|
# Create Supplemental pack for Creedence and Dundee
|
||||||
#rm -rf suppack
|
|
||||||
#mkdir -p suppack
|
|
||||||
|
|
||||||
tee buildscript.py << EOF
|
tee buildscript.py << EOF
|
||||||
import sys
|
import sys
|
||||||
|
@ -157,19 +188,51 @@ EOF
|
||||||
|
|
||||||
python buildscript.py \
|
python buildscript.py \
|
||||||
--pdn=xenapi-plugins-$OS_RELEASE \
|
--pdn=xenapi-plugins-$OS_RELEASE \
|
||||||
--pdv=$PLATFORM_VERSION \
|
--pdv="1.9.0" \
|
||||||
--hvn="$HYPERVISOR_NAME" \
|
--hvn="$HYPERVISOR_NAME" \
|
||||||
--desc="OpenStack Plugins" \
|
--desc="OpenStack Plugins" \
|
||||||
--bld=0 \
|
--bld=0 \
|
||||||
--out=$FUELPLUG_UTILS_ROOT \
|
--out=$SUPPACK_CREEDENCE \
|
||||||
$RPMFILE \
|
$RPMFILE \
|
||||||
$NEUTRON_RPMFILE
|
$NEUTRON_RPMFILE
|
||||||
|
|
||||||
python buildscript.py \
|
python buildscript.py \
|
||||||
--pdn=conntrack-tools \
|
--pdn=xenapi-plugins-$OS_RELEASE \
|
||||||
--pdv=$PLATFORM_VERSION \
|
--pdv="2.1.0" \
|
||||||
--hvn="$HYPERVISOR_NAME" \
|
--hvn="$HYPERVISOR_NAME" \
|
||||||
--desc="Dom0 conntrack-tools" \
|
--desc="OpenStack Plugins" \
|
||||||
--bld=0 \
|
--bld=0 \
|
||||||
--out=$FUELPLUG_UTILS_ROOT \
|
--out=$SUPPACK_DUNDEE \
|
||||||
|
$RPMFILE \
|
||||||
|
$NEUTRON_RPMFILE \
|
||||||
$EXTRA_RPMS
|
$EXTRA_RPMS
|
||||||
|
|
||||||
|
|
||||||
|
# =============================================
|
||||||
|
# Create Supplemental pack for Ely
|
||||||
|
|
||||||
|
# KEY for building supplemental pack
|
||||||
|
SUPPACK_KEY="Citrix OpenStack (XenServer Updates) <openstack@citrix.com>"
|
||||||
|
CONNTRACK_UUID=`uuidgen`
|
||||||
|
XENAPI_PLUGIN_UUID=`uuidgen`
|
||||||
|
|
||||||
|
tee buildscript_ely.py << EOF
|
||||||
|
import sys
|
||||||
|
sys.path.append('$BUILDROOT/usr/lib/python2.7/site-packages')
|
||||||
|
from pkg_resources import load_entry_point
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(
|
||||||
|
load_entry_point('update-package', 'console_scripts', 'build-update')()
|
||||||
|
)
|
||||||
|
EOF
|
||||||
|
|
||||||
|
python buildscript_ely.py \
|
||||||
|
--uuid $XENAPI_PLUGIN_UUID \
|
||||||
|
-l "openstack-xenapi-plugins" \
|
||||||
|
-v 1.0 \
|
||||||
|
-d "OpenStack plugins supplemental pack" \
|
||||||
|
-o $SUPPACK_ELY/xenapi-plugins-$OS_RELEASE.iso \
|
||||||
|
-k "$SUPPACK_KEY" \
|
||||||
|
--keyfile "$FUELPLUG_UTILS_ROOT/$SUPPACK_KEYFILE" --no-passphrase \
|
||||||
|
$RPMFILE $NEUTRON_RPMFILE $EXTRA_RPMS
|
||||||
|
|
Loading…
Reference in New Issue