fuel-dev-tools/fuel_dev_tools/shell.py

180 lines
5.1 KiB
Python

#!/usr/bin/env python
# Copyright 2015 Mirantis, 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.
"""
Command-line utility to help developers work with Fuel master.
"""
import logging
import os
from oslo_utils import encodeutils
import six
import sys
import traceback
from cliff import app
from cliff import commandmanager
from fuel_dev_tools.docker import astute
from fuel_dev_tools.docker import mcollective
from fuel_dev_tools.docker import nailgun
from fuel_dev_tools.docker import nginx
from fuel_dev_tools.docker import postgres
from fuel_dev_tools.docker import rabbitmq
from fuel_dev_tools.slaves import mcagent
from fuel_dev_tools import exc
from fuel_dev_tools import info
from fuel_dev_tools import puppet
from fuel_dev_tools import ssh
COMMANDS = {
'info': info.Info,
'send-identity': ssh.SendIdentity,
'ssh': ssh.SSH,
'astute-id': astute.Id,
'astute-config': astute.Config,
'astute-dir': astute.Dir,
'astute-log': astute.Log,
'astute-restart': astute.Restart,
'astute-rsync': astute.Rsync,
'astute-shell': astute.Shell,
'astute-start': astute.Start,
'astute-stop': astute.Stop,
'astute-tail': astute.Tail,
'astute-volumes': astute.Volumes,
'mcagent-rsync': mcagent.Rsync,
'mcollective-rsync-shotgun': mcollective.RsyncShotgun,
'mcollective-shell': mcollective.Shell,
'nailgun-id': nailgun.Id,
'nailgun-config': nailgun.Config,
'nailgun-db-reset': nailgun.DBReset,
'nailgun-dir': nailgun.Dir,
'nailgun-log': nailgun.Log,
'nailgun-restart': nailgun.Restart,
'nailgun-rsync': nailgun.Rsync,
'nailgun-rsync-static': nginx.Rsync,
'nailgun-shell': nailgun.Shell,
'nailgun-start': nailgun.Start,
'nailgun-stop': nailgun.Stop,
'nailgun-tail': nailgun.Tail,
'nailgun-volumes': nailgun.Volumes,
'postgres-id': postgres.Id,
'postgres-config': postgres.Config,
'postgres-dir': postgres.Dir,
'postgres-log': postgres.Log,
'postgres-restart': postgres.Restart,
'postgres-shell': postgres.Shell,
'postgres-start': postgres.Start,
'postgres-stop': postgres.Stop,
'postgres-tail': postgres.Tail,
'postgres-volumes': postgres.Volumes,
'puppet-rsync': puppet.Rsync,
'rabbitmq-id': rabbitmq.Id,
'rabbitmq-config': rabbitmq.Config,
'rabbitmq-dir': rabbitmq.Dir,
'rabbitmq-log': rabbitmq.Log,
'rabbitmq-restart': rabbitmq.Restart,
'rabbitmq-shell': rabbitmq.Shell,
'rabbitmq-start': rabbitmq.Start,
'rabbitmq-stop': rabbitmq.Stop,
'rabbitmq-tail': rabbitmq.Tail,
'rabbitmq-volumes': rabbitmq.Volumes,
}
class ToolsApp(app.App):
log = logging.getLogger(__name__)
def __init__(self):
super(ToolsApp, self).__init__(
description=__doc__.strip(),
version='1.0',
command_manager=commandmanager.CommandManager('fuel.cli')
)
self.commands = COMMANDS
for k, v in self.commands.items():
self.command_manager.add_command(k, v)
def build_option_parser(self, description, version):
"""Return an argparse option parser for this application.
Subclasses may override this method to extend
the parser with more global options.
:param description: full description of the application
:paramtype description: str
:param version: version number for the application
:paramtype version: str
"""
parser = super(ToolsApp, self).build_option_parser(
description, version)
parser.add_argument(
'--ip',
default='10.20.0.2',
help='Fuel master node IP address'
)
parser.add_argument(
'-p', '--port',
default='22',
help='Fuel master node SSH port'
)
parser.add_argument(
'-U', '--user',
default='root',
help='Fuel master node SSH user'
)
parser.add_argument(
'-I', '--identity-file',
default=os.path.join(
os.environ['HOME'], '.ssh', 'id_rsa.openstack'),
help='SSH identity file'
)
return parser
def main(argv=sys.argv[1:]):
try:
return ToolsApp().run(
list(map(encodeutils.safe_decode, argv))
)
except KeyboardInterrupt:
six.print_("... terminating client", file=sys.stderr)
return 130
except exc.ClientException:
six.print_('ClientException')
return 1
except exc.SSHError:
six.print_('SSHError')
return 1
except Exception:
traceback.print_exc()
return 1
if __name__ == '__main__':
main()