1#    Licensed under the Apache License, Version 2.0 (the "License"); you may
2#    not use this file except in compliance with the License. You may obtain
3#    a copy of the License at
4#
5#         http://www.apache.org/licenses/LICENSE-2.0
6#
7#    Unless required by applicable law or agreed to in writing, software
8#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10#    License for the specific language governing permissions and limitations
11#    under the License.
12#
13
14from osc_lib.command import command
15from osc_lib import utils
16
17from neutronclient._i18n import _
18from neutronclient.osc.v2.dynamic_routing import constants
19
20
21def _format_alive_state(item):
22    return ':-)' if item else 'XXX'
23
24
25_formatters = {
26    'alive': _format_alive_state
27}
28
29
30def add_common_args(parser):
31    parser.add_argument('dragent_id',
32                        metavar='<agent-id>',
33                        help=_("ID of the dynamic routing agent"))
34    parser.add_argument('bgp_speaker',
35                        metavar='<bgp-speaker>',
36                        help=_("ID or name of the BGP speaker"))
37
38
39class AddBgpSpeakerToDRAgent(command.Command):
40    """Add a BGP speaker to a dynamic routing agent"""
41
42    def get_parser(self, prog_name):
43        parser = super(AddBgpSpeakerToDRAgent, self).get_parser(prog_name)
44        add_common_args(parser)
45        return parser
46
47    def take_action(self, parsed_args):
48        client = self.app.client_manager.neutronclient
49        speaker_id = client.find_resource(constants.BGP_SPEAKER,
50                                          parsed_args.bgp_speaker)['id']
51        client.add_bgp_speaker_to_dragent(
52            parsed_args.dragent_id, {'bgp_speaker_id': speaker_id})
53
54
55class RemoveBgpSpeakerFromDRAgent(command.Command):
56    """Removes a BGP speaker from a dynamic routing agent"""
57
58    def get_parser(self, prog_name):
59        parser = super(RemoveBgpSpeakerFromDRAgent, self).get_parser(
60            prog_name)
61        add_common_args(parser)
62        return parser
63
64    def take_action(self, parsed_args):
65        client = self.app.client_manager.neutronclient
66        speaker_id = client.find_resource(constants.BGP_SPEAKER,
67                                          parsed_args.bgp_speaker)['id']
68        client.remove_bgp_speaker_from_dragent(parsed_args.dragent_id,
69                                               speaker_id)
70
71
72class ListDRAgentsHostingBgpSpeaker(command.Lister):
73    """(Deprecated) List dynamic routing agents hosting a BGP speaker
74
75       (Use "bgp dragent list" instead)
76    """
77
78    resource = 'agent'
79    list_columns = ['id', 'host', 'admin_state_up', 'alive']
80    unknown_parts_flag = False
81
82    def get_parser(self, prog_name):
83        self.log.warning("The 'openstack bgp speaker show dragents' CLI is "
84                         "deprecated and will be removed in the future. Use "
85                         "'openstack bgp dragent list' CLI instead.")
86        parser = super(ListDRAgentsHostingBgpSpeaker,
87                       self).get_parser(prog_name)
88        parser.add_argument('bgp_speaker',
89                            metavar='<bgp-speaker>',
90                            help=_("List dynamic routing agents hosting a "
91                                   "BGP speaker (name or ID)"))
92        return parser
93
94    def take_action(self, parsed_args):
95        search_opts = {}
96        client = self.app.client_manager.neutronclient
97        speaker_id = client.find_resource(constants.BGP_SPEAKER,
98                                          parsed_args.bgp_speaker)['id']
99        search_opts['bgp_speaker'] = speaker_id
100        data = client.list_dragents_hosting_bgp_speaker(**search_opts)
101        headers = ('ID', 'Host', 'State', 'Alive')
102        columns = ('id', 'host', 'admin_state_up', 'alive')
103        return (headers,
104                (utils.get_dict_properties(
105                    s, columns, formatters=_formatters,
106                ) for s in data['agents']))
107
108
109class ListDRAgent(command.Lister):
110    """List dynamic routing agents"""
111
112    resource = 'agent'
113    list_columns = ['id', 'host', 'admin_state_up', 'alive']
114    unknown_parts_flag = False
115
116    def get_parser(self, prog_name):
117        parser = super(ListDRAgent,
118                       self).get_parser(prog_name)
119        parser.add_argument('--bgp-speaker',
120                            metavar='<bgp-speaker>',
121                            help=_("List dynamic routing agents hosting a "
122                                   "BGP speaker (name or ID)"))
123        return parser
124
125    def take_action(self, parsed_args):
126        search_opts = {}
127        client = self.app.client_manager.neutronclient
128        if parsed_args.bgp_speaker is not None:
129            search_opts = {}
130            speaker_id = client.find_resource(constants.BGP_SPEAKER,
131                                              parsed_args.bgp_speaker)['id']
132            search_opts['bgp_speaker'] = speaker_id
133            data = client.list_dragents_hosting_bgp_speaker(**search_opts)
134        else:
135            attrs = {'agent_type': 'BGP dynamic routing agent'}
136            data = client.list_agents(**attrs)
137        headers = ('ID', 'Host', 'State', 'Alive')
138        columns = ('id', 'host', 'admin_state_up', 'alive')
139        return (headers,
140                (utils.get_dict_properties(
141                    s, columns, formatters=_formatters,
142                ) for s in data['agents']))
143