Add in roles data validation
authorAlex Schultz <aschultz@redhat.com>
Fri, 9 Jun 2017 14:59:51 +0000 (08:59 -0600)
committerAlex Schultz <aschultz@redhat.com>
Fri, 7 Jul 2017 15:51:40 +0000 (09:51 -0600)
With the merging of Iad3e9b215c6f21ba761c8360bb7ed531e34520e6 the
roles_data.yaml should be generated with tripleoclient rather than
edited. This change adds in a pep8 task to verify that the appropriate
role files in roles/ have been modified to match how our default
roles_data.yaml is constructed.  Additionally this change adds a new tox
target called 'genrolesdata' that will all you to automatically generate
roles_data.yaml and roles_data_undercloud.yaml

Change-Id: I5eb15443a131a122d1a4abf6fc15a3ac3e15941b
Related-Blueprint: example-custom-role-environments

12 files changed:
bindep.txt
releasenotes/notes/roles-data-validation-7845702b5ed85366.yaml [new file with mode: 0644]
requirements.txt
roles/Controller.yaml
roles/Undercloud.yaml
roles_data.yaml
roles_data_undercloud.yaml
tools/roles-data-generate-samples.sh [new file with mode: 0755]
tools/roles-data-generate.py [new file with mode: 0755]
tools/roles-data-validation.sh [new file with mode: 0755]
tools/yaml-validate.py
tox.ini

index 4f9b425..d42375e 100644 (file)
@@ -1,2 +1,4 @@
 # This is a cross-platform list tracking distribution packages needed by tests;
 # see http://docs.openstack.org/infra/bindep/ for additional information.
+libssl-dev [platform:dpkg]
+openssl-devel [platform:rpm]
diff --git a/releasenotes/notes/roles-data-validation-7845702b5ed85366.yaml b/releasenotes/notes/roles-data-validation-7845702b5ed85366.yaml
new file mode 100644 (file)
index 0000000..766b658
--- /dev/null
@@ -0,0 +1,8 @@
+---
+features:
+  - |
+    The roles_data.yaml and roles_data_undercloud.yaml can be generated with
+    tox using ``tox -e genrolesdata``.
+  - |
+    pep8 now checks that the roles_data.yaml and roles_data_undercloud.yaml
+    matches data generated from the roles/ files.
index 4a9b725..d4e343e 100644 (file)
@@ -4,3 +4,4 @@
 pbr!=2.1.0,>=2.0.0 # Apache-2.0
 Jinja2!=2.9.0,!=2.9.1,!=2.9.2,!=2.9.3,!=2.9.4,>=2.8 # BSD License (3 clause)
 six>=1.9.0 # MIT
+tripleo-common>=7.1.0 # Apache-2.0
index 40e51aa..e3af321 100644 (file)
@@ -44,9 +44,9 @@
     - OS::TripleO::Services::CinderHPELeftHandISCSI
     - OS::TripleO::Services::CinderScheduler
     - OS::TripleO::Services::CinderVolume
+    - OS::TripleO::Services::Clustercheck
     - OS::TripleO::Services::Collectd
     - OS::TripleO::Services::Congress
-    - OS::TripleO::Services::Clustercheck
     - OS::TripleO::Services::Docker
     - OS::TripleO::Services::Ec2Api
     - OS::TripleO::Services::Etcd
index bcdedc7..f56749a 100644 (file)
@@ -18,6 +18,7 @@
     - OS::TripleO::Services::HeatEngine
     - OS::TripleO::Services::IronicApi
     - OS::TripleO::Services::IronicConductor
+    - OS::TripleO::Services::IronicInspector
     - OS::TripleO::Services::IronicPxe
     - OS::TripleO::Services::Iscsid
     - OS::TripleO::Services::Keystone
@@ -48,6 +49,7 @@
     - OS::TripleO::Services::UndercloudAodhListener
     - OS::TripleO::Services::UndercloudAodhNotifier
     - OS::TripleO::Services::UndercloudCeilometerAgentCentral
+    - OS::TripleO::Services::UndercloudCeilometerAgentIpmi
     - OS::TripleO::Services::UndercloudCeilometerAgentNotification
     - OS::TripleO::Services::UndercloudGnocchiApi
     - OS::TripleO::Services::UndercloudGnocchiMetricd
index 7bb87c2..fe24a42 100644 (file)
@@ -1,5 +1,5 @@
 ###############################################################################
-# File generated by tripleoclient
+# File generated by TripleO
 ###############################################################################
 ###############################################################################
 # Role: Controller                                                            #
     - OS::TripleO::Services::Timezone
     - OS::TripleO::Services::TripleoFirewall
     - OS::TripleO::Services::TripleoPackages
+
index 783df91..2aa5a29 100644 (file)
@@ -1,5 +1,5 @@
 ###############################################################################
-# File generated by tripleoclient
+# File generated by TripleO
 ###############################################################################
 ###############################################################################
 # Role: Undercloud                                                            #
@@ -59,3 +59,4 @@
     - OS::TripleO::Services::UndercloudGnocchiStatsd
     - OS::TripleO::Services::UndercloudPankoApi
     - OS::TripleO::Services::Zaqar
