Example: `fuel2 env redeploy <env_id>` Fixed deployment tests. Fuel-web repo has been changed from 'stackforge' to 'openstack'. Partial-Bug: 1540558 Change-Id: I6bc18ff672bc119c523841033fde4bbacb9290fd Depends-On: Ibc89fdbfbd0a36a890412cd8e861d35bcf930690
252 lines
8.2 KiB
Python
252 lines
8.2 KiB
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.
|
|
|
|
from cliff import show
|
|
|
|
from fuelclient.commands import base
|
|
from fuelclient.common import data_utils
|
|
|
|
|
|
class EnvMixIn(object):
|
|
entity_name = 'environment'
|
|
|
|
|
|
class EnvList(EnvMixIn, base.BaseListCommand):
|
|
"""Show list of all available environments."""
|
|
|
|
columns = ("id",
|
|
"status",
|
|
"name",
|
|
"release_id")
|
|
|
|
|
|
class EnvShow(EnvMixIn, base.BaseShowCommand):
|
|
"""Show info about environment with given id."""
|
|
columns = ("id",
|
|
"status",
|
|
"fuel_version",
|
|
"name",
|
|
"release_id",
|
|
"is_customized",
|
|
"changes")
|
|
|
|
|
|
class EnvCreate(EnvMixIn, base.BaseShowCommand):
|
|
"""Creates environment with given attributes."""
|
|
|
|
columns = EnvShow.columns
|
|
|
|
def get_parser(self, prog_name):
|
|
# Avoid adding id argument by BaseShowCommand
|
|
parser = show.ShowOne.get_parser(self, prog_name)
|
|
|
|
parser.add_argument(
|
|
'name',
|
|
type=str,
|
|
help='Name of the new environment'
|
|
)
|
|
|
|
parser.add_argument('-r',
|
|
'--release',
|
|
type=int,
|
|
required=True,
|
|
help='Id of the release for which will '
|
|
'be deployed')
|
|
|
|
parser.add_argument('-nst',
|
|
'--net-segmentation-type',
|
|
type=str,
|
|
choices=['vlan', 'gre', 'tun'],
|
|
dest='nst',
|
|
default='vlan',
|
|
help='Network segmentation type.\n'
|
|
'WARNING: GRE network segmentation type '
|
|
'is deprecated since 7.0 release.')
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
if parsed_args.nst == 'gre':
|
|
self.app.stderr.write('WARNING: GRE network segmentation type is '
|
|
'deprecated since 7.0 release')
|
|
|
|
new_env = self.client.create(name=parsed_args.name,
|
|
release_id=parsed_args.release,
|
|
net_segment_type=parsed_args.nst)
|
|
|
|
new_env = data_utils.get_display_data_single(self.columns, new_env)
|
|
|
|
return (self.columns, new_env)
|
|
|
|
|
|
class EnvDelete(EnvMixIn, base.BaseDeleteCommand):
|
|
"""Delete environment with given id."""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(EnvDelete, self).get_parser(prog_name)
|
|
|
|
parser.add_argument('-f',
|
|
'--force',
|
|
action='store_true',
|
|
help='Force-delete the environment.')
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
env = self.client.get_by_id(parsed_args.id)
|
|
|
|
if env['status'] == 'operational' and not parsed_args.force:
|
|
self.app.stdout.write("Deleting an operational environment is a "
|
|
"dangerous operation.\n"
|
|
"Please use --force to bypass this message.")
|
|
return
|
|
|
|
return super(EnvDelete, self).take_action(parsed_args)
|
|
|
|
|
|
class EnvUpdate(EnvMixIn, base.BaseShowCommand):
|
|
"""Change given attributes for an environment."""
|
|
|
|
columns = EnvShow.columns
|
|
|
|
def get_parser(self, prog_name):
|
|
# Avoid adding id argument by BaseShowCommand
|
|
parser = show.ShowOne.get_parser(self, prog_name)
|
|
|
|
parser.add_argument('id',
|
|
type=int,
|
|
help='Id of the nailgun entity to be processed.')
|
|
|
|
parser.add_argument('-n',
|
|
'--name',
|
|
type=str,
|
|
dest='name',
|
|
default=None,
|
|
help='New name for environment')
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
updates = {}
|
|
for attr in self.client._updatable_attributes:
|
|
if getattr(parsed_args, attr, None):
|
|
updates[attr] = getattr(parsed_args, attr)
|
|
|
|
updated_env = self.client.update(environment_id=parsed_args.id,
|
|
**updates)
|
|
updated_env = data_utils.get_display_data_single(self.columns,
|
|
updated_env)
|
|
|
|
return (self.columns, updated_env)
|
|
|
|
|
|
class EnvAddNodes(EnvMixIn, base.BaseCommand):
|
|
"""Adds nodes to an environment with the specified roles."""
|
|
|
|
def get_parser(self, prog_name):
|
|
|
|
parser = super(EnvAddNodes, self).get_parser(prog_name)
|
|
|
|
parser.add_argument('-e',
|
|
'--env',
|
|
type=int,
|
|
required=True,
|
|
help='Id of the environment to add nodes to')
|
|
|
|
parser.add_argument('-n',
|
|
'--nodes',
|
|
type=int,
|
|
nargs='+',
|
|
required=True,
|
|
help='Ids of the nodes to add.')
|
|
|
|
parser.add_argument('-r',
|
|
'--roles',
|
|
type=str,
|
|
nargs='+',
|
|
required=True,
|
|
help='Target roles of the nodes.')
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
env_id = parsed_args.env
|
|
|
|
self.client.add_nodes(environment_id=env_id,
|
|
nodes=parsed_args.nodes,
|
|
roles=parsed_args.roles)
|
|
|
|
msg = 'Nodes {n} were added to the environment {e} with roles {r}\n'
|
|
self.app.stdout.write(msg.format(n=parsed_args.nodes,
|
|
e=parsed_args.env,
|
|
r=parsed_args.roles))
|
|
|
|
|
|
class EnvDeploy(EnvMixIn, base.BaseCommand):
|
|
"""Deploys changes on the specified environment."""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(EnvDeploy, self).get_parser(prog_name)
|
|
|
|
parser.add_argument('id',
|
|
type=int,
|
|
help='Id of the environment to be deployed.')
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
task_id = self.client.deploy_changes(parsed_args.id)
|
|
|
|
msg = 'Deployment task with id {t} for the environment {e} '\
|
|
'has been started.\n'.format(t=task_id, e=parsed_args.id)
|
|
|
|
self.app.stdout.write(msg)
|
|
|
|
|
|
class EnvRedeploy(EnvMixIn, base.BaseCommand):
|
|
"""Redeploys changes on the specified environment."""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(EnvRedeploy, self).get_parser(prog_name)
|
|
|
|
parser.add_argument('id',
|
|
type=int,
|
|
help='Id of the environment to be redeployed.')
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
task_id = self.client.redeploy_changes(parsed_args.id)
|
|
|
|
msg = 'Deployment task with id {t} for the environment {e} '\
|
|
'has been started.\n'.format(t=task_id, e=parsed_args.id)
|
|
|
|
self.app.stdout.write(msg)
|
|
|
|
|
|
class EnvSpawnVms(EnvMixIn, base.BaseCommand):
|
|
"""Provision specified environment."""
|
|
|
|
def get_parser(self, prog_name):
|
|
parser = super(EnvSpawnVms, self).get_parser(prog_name)
|
|
|
|
parser.add_argument('id',
|
|
type=int,
|
|
help='Id of the environment to be provision.')
|
|
|
|
return parser
|
|
|
|
def take_action(self, parsed_args):
|
|
return self.client.spawn_vms(parsed_args.id)
|