This is an automated email from the ASF dual-hosted git repository.
myskov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 129cdc18ed HDDS-10612. Add Robot test to verify Container Balancer for
RATIS containers (#6457)
129cdc18ed is described below
commit 129cdc18ed46909e4fbadc3ae0e96d9774aa2f17
Author: Anastasia Filippova <[email protected]>
AuthorDate: Tue Apr 2 15:00:59 2024 +0300
HDDS-10612. Add Robot test to verify Container Balancer for RATIS
containers (#6457)
---
.../dist/src/main/compose/ozone-balancer/.env | 20 +++
.../compose/ozone-balancer/docker-compose.yaml | 179 +++++++++++++++++++++
.../src/main/compose/ozone-balancer/docker-config | 62 +++++++
.../dist/src/main/compose/ozone-balancer/test.sh | 33 ++++
.../src/main/smoketest/balancer/testBalancer.robot | 143 ++++++++++++++++
5 files changed, 437 insertions(+)
diff --git a/hadoop-ozone/dist/src/main/compose/ozone-balancer/.env
b/hadoop-ozone/dist/src/main/compose/ozone-balancer/.env
new file mode 100644
index 0000000000..0e99fab82f
--- /dev/null
+++ b/hadoop-ozone/dist/src/main/compose/ozone-balancer/.env
@@ -0,0 +1,20 @@
+# 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.
+
+HDDS_VERSION=${hdds.version}
+OZONE_RUNNER_VERSION=${docker.ozone-runner.version}
+OZONE_RUNNER_IMAGE=apache/ozone-runner
+OZONE_OPTS=
\ No newline at end of file
diff --git
a/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-compose.yaml
b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-compose.yaml
new file mode 100644
index 0000000000..dc6bae7822
--- /dev/null
+++ b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-compose.yaml
@@ -0,0 +1,179 @@
+# 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.
+
+version: "3.8"
+
+# reusable fragments (see
https://docs.docker.com/compose/compose-file/#extension-fields)
+x-common-config:
+ &common-config
+ image: ${OZONE_RUNNER_IMAGE}:${OZONE_RUNNER_VERSION}
+ volumes:
+ - ../..:/opt/hadoop
+ env_file:
+ - docker-config
+
+x-replication:
+ &replication
+ OZONE-SITE.XML_ozone.server.default.replication:
${OZONE_REPLICATION_FACTOR:-3}
+
+services:
+ datanode1:
+ <<: *common-config
+ ports:
+ - 19864
+ - 9882
+ environment:
+ <<: *replication
+ command: ["ozone","datanode"]
+ volumes:
+ - tmpfs1:/data
+ - ../..:/opt/hadoop
+ datanode2:
+ <<: *common-config
+ ports:
+ - 19864
+ - 9882
+ environment:
+ <<: *replication
+ command: [ "ozone","datanode" ]
+ volumes:
+ - tmpfs2:/data
+ - ../..:/opt/hadoop
+ datanode3:
+ <<: *common-config
+ ports:
+ - 19864
+ - 9882
+ environment:
+ <<: *replication
+ command: [ "ozone","datanode" ]
+ volumes:
+ - tmpfs3:/data
+ - ../..:/opt/hadoop
+ datanode4:
+ <<: *common-config
+ ports:
+ - 19864
+ - 9882
+ environment:
+ <<: *replication
+ command: [ "ozone","datanode" ]
+ volumes:
+ - tmpfs4:/data
+ - ../..:/opt/hadoop
+ om1:
+ <<: *common-config
+ environment:
+ WAITFOR: scm3:9894
+ ENSURE_OM_INITIALIZED: /data/metadata/om/current/VERSION
+ <<: *replication
+ ports:
+ - 9874:9874
+ - 9862
+ hostname: om1
+ command: ["ozone","om"]
+ om2:
+ <<: *common-config
+ environment:
+ WAITFOR: scm3:9894
+ ENSURE_OM_INITIALIZED: /data/metadata/om/current/VERSION
+ <<: *replication
+ ports:
+ - 9874
+ - 9862
+ hostname: om2
+ command: ["ozone","om"]
+ om3:
+ <<: *common-config
+ environment:
+ WAITFOR: scm3:9894
+ ENSURE_OM_INITIALIZED: /data/metadata/om/current/VERSION
+ <<: *replication
+ ports:
+ - 9874
+ - 9862
+ hostname: om3
+ command: ["ozone","om"]
+ scm1:
+ <<: *common-config
+ ports:
+ - 9876:9876
+ environment:
+ ENSURE_SCM_INITIALIZED: /data/metadata/scm/current/VERSION
+ OZONE-SITE.XML_hdds.scm.safemode.min.datanode:
${OZONE_SAFEMODE_MIN_DATANODES:-1}
+ <<: *replication
+ command: ["ozone","scm"]
+ scm2:
+ <<: *common-config
+ ports:
+ - 9876
+ environment:
+ WAITFOR: scm1:9894
+ ENSURE_SCM_BOOTSTRAPPED: /data/metadata/scm/current/VERSION
+ OZONE-SITE.XML_hdds.scm.safemode.min.datanode:
${OZONE_SAFEMODE_MIN_DATANODES:-1}
+ <<: *replication
+ command: ["ozone","scm"]
+ scm3:
+ <<: *common-config
+ ports:
+ - 9876
+ environment:
+ WAITFOR: scm2:9894
+ ENSURE_SCM_BOOTSTRAPPED: /data/metadata/scm/current/VERSION
+ OZONE-SITE.XML_hdds.scm.safemode.min.datanode:
${OZONE_SAFEMODE_MIN_DATANODES:-1}
+ <<: *replication
+ command: ["ozone","scm"]
+ httpfs:
+ <<: *common-config
+ environment:
+ OZONE-SITE.XML_hdds.scm.safemode.min.datanode:
${OZONE_SAFEMODE_MIN_DATANODES:-1}
+ <<: *replication
+ ports:
+ - 14000:14000
+ command: [ "ozone","httpfs" ]
+ s3g:
+ <<: *common-config
+ environment:
+ OZONE_OPTS:
+ <<: *replication
+ ports:
+ - 9878:9878
+ command: ["ozone","s3g"]
+volumes:
+ tmpfs1:
+ driver: local
+ driver_opts:
+ o: "size=1g,uid=1000"
+ device: tmpfs
+ type: tmpfs
+ tmpfs2:
+ driver: local
+ driver_opts:
+ o: "size=1g,uid=2000"
+ device: tmpfs
+ type: tmpfs
+ tmpfs3:
+ driver: local
+ driver_opts:
+ o: "size=1g,uid=3000"
+ device: tmpfs
+ type: tmpfs
+ tmpfs4:
+ driver: local
+ driver_opts:
+ o: "size=1g,uid=4000"
+ device: tmpfs
+ type: tmpfs
diff --git a/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-config
b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-config
new file mode 100644
index 0000000000..60e8afe6e1
--- /dev/null
+++ b/hadoop-ozone/dist/src/main/compose/ozone-balancer/docker-config
@@ -0,0 +1,62 @@
+# 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.
+
+# For HttpFS service it is required to enable proxying users.
+CORE-SITE.XML_hadoop.proxyuser.hadoop.hosts=*
+CORE-SITE.XML_hadoop.proxyuser.hadoop.groups=*
+
+CORE-SITE.XML_fs.defaultFS=ofs://om/
+CORE-SITE.XML_fs.trash.interval=1
+
+OZONE-SITE.XML_ozone.om.service.ids=om
+OZONE-SITE.XML_ozone.om.nodes.om=om1,om2,om3
+OZONE-SITE.XML_ozone.om.address.om.om1=om1
+OZONE-SITE.XML_ozone.om.address.om.om2=om2
+OZONE-SITE.XML_ozone.om.address.om.om3=om3
+OZONE-SITE.XML_ozone.om.ratis.enable=true
+
+OZONE-SITE.XML_ozone.scm.service.ids=scmservice
+OZONE-SITE.XML_ozone.scm.nodes.scmservice=scm1,scm2,scm3
+OZONE-SITE.XML_ozone.scm.address.scmservice.scm1=scm1
+OZONE-SITE.XML_ozone.scm.address.scmservice.scm2=scm2
+OZONE-SITE.XML_ozone.scm.address.scmservice.scm3=scm3
+OZONE-SITE.XML_ozone.scm.ratis.enable=true
+OZONE-SITE.XML_ozone.scm.datanode.id.dir=/data
+OZONE-SITE.XML_ozone.scm.container.size=100MB
+OZONE-SITE.XML_ozone.scm.block.size=20MB
+OZONE-SITE.XML_ozone.scm.datanode.ratis.volume.free-space.min=10MB
+OZONE-SITE.XML_ozone.metadata.dirs=/data/metadata
+OZONE-SITE.XML_hdds.node.report.interval=20s
+OZONE-SITE.XML_hdds.heartbeat.interval=20s
+OZONE-SITE.XML_hdds.datanode.du.refresh.period=20s
+OZONE-SITE.XML_hdds.datanode.dir=/data/hdds
+OZONE-SITE.XML_hdds.datanode.volume.min.free.space=100MB
+OZONE-SITE.XML_ozone.scm.pipeline.creation.auto.factor.one=false
+OZONE-SITE.XML_ozone.datanode.pipeline.limit=1
+OZONE-SITE.XML_hdds.scmclient.max.retry.timeout=30s
+OZONE-SITE.XML_ozone.scm.primordial.node.id=scm1
+OZONE-SITE.XML_hdds.container.report.interval=30s
+OZONE-SITE.XML_ozone.om.s3.grpc.server_enabled=true
+OZONE-SITE.XML_ozone.recon.db.dir=/data/metadata/recon
+OZONE-SITE.XML_ozone.recon.address=recon:9891
+OZONE-SITE.XML_ozone.recon.http-address=0.0.0.0:9888
+OZONE-SITE.XML_ozone.recon.https-address=0.0.0.0:9889
+OZONE-SITE.XML_dfs.container.ratis.datastream.enabled=true
+
+OZONE_CONF_DIR=/etc/hadoop
+OZONE_LOG_DIR=/var/log/hadoop
+
+no_proxy=om1,om2,om3,scm,s3g,recon,kdc,localhost,127.0.0.1
diff --git a/hadoop-ozone/dist/src/main/compose/ozone-balancer/test.sh
b/hadoop-ozone/dist/src/main/compose/ozone-balancer/test.sh
new file mode 100644
index 0000000000..e79979877b
--- /dev/null
+++ b/hadoop-ozone/dist/src/main/compose/ozone-balancer/test.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# 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.
+
+#suite:balancer
+
+COMPOSE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+export COMPOSE_DIR
+export OM_SERVICE_ID="om"
+export OM=om1
+export SCM=scm1
+export OZONE_REPLICATION_FACTOR=3
+
+# shellcheck source=/dev/null
+source "$COMPOSE_DIR/../testlib.sh"
+
+# We need 4 dataNodes in this tests
+start_docker_env 4
+
+execute_robot_test ${OM} balancer/testBalancer.robot
diff --git a/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot
b/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot
new file mode 100644
index 0000000000..6e2fb9d85a
--- /dev/null
+++ b/hadoop-ozone/dist/src/main/smoketest/balancer/testBalancer.robot
@@ -0,0 +1,143 @@
+# 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.
+
+*** Settings ***
+Documentation Smoketest ozone cluster startup
+Library OperatingSystem
+Library Collections
+Resource ../commonlib.robot
+Resource ../ozone-lib/shell.robot
+
+Test Timeout 20 minutes
+
+*** Variables ***
+${SECURITY_ENABLED} false
+${HOST} datanode1
+${VOLUME} volume1
+${BUCKET} bucket1
+${SIZE} 104857600
+
+
+** Keywords ***
+Prepare For Tests
+ Execute dd if=/dev/urandom of=/tmp/100mb bs=1048576 count=100
+ Run Keyword if '${SECURITY_ENABLED}' == 'true' Kinit test user
testuser testuser.keytab
+ Execute ozone sh volume create /${VOLUME}
+ Execute ozone sh bucket create /${VOLUME}/${BUCKET}
+
+
+Datanode In Maintenance Mode
+ ${result} = Execute ozone admin
datanode maintenance ${HOST}
+ Should Contain ${result}
Entering maintenance mode on datanode
+ ${result} = Execute ozone admin
datanode list | grep "Operational State:*"
+ Wait Until Keyword Succeeds 30sec 5sec
Should contain ${result} ENTERING_MAINTENANCE
+ Wait Until Keyword Succeeds 3min 10sec
Related pipelines are closed
+ Sleep 60000ms
+
+Related pipelines are closed
+ ${result} = Execute ozone admin datanode list | awk -v
RS= '{$1=$1}1'|grep MAINT | sed -e 's/^.*pipelines: \\(.*\\)$/\\1/'
+ Should Contain Any ${result} CLOSED No related
pipelines or the node is not in Healthy state.
+
+Datanode Recommission
+ ${result} = Execute ozone admin
datanode recommission ${HOST}
+ Should Contain ${result}
Started recommissioning datanode
+ Wait Until Keyword Succeeds 1min 10sec
Datanode Recommission is Finished
+ Sleep 300000ms
+
+Datanode Recommission is Finished
+ ${result} = Execute ozone admin
datanode list | grep "Operational State:*"
+ Should Not Contain ${result}
ENTERING_MAINTENANCE
+
+Run Container Balancer
+ ${result} = Execute ozone admin
containerbalancer start -t 1 -d 100 -i 1
+ Should Contain ${result}
Container Balancer started successfully.
+ ${result} = Execute ozone admin
containerbalancer status
+ Should Contain ${result}
ContainerBalancer is Running.
+ Wait Until Keyword Succeeds 3min 10sec
ContainerBalancer is Not Running
+ Sleep 60000ms
+
+ContainerBalancer is Not Running
+ ${result} = Execute ozone admin containerbalancer status
+ Should contain ${result} ContainerBalancer is Not
Running.
+
+Create Multiple Keys
+ [arguments] ${NUM_KEYS}
+ ${file} = Set Variable /tmp/100mb
+ FOR ${INDEX} IN RANGE ${NUM_KEYS}
+ ${fileName} = Set Variable file-${INDEX}.txt
+ ${key} = Set Variable /${VOLUME}/${BUCKET}/${fileName}
+ LOG ${fileName}
+ Create Key ${key} ${file}
+ Key Should Match Local File ${key} ${file}
+ END
+
+Datanode Usageinfo
+ [arguments] ${uuid}
+ ${result} = Execute ozone admin datanode
usageinfo --uuid=${uuid}
+ Should Contain ${result}
Ozone Used
+
+Get Uuid
+ ${result} = Execute ozone admin datanode list | awk
-v RS= '{$1=$1}1'| grep ${HOST} | sed -e 's/Datanode: //'|sed -e 's/ .*$//'
+ [return] ${result}
+
+Close All Containers
+ FOR ${INDEX} IN RANGE 15
+ ${container} = Execute ozone admin container list
--state OPEN | jq -r 'select(.replicationConfig.replicationFactor == "THREE") |
.containerID' | head -1
+ EXIT FOR LOOP IF "${container}" == ""
+ Execute ozone admin container close
"${container}"
+ ${output} = Execute ozone admin container info
"${container}"
+ Should contain ${output} CLOS
+ END
+ Wait until keyword succeeds 3min 10sec All container is closed
+
+All container is closed
+ ${output} = Execute ozone admin container list --state
OPEN
+ Should Be Empty ${output}
+
+Get Datanode Ozone Used Bytes Info
+ [arguments] ${uuid}
+ ${output} = Execute export DATANODES=$(ozone admin datanode list
--json) && for datanode in $(echo "$\{DATANODES\}" | jq -r
'.[].datanodeDetails.uuid'); do ozone admin datanode usageinfo
--uuid=$\{datanode\} --json | jq '{(.[0].datanodeDetails.uuid) :
.[0].ozoneUsed}'; done | jq -s add
+ ${result} = Execute echo '${output}' | jq '. | to_entries | .[] |
select(.key == "${uuid}") | .value'
+ [return] ${result}
+
+** Test Cases ***
+Verify Container Balancer for RATIS containers
+ Prepare For Tests
+
+ Datanode In Maintenance Mode
+
+ ${uuid} = Get Uuid
+ Datanode Usageinfo ${uuid}
+
+ Create Multiple Keys 3
+
+ Close All Containers
+
+ ${datanodeOzoneUsedBytesInfo} = Get Datanode Ozone Used Bytes Info
${uuid}
+ Should Be True ${datanodeOzoneUsedBytesInfo} < ${SIZE}
+
+ Datanode Recommission
+
+ Run Container Balancer
+
+ ${datanodeOzoneUsedBytesInfoAfterContainerBalancing} = Get Datanode
Ozone Used Bytes Info ${uuid}
+ Should Not Be Equal As Integers ${datanodeOzoneUsedBytesInfo}
${datanodeOzoneUsedBytesInfoAfterContainerBalancing}
+ Should Be True ${datanodeOzoneUsedBytesInfoAfterContainerBalancing} <
${SIZE} * 3.5
+ Should Be True ${datanodeOzoneUsedBytesInfoAfterContainerBalancing} >
${SIZE} * 3
+
+
+
+
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]