Files
fuel-devops/devops/shell.py
Dennis Dmitriev d93c44dbbc Add Fuel admin node IP to the list of environments
Usage:

    dos.py list --ips

Option '--ips' adds IP address of each Fuel admin node to
the list of environments.

Change-Id: I8298c7d295abc0657a74c4a155bd180ff7329701
2014-10-29 06:27:26 +02:00

248 lines
11 KiB
Python

# Copyright 2013 - 2014 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.
import argparse
from os import environ
from devops.manager import Manager
from helpers.helpers import sync_node_time
class Shell(object):
def __init__(self):
super(Shell, self).__init__()
self.params = self.get_params()
self.manager = Manager()
def execute(self):
self.commands.get(self.params.command)(self)
def do_list(self):
env_list = self.manager.environment_list().values('name')
for env in env_list:
if self.params.list_ips:
cur_env = self.manager.environment_get(env['name'])
admin_ip = ''
if 'admin' in [node.name for node in cur_env.nodes]:
admin_ip = (cur_env.node_by_name('admin').
get_ip_address_by_network_name('admin'))
print('{0}\t{1}'.format(env['name'], admin_ip))
else:
print(env['name'])
return env_list
def node_dict(self, node):
return {'name': node.name,
'vnc': node.get_vnc_port()}
def do_show(self):
environment = self.manager.environment_get(self.params.name)
print('%5s %25s' % ("VNC", "NODE-NAME"))
for item in map(lambda x: self.node_dict(x), environment.nodes):
print ('%5s %25s' % (item['vnc'], item['name']))
def do_erase(self):
self.manager.environment_get(self.params.name).erase()
def do_start(self):
self.manager.environment_get(self.params.name).start()
def do_destroy(self):
self.manager.environment_get(self.params.name).destroy(verbose=False)
def do_suspend(self):
self.manager.environment_get(self.params.name).suspend(verbose=False)
def do_resume(self):
self.manager.environment_get(self.params.name).resume(verbose=False)
def do_revert(self):
self.manager.environment_get(self.params.name).revert(
self.params.snapshot_name)
def do_snapshot(self):
self.manager.environment_get(self.params.name).snapshot(
self.params.snapshot_name)
def do_synchronize(self):
self.manager.synchronize_environments()
def do_snapshot_list(self):
environment = self.manager.environment_get(self.params.name)
snap_nodes = {}
max_len = 0
for node in environment.nodes:
snaps = sorted(node.get_snapshots())
for snap in snaps:
if len(snap) > max_len:
max_len = len(snap)
if snap in snap_nodes:
snap_nodes[snap].append(node.name)
else:
snap_nodes[snap] = [node.name, ]
print("%*s %50s" % (max_len, "SNAPSHOT", "NODES-NAME"))
for snap in snap_nodes:
print("%*s %50s" % (max_len, snap,
', '.join(snap_nodes[snap])))
def do_snapshot_delete(self):
environment = self.manager.environment_get(self.params.name)
for node in environment.nodes:
snaps = sorted(node.get_snapshots())
if self.params.snapshot_name in snaps:
node.erase_snapshot(name=self.params.snapshot_name)
def do_net_list(self):
environment = self.manager.environment_get(self.params.name)
networks = environment.networks
print("%15s %10s" % ("NETWORK NAME", "IP NET"))
for network in networks:
print("%15s %10s" % (network.name, network.ip_network))
def do_timesync(self):
env = self.manager.environment_get(self.params.name)
if not self.params.node_name:
_nodes = {node.name: node.get_vnc_port() for node in env.nodes}
for node_name in sorted(_nodes.keys()):
if _nodes[node_name] != '-1':
sync_node_time(env, node_name)
else:
sync_node_time(env, self.params.node_name)
def do_revert_resume(self):
self.manager.environment_get(self.params.name).revert(
self.params.snapshot_name)
self.manager.environment_get(self.params.name).resume(verbose=False)
if not self.params.no_timesync:
print('time synchronization is starting')
self.do_timesync()
commands = {
'list': do_list,
'show': do_show,
'erase': do_erase,
'start': do_start,
'destroy': do_destroy,
'suspend': do_suspend,
'resume': do_resume,
'revert': do_revert,
'snapshot': do_snapshot,
'sync': do_synchronize,
'snapshot-list': do_snapshot_list,
'snapshot-delete': do_snapshot_delete,
'net-list': do_net_list,
'time-sync': do_timesync,
'revert-resume': do_revert_resume
}
def get_params(self):
name_parser = argparse.ArgumentParser(add_help=False)
name_parser.add_argument('name', help='environment name',
default=environ.get('ENV_NAME'),
metavar='ENV_NAME')
snapshot_name_parser = argparse.ArgumentParser(add_help=False)
snapshot_name_parser.add_argument('--snapshot-name',
help='snapshot name',
default=environ.get('SNAPSHOT_NAME'))
node_name_parser = argparse.ArgumentParser(add_help=False)
node_name_parser.add_argument('--node-name',
help='node name',
default=None)
no_timesync_parser = argparse.ArgumentParser(add_help=False)
no_timesync_parser.add_argument('--no-timesync', dest='no_timesync',
action='store_const', const=True,
help='revert without timesync',
default=False)
list_ips_parser = argparse.ArgumentParser(add_help=False)
list_ips_parser.add_argument('--ips', dest='list_ips',
action='store_const', const=True,
help='show admin node ip addresses',
default=False)
parser = argparse.ArgumentParser(
description="Manage virtual environments. "
"For addional help use command with -h/--help")
subparsers = parser.add_subparsers(title="Operation commands",
help='available commands',
dest='command')
subparsers.add_parser('list',
parents=[list_ips_parser],
help="Show virtual environments",
description="Show virtual environments on host")
subparsers.add_parser('show', parents=[name_parser],
help="Show VMs in environment",
description="Show VMs in environment")
subparsers.add_parser('erase', parents=[name_parser],
help="Delete environment",
description="Delete environment and VMs on it")
subparsers.add_parser('start', parents=[name_parser],
help="Start VMs",
description="Start VMs in selected environment")
subparsers.add_parser('destroy', parents=[name_parser],
help="Destroy(stop) VMs",
description="Stop VMs in selected environment")
subparsers.add_parser('suspend', parents=[name_parser],
help="Suspend VMs",
description="Suspend VMs in selected "
"environment")
subparsers.add_parser('resume', parents=[name_parser],
help="Resume VMs",
description="Resume VMs in selected environment")
subparsers.add_parser('revert',
parents=[name_parser, snapshot_name_parser],
help="Apply snapshot to environment",
description="Apply selected snapshot to "
"environment")
subparsers.add_parser('snapshot',
parents=[name_parser, snapshot_name_parser],
help="Make environment snapshot",
description="Make environment snapshot")
subparsers.add_parser('sync',
help="Synchronization environment and devops",
description="Synchronization environment "
"and devops"),
subparsers.add_parser('snapshot-list',
parents=[name_parser],
help="Show snapshots in environment",
description="Show snapshots in selected "
"environment")
subparsers.add_parser('snapshot-delete',
parents=[name_parser, snapshot_name_parser],
help="Delete snapshot from environment",
description="Delete snapshot from selected "
"environment")
subparsers.add_parser('net-list',
parents=[name_parser],
help="Show networks in environment",
description="Display allocated networks for "
"environment")
subparsers.add_parser('time-sync',
parents=[name_parser, node_name_parser],
help="Sync time on all env nodes",
description="Sync time on all active nodes "
"of environment starting from "
"admin")
subparsers.add_parser('revert-resume',
parents=[name_parser, snapshot_name_parser,
node_name_parser, no_timesync_parser],
help="Revert, resume, sync time on VMs",
description="Revert and resume VMs in selected"
"environment, then"
" sync time on VMs")
return parser.parse_args()