138 lines
4.8 KiB
Python
138 lines
4.8 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
|
|
import fuelclient.cli.arguments as Args
|
|
from fuelclient.cli.arguments import group
|
|
from fuelclient.cli.error import ActionException
|
|
from fuelclient.cli.formatting import format_table
|
|
from fuelclient.objects import Environment
|
|
from fuelclient.objects.nodegroup import NodeGroup
|
|
from fuelclient.objects.nodegroup import NodeGroupCollection
|
|
|
|
|
|
class NodeGroupAction(Action):
|
|
"""Show or modify node groups
|
|
"""
|
|
action_name = "nodegroup"
|
|
acceptable_keys = ("id", "cluster_id", "name")
|
|
|
|
def __init__(self):
|
|
super(NodeGroupAction, self).__init__()
|
|
self.args = (
|
|
Args.get_env_arg(),
|
|
Args.get_list_arg("List all node groups."),
|
|
Args.get_name_arg("Name of new node group."),
|
|
Args.get_group_arg("ID of node group."),
|
|
Args.get_node_arg("List of nodes to assign specified group to."),
|
|
group(
|
|
Args.get_create_arg(
|
|
"Create a new node group in the specified environment."
|
|
),
|
|
Args.get_assign_arg(
|
|
"Assign nodes to the specified node group."),
|
|
Args.get_delete_arg(
|
|
"Delete specified node groups."),
|
|
)
|
|
)
|
|
self.flag_func_map = (
|
|
("create", self.create),
|
|
("delete", self.delete),
|
|
("assign", self.assign),
|
|
(None, self.list)
|
|
)
|
|
|
|
@check_all("env", "name")
|
|
def create(self, params):
|
|
"""Create a new node group
|
|
fuel --env 1 nodegroup --create --name "group 1"
|
|
"""
|
|
env_id = int(params.env)
|
|
data = NodeGroup.create(params.name, env_id)
|
|
env = Environment(env_id)
|
|
network_data = env.get_network_data()
|
|
seg_type = network_data['networking_parameters'].get(
|
|
'segmentation_type'
|
|
)
|
|
if seg_type == 'vlan':
|
|
six.print_("WARNING: In VLAN segmentation type, there will be no "
|
|
"connectivity over private network between instances "
|
|
"running on hypervisors in different segments and that "
|
|
"it's a user's responsibility to handle this "
|
|
"situation.",
|
|
file=sys.stderr)
|
|
|
|
self.serializer.print_to_output(
|
|
data,
|
|
u"Node group '{name}' with id={id} "
|
|
u"in environment {env} was created!"
|
|
.format(env=env_id, **data)
|
|
)
|
|
|
|
@check_all("group")
|
|
def delete(self, params):
|
|
"""Delete the specified node groups
|
|
fuel nodegroup --delete --group 1
|
|
fuel nodegroup --delete --group 2,3,4
|
|
"""
|
|
ngs = NodeGroup.get_by_ids(params.group)
|
|
for n in ngs:
|
|
if n.name == "default":
|
|
raise ActionException(
|
|
"Default node groups cannot be deleted."
|
|
)
|
|
data = NodeGroup.delete(n.id)
|
|
self.serializer.print_to_output(
|
|
data,
|
|
u"Node group with id={id} was deleted!"
|
|
.format(id=n.id)
|
|
)
|
|
|
|
@check_all("node", "group")
|
|
def assign(self, params):
|
|
"""Assign nodes to specified node group:
|
|
fuel nodegroup --assign --node 1 --group 1
|
|
fuel nodegroup --assign --node 2,3,4 --group 1
|
|
"""
|
|
if len(params.group) > 1:
|
|
raise ActionException(
|
|
"Nodes can only be assigned to one node group."
|
|
)
|
|
|
|
group = NodeGroup(params.group.pop())
|
|
group.assign(params.node)
|
|
|
|
def list(self, params):
|
|
"""To list all available node groups:
|
|
fuel nodegroup
|
|
|
|
To filter them by environment:
|
|
fuel --env-id 1 nodegroup
|
|
"""
|
|
group_collection = NodeGroupCollection.get_all()
|
|
if params.env:
|
|
group_collection.filter_by_env_id(int(params.env))
|
|
self.serializer.print_to_output(
|
|
group_collection.data,
|
|
format_table(
|
|
group_collection.data,
|
|
acceptable_keys=self.acceptable_keys,
|
|
)
|
|
)
|