+
diff --git a/tools/roles-data-generate-samples.sh b/tools/roles-data-generate-samples.sh
new file mode 100755 (executable)
index 0000000..cb370dc
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/bash
+#
+# Copyright 2017 Red Hat, Inc.
+#
+# Licensed 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.
+#
+set -e
+
+SCRIPT_DIR=$(cd `dirname $0` && pwd -P)
+OUTPUT_DIR=${OUTPUT_DIR:-$(cd "${SCRIPT_DIR}/../" && pwd -P)}
+
+echo "Generating ${OUTPUT_DIR}/roles_data.yaml"
+$SCRIPT_DIR/roles-data-generate.py Controller Compute BlockStorage ObjectStorage CephStorage > $OUTPUT_DIR/roles_data.yaml
+
+echo "Generating ${OUTPUT_DIR}/roles_data_undercloud.yaml"
+$SCRIPT_DIR/roles-data-generate.py Undercloud > $OUTPUT_DIR/roles_data_undercloud.yaml
diff --git a/tools/roles-data-generate.py b/tools/roles-data-generate.py
new file mode 100755 (executable)
index 0000000..0b76874
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# Copyright 2017 Red Hat, Inc.
+#
+# Licensed 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.
+#
+
+import argparse
+import collections
+import os
+import sys
+
+from tripleo_common.utils import roles as rolesutils
+
+__tht_root_dir = os.path.dirname(os.path.dirname(__file__))
+__tht_roles_dir = os.path.join(__tht_root_dir, 'roles')
+
+
+def parse_opts(argv):
+    parser = argparse.ArgumentParser(
+        description='Generate roles_data.yaml for requested roles. NOTE: '
+                    'This is a stripped down version of what is provided by '
+                    'the tripleoclient. The tripleoclient should be used for '
+                    'additional functionality.')
+    parser.add_argument('--roles-path', metavar='<roles directory>',
+                        help="Filesystem path containing the roles yaml files",
+                        default=__tht_roles_dir)
+    parser.add_argument('roles', nargs="+", metavar='<role>',
+                        help='List of roles to use to generate the '
+                             'roles_data.yaml file')
+    opts = parser.parse_args(argv[1:])
+
+    return opts
+
+opts = parse_opts(sys.argv)
+
+roles = collections.OrderedDict.fromkeys(opts.roles)
+print(rolesutils.generate_roles_data_from_directory(opts.roles_path,
+                                                    roles.keys()))
diff --git a/tools/roles-data-validation.sh b/tools/roles-data-validation.sh
new file mode 100755 (executable)
index 0000000..7c5786e
--- /dev/null
@@ -0,0 +1,48 @@
+#!/bin/bash
+#
+# Copyright 2017 Red Hat, Inc.
+#
+# Licensed 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.
+#
+set -e
+
+SCRIPT_DIR=$(cd `dirname $0` && pwd -P)
+THT_DIR=${OUTPUT_DIR:-$(cd "${SCRIPT_DIR}/../" && pwd -P)}
+TMPDIR=$(mktemp -d)
+
+function do_cleanup {
+  rm -rf $TMPDIR
+}
+trap do_cleanup EXIT
+
+function check_diff {
+  local thtfile=$1
+  local genfile=$2
+  echo -n "Performing diff on $thtfile $genfile... "
+  diff $thtfile $genfile > $TMPDIR/diff_results
+  if [ $? = 1 ]; then
+      echo "ERROR: Generated roles file not match the current ${thtfile}"
+      echo "Please make sure to update the appropriate roles/* files."
+      echo "Here is the diff ${thtfile} ${genfile}"
+      cat $TMPDIR/diff_results
+      exit 1
+  fi
+  echo "OK!"
+}
+
+OUTPUT_DIR=$TMPDIR
+source $SCRIPT_DIR/roles-data-generate-samples.sh
+
+set +e
+check_diff $THT_DIR/roles_data.yaml $TMPDIR/roles_data.yaml
+check_diff $THT_DIR/roles_data_undercloud.yaml $TMPDIR/roles_data_undercloud.yaml
index f9e89db..e9581a2 100755 (executable)
@@ -337,6 +337,8 @@ param_map = {}
 for base_path in path_args:
     if os.path.isdir(base_path):
         for subdir, dirs, files in os.walk(base_path):
+            if '.tox' in dirs:
+                dirs.remove('.tox')
             for f in files:
                 if f.endswith('.yaml') and not f.endswith('.j2.yaml'):
                     file_path = os.path.join(subdir, f)
diff --git a/tox.ini b/tox.ini
index c87bf7b..da179e9 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -14,10 +14,13 @@ commands = python setup.py testr --slowest --testr-args='{posargs}'
 commands = {posargs}
 
 [testenv:pep8]
+whielist_externals =
+    bash
 commands =
     python ./tools/process-templates.py
     python ./network/endpoints/build_endpoint_map.py --check
     python ./tools/yaml-validate.py .
+    bash -c ./tools/roles-data-validation.sh
 
 [testenv:templates]
 commands = python ./tools/process-templates.py
@@ -32,3 +35,9 @@ commands = python setup.py test --coverage --coverage-package-name=tripleo_heat_
 commands =
            python ./tools/process-templates.py
            python ./tripleo_heat_templates/environment_generator.py sample-env-generator/
+
+[testenv:genroledata]
+whielist_externals =
+    bash
+commands =
+    bash -c tools/roles-data-generate-samples.sh