Add cliff based common cli entrypoint

This commit adds the basic framework to tempest for a unified modular
CLI endpoint using cliff. As of right now this entry-point doesn't
really do anything but exist. It will be expanded in the future first
all the existing commands will be refactored to be used through this.
Secondly a new interface and workflow for running tempest will be
created on top of this.

Co-Authored-By: Matthew Treinish <mtreinish@kortar.org>

Change-Id: I1ff8d22c120dbc81d812f1f107db7c2d9b15a505
Implements: blueprint tempest-cli-improvements
diff --git a/requirements.txt b/requirements.txt
index 60dee97..be825f0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,6 +2,7 @@
 # of appearance. Changing the order has an impact on the overall integration
 # process, which may cause wedges in the gate later.
 pbr<2.0,>=0.11
+cliff>=1.13.0 # Apache-2.0
 anyjson>=0.3.3
 httplib2>=0.7.5
 jsonschema!=2.5.0,<3.0.0,>=2.0.0
diff --git a/setup.cfg b/setup.cfg
index 3a14bba..5c78632 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -25,6 +25,7 @@
     run-tempest-stress = tempest.cmd.run_stress:main
     tempest-cleanup = tempest.cmd.cleanup:main
     tempest-account-generator = tempest.cmd.account_generator:main
+    tempest = tempest.cmd.main:main
 
 oslo.config.opts =
     tempest.config = tempest.config:list_opts
diff --git a/tempest/cmd/main.py b/tempest/cmd/main.py
new file mode 100644
index 0000000..762e982
--- /dev/null
+++ b/tempest/cmd/main.py
@@ -0,0 +1,52 @@
+# Copyright 2015 Dell 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 logging
+import sys
+
+from cliff import app
+from cliff import commandmanager
+
+TEMPEST_CLI_VERSION = '0.1'
+
+
+class Main(app.App):
+
+    log = logging.getLogger(__name__)
+
+    def __init__(self):
+        super(Main, self).__init__(
+            description='Tempest cli application',
+            version=TEMPEST_CLI_VERSION,
+            command_manager=commandmanager.CommandManager('tempest.cm'),
+            )
+
+    def initialize_app(self, argv):
+        self.log.debug('tempest initialize_app')
+
+    def prepare_to_run_command(self, cmd):
+        self.log.debug('prepare_to_run_command %s', cmd.__class__.__name__)
+
+    def clean_up(self, cmd, result, err):
+        self.log.debug('tempest clean_up %s', cmd.__class__.__name__)
+        if err:
+            self.log.debug('tempest got an error: %s', err)
+
+
+def main(argv=sys.argv[1:]):
+    the_app = Main()
+    return the_app.run(argv)
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv[1:]))