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