From 6d9f069edeee0670c6d996db7c571fa45a7c2d79 Mon Sep 17 00:00:00 2001 From: Anu Engineer Date: Fri, 23 Mar 2018 22:39:19 -0700 Subject: [PATCH] HDFS-13343. Ozone: Provide docker based acceptance testing on pseudo cluster. Contributed by Elek, Marton. --- hadoop-ozone/acceptance-test/README.md | 38 ++++++ hadoop-ozone/acceptance-test/pom.xml | 86 +++++++++++++ .../acceptance-test/src/test/compose/.env | 17 +++ .../src/test/compose/docker-compose.yaml | 61 +++++++++ .../src/test/compose/docker-config | 34 +++++ .../robotframework/acceptance/ozone.robot | 116 ++++++++++++++++++ pom.xml | 1 + 7 files changed, 353 insertions(+) create mode 100644 hadoop-ozone/acceptance-test/README.md create mode 100644 hadoop-ozone/acceptance-test/pom.xml create mode 100644 hadoop-ozone/acceptance-test/src/test/compose/.env create mode 100644 hadoop-ozone/acceptance-test/src/test/compose/docker-compose.yaml create mode 100644 hadoop-ozone/acceptance-test/src/test/compose/docker-config create mode 100644 hadoop-ozone/acceptance-test/src/test/robotframework/acceptance/ozone.robot diff --git a/hadoop-ozone/acceptance-test/README.md b/hadoop-ozone/acceptance-test/README.md new file mode 100644 index 0000000000..5e642c87a8 --- /dev/null +++ b/hadoop-ozone/acceptance-test/README.md @@ -0,0 +1,38 @@ + + +# Acceptance test suite for Ozone/Hdsl + +This project contains acceptance tests for ozone/hdsl using docker-compose and [robot framework](http://robotframework.org/). + +## Run + +To run the acceptance tests, please activate the `ozone-acceptance-test` profile and do a full build. + +Typically you need a `mvn install -Phdsl,ozone-acceptance-test,dist -DskipTests` for a build without unit tests but with acceptance test. + +Notes: + + 1. You need a hadoop build in hadoop-dist/target directory. + 2. The `ozone-acceptance-test` could be activated with profile even if the unit tests are disabled. + + +## Development + +You can run manually the robot tests with `robot` cli. (See robotframework docs to install it.) + + 1. Go to the `src/test/robotframework` + 2. Execute `robot -v basedir:${PWD}/../../.. -v VERSION:3.2.0-SNAPSHOT .` + +You can also use select just one test with -t `"*testnamefragment*"` \ No newline at end of file diff --git a/hadoop-ozone/acceptance-test/pom.xml b/hadoop-ozone/acceptance-test/pom.xml new file mode 100644 index 0000000000..6100bebfc0 --- /dev/null +++ b/hadoop-ozone/acceptance-test/pom.xml @@ -0,0 +1,86 @@ + + + + 4.0.0 + + org.apache.hadoop + hadoop-project + 3.2.0-SNAPSHOT + ../../hadoop-project + + hadoop-ozone-acceptance-test + 3.2.0-SNAPSHOT + Apache Hadoop Ozone Acceptance test + Apache Hadoop Ozone acceptance test + pom + + + + maven-resources-plugin + + + copy-docker-compose + + copy-resources + + process-test-resources + + ${project.build.directory}/compose + + + + src/test/compose + true + + + + + + + + + + + ozone-acceptance-test + + + + org.robotframework + robotframework-maven-plugin + 1.4.7 + + + + run + + + + version:${project.version} + basedir:${project.basedir} + + false + false + + + + + + + + + diff --git a/hadoop-ozone/acceptance-test/src/test/compose/.env b/hadoop-ozone/acceptance-test/src/test/compose/.env new file mode 100644 index 0000000000..79f890b752 --- /dev/null +++ b/hadoop-ozone/acceptance-test/src/test/compose/.env @@ -0,0 +1,17 @@ +# 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. + +HADOOPDIR=../../hadoop-dist/target/hadoop-${project.version} \ No newline at end of file diff --git a/hadoop-ozone/acceptance-test/src/test/compose/docker-compose.yaml b/hadoop-ozone/acceptance-test/src/test/compose/docker-compose.yaml new file mode 100644 index 0000000000..fb4e5d3f71 --- /dev/null +++ b/hadoop-ozone/acceptance-test/src/test/compose/docker-compose.yaml @@ -0,0 +1,61 @@ +# 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" +services: + namenode: + image: elek/hadoop-runner:o3-refactor + hostname: namenode + volumes: + - ${HADOOPDIR}:/opt/hadoop + ports: + - 9870 + environment: + ENSURE_NAMENODE_DIR: /data/namenode + env_file: + - ./docker-config + command: ["/opt/hadoop/bin/hdfs","namenode"] + datanode: + image: elek/hadoop-runner:o3-refactor + volumes: + - ${HADOOPDIR}:/opt/hadoop + ports: + - 9864 + command: ["/opt/hadoop/bin/oz","datanode"] + env_file: + - ./docker-config + ksm: + image: elek/hadoop-runner:o3-refactor + volumes: + - ${HADOOPDIR}:/opt/hadoop + ports: + - 9874 + environment: + ENSURE_KSM_INITIALIZED: /data/metadata/ksm/current/VERSION + env_file: + - ./docker-config + command: ["/opt/hadoop/bin/oz","ksm"] + scm: + image: elek/hadoop-runner:o3-refactor + volumes: + - ${HADOOPDIR}:/opt/hadoop + ports: + - 9876 + env_file: + - ./docker-config + environment: + ENSURE_SCM_INITIALIZED: /data/metadata/scm/current/VERSION + command: ["/opt/hadoop/bin/oz","scm"] diff --git a/hadoop-ozone/acceptance-test/src/test/compose/docker-config b/hadoop-ozone/acceptance-test/src/test/compose/docker-config new file mode 100644 index 0000000000..20c1e30d68 --- /dev/null +++ b/hadoop-ozone/acceptance-test/src/test/compose/docker-config @@ -0,0 +1,34 @@ +# 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. + +CORE-SITE.XML_fs.defaultFS=hdfs://namenode:9000 +OZONE-SITE.XML_ozone.ksm.address=ksm +OZONE-SITE.XML_ozone.scm.names=scm +OZONE-SITE.XML_ozone.enabled=True +OZONE-SITE.XML_ozone.scm.datanode.id=/data/datanode.id +OZONE-SITE.XML_ozone.scm.block.client.address=scm +OZONE-SITE.XML_ozone.metadata.dirs=/data/metadata +OZONE-SITE.XML_ozone.handler.type=distributed +OZONE-SITE.XML_ozone.scm.client.address=scm +HDFS-SITE.XML_dfs.namenode.rpc-address=namenode:9000 +HDFS-SITE.XML_dfs.namenode.name.dir=/data/namenode +HDFS-SITE.XML_rpc.metrics.quantile.enable=true +HDFS-SITE.XML_rpc.metrics.percentiles.intervals=60,300 +HDFS-SITE.XML_dfs.datanode.plugins=org.apache.hadoop.ozone.HdslServerPlugin,org.apache.hadoop.ozone.web.ObjectStoreRestPlugin +LOG4J.PROPERTIES_log4j.rootLogger=INFO, stdout +LOG4J.PROPERTIES_log4j.appender.stdout=org.apache.log4j.ConsoleAppender +LOG4J.PROPERTIES_log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +LOG4J.PROPERTIES_log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n diff --git a/hadoop-ozone/acceptance-test/src/test/robotframework/acceptance/ozone.robot b/hadoop-ozone/acceptance-test/src/test/robotframework/acceptance/ozone.robot new file mode 100644 index 0000000000..31ddf36453 --- /dev/null +++ b/hadoop-ozone/acceptance-test/src/test/robotframework/acceptance/ozone.robot @@ -0,0 +1,116 @@ +# 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 Smoke test to start cluster with docker-compose environments. +Library OperatingSystem +Suite Setup Startup Ozone Cluster +Suite Teardown Teardown Ozone Cluster + +*** Variables *** +${COMMON_REST_HEADER} -H "x-ozone-user: bilbo" -H "x-ozone-version: v1" -H "Date: Mon, 26 Jun 2017 04:23:30 GMT" -H "Authorization:OZONE root" +${version} + +*** Test Cases *** + +Daemons are running without error + Is daemon running without error ksm + Is daemon running without error scm + Is daemon running without error namenode + Is daemon running without error datanode + +Check if datanode is connected to the scm + Wait Until Keyword Succeeds 2min 5sec Have healthy datanodes 1 + +Scale it up to 5 datanodes + Scale datanodes up 5 + Wait Until Keyword Succeeds 3min 5sec Have healthy datanodes 5 + +Test rest interface + ${result} = Execute on datanode curl -i -X POST ${COMMON_RESTHEADER} "http://localhost:9880/volume1" + Should contain ${result} 201 Created + ${result} = Execute on datanode curl -i -X POST ${COMMON_RESTHEADER} "http://localhost:9880/volume1/bucket1" + Should contain ${result} 201 Created + ${result} = Execute on datanode curl -i -X DELETE ${COMMON_RESTHEADER} "http://localhost:9880/volume1/bucket1" + Should contain ${result} 200 OK + ${result} = Execute on datanode curl -i -X DELETE ${COMMON_RESTHEADER} "http://localhost:9880/volume1" + Should contain ${result} 200 OK + +Test oz cli + Execute on datanode oz oz -createVolume http://localhost:9880/hive -user bilbo -quota 100TB -root + ${result} = Execute on datanode oz oz -listVolume http://localhost:9880/ -user bilbo | grep -v Removed | jq '.[] | select(.volumeName=="hive")' + Should contain ${result} createdOn + Execute on datanode oz oz -createBucket http://localhost:9880/hive/bb1 + ${result} Execute on datanode oz oz -listBucket http://localhost:9880/hive/ | grep -v Removed | jq -r '.[] | select(.bucketName=="bb1") | .volumeName' + Should Be Equal ${result} hive + Execute on datanode oz oz -deleteBucket http://localhost:9880/hive/bb1 + Execute on datanode oz oz -deleteVolume http://localhost:9880/hive -user bilbo + + + +Check webui static resources + ${result} = Execute on scm curl -s -I http://localhost:9876/static/bootstrap-3.0.2/js/bootstrap.min.js + Should contain ${result} 200 + ${result} = Execute on ksm curl -s -I http://localhost:9874/static/bootstrap-3.0.2/js/bootstrap.min.js + Should contain ${result} 200 + +Start freon testing + ${result} = Execute on ksm oz freon -numOfVolumes 5 -numOfBuckets 5 -numOfKeys 5 -numOfThreads 10 + Wait Until Keyword Succeeds 3min 10sec Should contain ${result} Number of Keys added: 125 + Should Not Contain ${result} ERROR + +*** Keywords *** + +Startup Ozone Cluster + ${rc} ${output} = Run docker compose down + ${rc} ${output} = Run docker compose up -d + Should Be Equal As Integers ${rc} 0 + Wait Until Keyword Succeeds 1min 5sec Is Daemon started ksm HTTP server of KSM is listening + +Teardown Ozone Cluster + Run docker compose down + +Is daemon running without error + [arguments] ${name} + ${result} = Run docker ps + Should contain ${result} _${name}_1 + ${rc} ${result} = Run docker compose logs ${name} + Should not contain ${result} ERROR + +Is Daemon started + [arguments] ${name} ${expression} + ${rc} ${result} = Run docker compose logs + Should contain ${result} ${expression} + +Have healthy datanodes + [arguments] ${requirednodes} + ${result} = Execute on scm curl -s 'http://localhost:9876/jmx?qry=Hadoop:service=SCMNodeManager,name=SCMNodeManagerInfo' | jq -r '.beans[0].NodeCount[] | select(.key=="HEALTHY") | .value' + Should Be Equal ${result} ${requirednodes} + +Scale datanodes up + [arguments] ${requirednodes} + Run docker compose scale datanode=${requirednodes} + +Execute on + [arguments] ${componentname} ${command} + ${rc} ${return} = Run docker compose exec ${componentname} ${command} + [return] ${return} + +Run docker compose + [arguments] ${command} + Set Environment Variable HADOOPDIR ${basedir}/../../hadoop-dist/target/hadoop-${version} + ${rc} ${output} = Run And Return Rc And Output docker-compose -f ${basedir}/target/compose/docker-compose.yaml ${command} + Should Be Equal As Integers ${rc} 0 + [return] ${rc} ${output} diff --git a/pom.xml b/pom.xml index ba08c26bc8..9a59f0c69b 100644 --- a/pom.xml +++ b/pom.xml @@ -748,6 +748,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs hadoop-ozone hadoop-cblock hadoop-hdsl + hadoop-ozone/acceptance-test