229 lines
8.1 KiB
Python
229 lines
8.1 KiB
Python
# Copyright 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 sys
|
|
|
|
import six
|
|
|
|
from fuelclient.cli.actions.base import Action
|
|
from fuelclient.cli.actions.base import check_all
|
|
from fuelclient.cli.actions.base import check_any
|
|
import fuelclient.cli.arguments as Args
|
|
from fuelclient.cli.arguments import group
|
|
from fuelclient.cli.formatting import format_table
|
|
from fuelclient.objects.environment import Environment
|
|
|
|
|
|
class EnvironmentAction(Action):
|
|
"""Create, list and modify currently existing environments(clusters)
|
|
"""
|
|
action_name = "environment"
|
|
|
|
def __init__(self):
|
|
super(EnvironmentAction, self).__init__()
|
|
self.args = [
|
|
Args.get_env_arg(),
|
|
group(
|
|
Args.get_list_arg(
|
|
"List all available environments"
|
|
),
|
|
Args.get_set_arg(
|
|
"Set environment parameters e.g., its name"
|
|
),
|
|
Args.get_delete_arg(
|
|
"Delete environment with a specific id or name"
|
|
),
|
|
Args.get_create_arg(
|
|
"Create a new environment with "
|
|
"specific release id and name"
|
|
),
|
|
),
|
|
Args.get_release_arg(
|
|
"Release id"
|
|
),
|
|
Args.get_force_arg(
|
|
"Do it anyway"
|
|
),
|
|
Args.get_name_arg(
|
|
"Environment name"
|
|
),
|
|
Args.get_nst_arg(
|
|
"Set network segment type"
|
|
),
|
|
Args.get_deployment_tasks_arg("Environment tasks configuration"),
|
|
Args.get_attributes_arg("Environment attributes"),
|
|
group(
|
|
Args.get_download_arg(
|
|
"Download configuration of specific cluster"),
|
|
Args.get_upload_arg(
|
|
"Upload configuration to specific cluster")
|
|
),
|
|
Args.get_dir_arg(
|
|
"Select directory to which download release attributes"),
|
|
]
|
|
self.flag_func_map = (
|
|
("deployment-tasks", self.deployment_tasks),
|
|
("attributes", self.attributes),
|
|
("create", self.create),
|
|
("set", self.set),
|
|
("delete", self.delete),
|
|
(None, self.list)
|
|
)
|
|
|
|
@check_all("name", "release")
|
|
def create(self, params):
|
|
"""To create an environment with name MyEnv and release id=1 run:
|
|
fuel env create --name MyEnv --rel 1
|
|
|
|
By default, it creates environment setting neutron with VLAN
|
|
network segmentation as network provider
|
|
To specify other modes add optional arguments:
|
|
fuel env create --name MyEnv --rel 1 --net-segment-type vlan
|
|
"""
|
|
|
|
if params.nst == 'gre':
|
|
six.print_(
|
|
"WARNING: GRE network segmentation type is deprecated "
|
|
"since 7.0 release.", file=sys.stderr)
|
|
|
|
env = Environment.create(
|
|
params.name,
|
|
params.release,
|
|
params.nst,
|
|
)
|
|
|
|
data = env.get_fresh_data()
|
|
|
|
self.serializer.print_to_output(
|
|
data,
|
|
u"Environment '{name}' with id={id} was created!"
|
|
.format(**data)
|
|
)
|
|
|
|
@check_all("env")
|
|
def set(self, params):
|
|
"""To change environment name:
|
|
fuel --env 1 env set --name NewEnvName
|
|
"""
|
|
acceptable_params = ('name', )
|
|
|
|
env = Environment(params.env, params=params)
|
|
|
|
# forming message for output and data structure for request body
|
|
# TODO(aroma): make it less ugly
|
|
msg_template = ("Following attributes are changed for "
|
|
"the environment: {env_attributes}")
|
|
|
|
env_attributes = []
|
|
update_kwargs = dict()
|
|
for param_name in acceptable_params:
|
|
attr_value = getattr(params, param_name, None)
|
|
if attr_value:
|
|
update_kwargs[param_name] = attr_value
|
|
env_attributes.append(
|
|
''.join([param_name, '=', str(attr_value)])
|
|
)
|
|
|
|
data = env.set(update_kwargs)
|
|
env_attributes = ', '.join(env_attributes)
|
|
self.serializer.print_to_output(
|
|
data,
|
|
msg_template.format(env_attributes=env_attributes)
|
|
)
|
|
|
|
@check_all("env")
|
|
def delete(self, params):
|
|
"""To delete the environment:
|
|
fuel --env 1 env --force delete
|
|
"""
|
|
env = Environment(params.env, params=params)
|
|
|
|
if env.status == "operational" and not params.force:
|
|
self.serializer.print_to_output(env.data,
|
|
"Deleting an operational"
|
|
"environment is a dangerous "
|
|
"operation. Please use --force to "
|
|
"bypass this message.")
|
|
return
|
|
|
|
data = env.delete()
|
|
self.serializer.print_to_output(
|
|
data,
|
|
"Environment with id={0} was deleted"
|
|
.format(env.id)
|
|
)
|
|
|
|
def list(self, params):
|
|
"""Print all available environments:
|
|
fuel env
|
|
"""
|
|
acceptable_keys = ("id", "status", "name", "release_id", )
|
|
data = Environment.get_all_data()
|
|
if params.env:
|
|
data = filter(
|
|
lambda x: x[u"id"] == int(params.env),
|
|
data
|
|
)
|
|
self.serializer.print_to_output(
|
|
data,
|
|
format_table(
|
|
data,
|
|
acceptable_keys=acceptable_keys
|
|
)
|
|
)
|
|
|
|
@check_all("env")
|
|
@check_any("download", "upload")
|
|
def deployment_tasks(self, params):
|
|
"""Modify deployment_tasks for environment:
|
|
fuel env --env 1 --deployment-tasks --download
|
|
fuel env --env 1 --deployment-tasks --upload
|
|
"""
|
|
cluster = Environment(params.env)
|
|
dir_path = self.full_path_directory(
|
|
params.dir, 'cluster_{0}'.format(params.env))
|
|
full_path = '{0}/deployment_tasks'.format(dir_path)
|
|
if params.download:
|
|
tasks = cluster.get_deployment_tasks()
|
|
self.serializer.write_to_path(full_path, tasks)
|
|
print("Deployment tasks for cluster {0} "
|
|
"downloaded into {1}.yaml.".format(cluster.id, full_path))
|
|
elif params.upload:
|
|
tasks = self.serializer.read_from_file(full_path)
|
|
cluster.update_deployment_tasks(tasks)
|
|
print("Deployment tasks for cluster {0} "
|
|
"uploaded from {1}.yaml".format(cluster.id, full_path))
|
|
|
|
@check_all("env")
|
|
@check_any("download", "upload")
|
|
def attributes(self, params):
|
|
"""Modify attributes of the environment:
|
|
fuel env --env 1 --attributes --download
|
|
fuel env --env 1 --attributes --upload
|
|
"""
|
|
cluster = Environment(params.env)
|
|
dir_path = self.full_path_directory(
|
|
params.dir, 'cluster_{0}'.format(params.env))
|
|
full_path = '{0}/attributes'.format(dir_path)
|
|
|
|
if params.download:
|
|
attributes = cluster.get_attributes()
|
|
self.serializer.write_to_path(full_path, attributes)
|
|
print("Attributes of cluster {0} "
|
|
"downloaded into {1}.yaml.".format(cluster.id, full_path))
|
|
elif params.upload:
|
|
attributes = self.serializer.read_from_file(full_path)
|
|
cluster.update_attributes(attributes, params.force)
|
|
print("Attributes of cluster {0} "
|
|
"uploaded from {1}.yaml".format(cluster.id, full_path))
|