mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-01-18 02:39:30 +00:00
Merge pull request #257 from red-hat-storage/sync_us--devel
Syncing latest changes from upstream devel for ceph-csi
This commit is contained in:
commit
96f03034bf
@ -22,6 +22,8 @@ jobs:
|
|||||||
k8s: ["1.25", "1.26", "1.27", "1.28", "1.29"]
|
k8s: ["1.25", "1.26", "1.27", "1.28", "1.29"]
|
||||||
exclude:
|
exclude:
|
||||||
# the next Ceph-CSI version will not be tested with old Kubernetes
|
# the next Ceph-CSI version will not be tested with old Kubernetes
|
||||||
|
- k8s: "1.26"
|
||||||
|
branch: "devel"
|
||||||
- k8s: "1.25"
|
- k8s: "1.25"
|
||||||
branch: "devel"
|
branch: "devel"
|
||||||
- k8s: "1.25"
|
- k8s: "1.25"
|
||||||
|
75
.mergify.yml
75
.mergify.yml
@ -37,6 +37,28 @@ queue_rules:
|
|||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.29"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.29"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.26"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.29"
|
||||||
|
- "status-success=ci/centos/upgrade-tests-cephfs"
|
||||||
|
- "status-success=ci/centos/upgrade-tests-rbd"
|
||||||
|
- and:
|
||||||
|
- base=release-v3.10
|
||||||
|
- "status-success=codespell"
|
||||||
|
- "status-success=multi-arch-build"
|
||||||
|
- "status-success=go-test"
|
||||||
|
- "status-success=golangci-lint"
|
||||||
|
- "status-success=mod-check"
|
||||||
|
- "status-success=lint-extras"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
@ -72,15 +94,15 @@ queue_rules:
|
|||||||
- "status-success=golangci-lint"
|
- "status-success=golangci-lint"
|
||||||
- "status-success=mod-check"
|
- "status-success=mod-check"
|
||||||
- "status-success=lint-extras"
|
- "status-success=lint-extras"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.29"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.26"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.29"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.29"
|
||||||
- "status-success=ci/centos/upgrade-tests-cephfs"
|
- "status-success=ci/centos/upgrade-tests-cephfs"
|
||||||
- "status-success=ci/centos/upgrade-tests-rbd"
|
- "status-success=ci/centos/upgrade-tests-rbd"
|
||||||
- and:
|
- and:
|
||||||
@ -166,15 +188,15 @@ pull_request_rules:
|
|||||||
- "status-success=golangci-lint"
|
- "status-success=golangci-lint"
|
||||||
- "status-success=mod-check"
|
- "status-success=mod-check"
|
||||||
- "status-success=lint-extras"
|
- "status-success=lint-extras"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.29"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.26"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.29"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.29"
|
||||||
- "status-success=ci/centos/upgrade-tests-cephfs"
|
- "status-success=ci/centos/upgrade-tests-cephfs"
|
||||||
- "status-success=ci/centos/upgrade-tests-rbd"
|
- "status-success=ci/centos/upgrade-tests-rbd"
|
||||||
- "status-success=DCO"
|
- "status-success=DCO"
|
||||||
@ -211,6 +233,35 @@ pull_request_rules:
|
|||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.29"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.29"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.26"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.29"
|
||||||
|
- "status-success=ci/centos/upgrade-tests-cephfs"
|
||||||
|
- "status-success=ci/centos/upgrade-tests-rbd"
|
||||||
|
- and:
|
||||||
|
- label!=DNM
|
||||||
|
- base=release-v3.10
|
||||||
|
- "#approved-reviews-by>=2"
|
||||||
|
- "#changes-requested-reviews-by=0"
|
||||||
|
- "approved-reviews-by=@ceph/ceph-csi-contributors"
|
||||||
|
- "approved-reviews-by=@ceph/ceph-csi-maintainers"
|
||||||
|
- "status-success=DCO"
|
||||||
|
- "status-success=codespell"
|
||||||
|
- "status-success=commitlint"
|
||||||
|
- "status-success=go-test"
|
||||||
|
- "status-success=golangci-lint"
|
||||||
|
- "status-success=lint-extras"
|
||||||
|
- "status-success=mod-check"
|
||||||
|
- "status-success=multi-arch-build"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
@ -259,15 +310,15 @@ pull_request_rules:
|
|||||||
- "status-success=commitlint"
|
- "status-success=commitlint"
|
||||||
- "status-success=mod-check"
|
- "status-success=mod-check"
|
||||||
- "status-success=lint-extras"
|
- "status-success=lint-extras"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.29"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.26"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.29"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.29"
|
||||||
- "status-success=ci/centos/upgrade-tests-cephfs"
|
- "status-success=ci/centos/upgrade-tests-cephfs"
|
||||||
- "status-success=ci/centos/upgrade-tests-rbd"
|
- "status-success=ci/centos/upgrade-tests-rbd"
|
||||||
- "status-success=DCO"
|
- "status-success=DCO"
|
||||||
@ -317,15 +368,15 @@ pull_request_rules:
|
|||||||
- "status-success=mod-check"
|
- "status-success=mod-check"
|
||||||
- "status-success=lint-extras"
|
- "status-success=lint-extras"
|
||||||
- "#changes-requested-reviews-by=0"
|
- "#changes-requested-reviews-by=0"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.26"
|
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.27"
|
||||||
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.28"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.26"
|
- "status-success=ci/centos/k8s-e2e-external-storage/1.29"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.28"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.26"
|
- "status-success=ci/centos/mini-e2e-helm/k8s-1.29"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
- "status-success=ci/centos/mini-e2e/k8s-1.27"
|
||||||
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
- "status-success=ci/centos/mini-e2e/k8s-1.28"
|
||||||
|
- "status-success=ci/centos/mini-e2e/k8s-1.29"
|
||||||
- "status-success=ci/centos/upgrade-tests-cephfs"
|
- "status-success=ci/centos/upgrade-tests-cephfs"
|
||||||
- "status-success=ci/centos/upgrade-tests-rbd"
|
- "status-success=ci/centos/upgrade-tests-rbd"
|
||||||
- "status-success=DCO"
|
- "status-success=DCO"
|
||||||
|
@ -30,7 +30,7 @@ GOLANGCI_VERSION=v1.54.1
|
|||||||
|
|
||||||
# external snapshotter version
|
# external snapshotter version
|
||||||
# Refer: https://github.com/kubernetes-csi/external-snapshotter/releases
|
# Refer: https://github.com/kubernetes-csi/external-snapshotter/releases
|
||||||
SNAPSHOT_VERSION=v6.2.2
|
SNAPSHOT_VERSION=v7.0.1
|
||||||
|
|
||||||
# "go test" configuration
|
# "go test" configuration
|
||||||
# set to stdout or html to enable coverage reporting, disabled by default
|
# set to stdout or html to enable coverage reporting, disabled by default
|
||||||
|
@ -7,6 +7,9 @@ SCRIPT_DIR="$(dirname "${0}")"
|
|||||||
# shellcheck source=build.env
|
# shellcheck source=build.env
|
||||||
source "${SCRIPT_DIR}/../build.env"
|
source "${SCRIPT_DIR}/../build.env"
|
||||||
|
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
[ ! -e "${SCRIPT_DIR}"/utils.sh ] || source "${SCRIPT_DIR}"/utils.sh
|
||||||
|
|
||||||
SNAPSHOT_VERSION=${SNAPSHOT_VERSION:-"v5.0.1"}
|
SNAPSHOT_VERSION=${SNAPSHOT_VERSION:-"v5.0.1"}
|
||||||
|
|
||||||
TEMP_DIR="$(mktemp -d)"
|
TEMP_DIR="$(mktemp -d)"
|
||||||
@ -21,6 +24,11 @@ SNAPSHOTCLASS="${SNAPSHOTTER_URL}/client/config/crd/snapshot.storage.k8s.io_volu
|
|||||||
VOLUME_SNAPSHOT_CONTENT="${SNAPSHOTTER_URL}/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml"
|
VOLUME_SNAPSHOT_CONTENT="${SNAPSHOTTER_URL}/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml"
|
||||||
VOLUME_SNAPSHOT="${SNAPSHOTTER_URL}/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml"
|
VOLUME_SNAPSHOT="${SNAPSHOTTER_URL}/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml"
|
||||||
|
|
||||||
|
# volumegroupsnapshot CRD
|
||||||
|
VOLUME_GROUP_SNAPSHOTCLASS="${SNAPSHOTTER_URL}/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotclasses.yaml"
|
||||||
|
VOLUME_GROUP_SNAPSHOT_CONTENT="${SNAPSHOTTER_URL}/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshotcontents.yaml"
|
||||||
|
VOLUME_GROUP_SNAPSHOT="${SNAPSHOTTER_URL}/client/config/crd/groupsnapshot.storage.k8s.io_volumegroupsnapshots.yaml"
|
||||||
|
|
||||||
function install_snapshot_controller() {
|
function install_snapshot_controller() {
|
||||||
local namespace=$1
|
local namespace=$1
|
||||||
if [ -z "${namespace}" ]; then
|
if [ -z "${namespace}" ]; then
|
||||||
@ -29,19 +37,19 @@ function install_snapshot_controller() {
|
|||||||
|
|
||||||
create_or_delete_resource "create" "${namespace}"
|
create_or_delete_resource "create" "${namespace}"
|
||||||
|
|
||||||
pod_ready=$(kubectl get pods -l app=snapshot-controller -n "${namespace}" -o jsonpath='{.items[0].status.containerStatuses[0].ready}')
|
pod_ready=$(kubectl_retry get pods -l app.kubernetes.io/name=snapshot-controller -n "${namespace}" -o jsonpath='{.items[0].status.containerStatuses[0].ready}')
|
||||||
INC=0
|
INC=0
|
||||||
until [[ "${pod_ready}" == "true" || $INC -gt 20 ]]; do
|
until [[ "${pod_ready}" == "true" || $INC -gt 20 ]]; do
|
||||||
sleep 10
|
sleep 10
|
||||||
((++INC))
|
((++INC))
|
||||||
pod_ready=$(kubectl get pods -l app=snapshot-controller -n "${namespace}" -o jsonpath='{.items[0].status.containerStatuses[0].ready}')
|
pod_ready=$(kubectl_retry get pods -l app.kubernetes.io/name=snapshot-controller -n "${namespace}" -o jsonpath='{.items[0].status.containerStatuses[0].ready}')
|
||||||
echo "snapshotter pod status: ${pod_ready}"
|
echo "snapshotter pod status: ${pod_ready}"
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ "${pod_ready}" != "true" ]; then
|
if [ "${pod_ready}" != "true" ]; then
|
||||||
echo "snapshotter controller creation failed"
|
echo "snapshotter controller creation failed"
|
||||||
kubectl get pods -l app=snapshot-controller -n "${namespace}"
|
kubectl_retry get pods -l app.kubernetes.io/name=snapshot-controller -n "${namespace}"
|
||||||
kubectl describe po -l app=snapshot-controller -n "${namespace}"
|
kubectl_retry describe po -l app.kubernetes.io/name=snapshot-controller -n "${namespace}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -66,19 +74,31 @@ function create_or_delete_resource() {
|
|||||||
curl -o "${temp_snap_controller}" "${SNAPSHOT_CONTROLLER}"
|
curl -o "${temp_snap_controller}" "${SNAPSHOT_CONTROLLER}"
|
||||||
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_rbac}"
|
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_rbac}"
|
||||||
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_snap_controller}"
|
sed -i "s/namespace: kube-system/namespace: ${namespace}/g" "${temp_snap_controller}"
|
||||||
sed -i "s/canary/${SNAPSHOT_VERSION}/g" "${temp_snap_controller}"
|
sed -i -E "s/(image: registry\.k8s\.io\/sig-storage\/snapshot-controller:).*$/\1$SNAPSHOT_VERSION/g" "${temp_snap_controller}"
|
||||||
|
|
||||||
kubectl "${operation}" -f "${temp_rbac}"
|
if [ "${operation}" == "create" ]; then
|
||||||
kubectl "${operation}" -f "${temp_snap_controller}" -n "${namespace}"
|
# Argument to add/update
|
||||||
kubectl "${operation}" -f "${SNAPSHOTCLASS}"
|
ARGUMENT="--enable-volume-group-snapshots=true"
|
||||||
kubectl "${operation}" -f "${VOLUME_SNAPSHOT_CONTENT}"
|
# Check if the argument is already present and set to false
|
||||||
kubectl "${operation}" -f "${VOLUME_SNAPSHOT}"
|
if grep -q -E "^\s+-\s+--enable-volume-group-snapshots=false" "${temp_snap_controller}"; then
|
||||||
}
|
sed -i -E "s/^\s+-\s+--enable-volume-group-snapshots=false$/ - $ARGUMENT/" "${temp_snap_controller}"
|
||||||
|
# Check if the argument is already present and set to true
|
||||||
|
elif grep -q -E "^\s+-\s+--enable-volume-group-snapshots=true" "${temp_snap_controller}"; then
|
||||||
|
echo "Argument already present and matching."
|
||||||
|
else
|
||||||
|
# Add the argument if it's not present
|
||||||
|
sed -i -E "/^(\s+)args:/a\ \ - $ARGUMENT" "${temp_snap_controller}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
function delete_snapshot_crd() {
|
kubectl_retry "${operation}" -f "${VOLUME_GROUP_SNAPSHOTCLASS}"
|
||||||
kubectl delete -f "${SNAPSHOTCLASS}" --ignore-not-found
|
kubectl_retry "${operation}" -f "${VOLUME_GROUP_SNAPSHOT_CONTENT}"
|
||||||
kubectl delete -f "${VOLUME_SNAPSHOT_CONTENT}" --ignore-not-found
|
kubectl_retry "${operation}" -f "${VOLUME_GROUP_SNAPSHOT}"
|
||||||
kubectl delete -f "${VOLUME_SNAPSHOT}" --ignore-not-found
|
kubectl_retry "${operation}" -f "${temp_rbac}"
|
||||||
|
kubectl_retry "${operation}" -f "${temp_snap_controller}" -n "${namespace}"
|
||||||
|
kubectl_retry "${operation}" -f "${SNAPSHOTCLASS}"
|
||||||
|
kubectl_retry "${operation}" -f "${VOLUME_SNAPSHOT_CONTENT}"
|
||||||
|
kubectl_retry "${operation}" -f "${VOLUME_SNAPSHOT}"
|
||||||
}
|
}
|
||||||
|
|
||||||
case "${1:-}" in
|
case "${1:-}" in
|
||||||
|
Loading…
Reference in New Issue
Block a user