def get_parser(self, prog_name): parser = super(ListAntiDDosStatus, self).get_parser(prog_name) parser.add_argument("--status", choices=resource.AntiDDos.status_list, help=_("list AntiDDos with status")) parser.add_argument("--ip", help=_("list AntiDDos with the ip (eg: 110.110.)")) p.BaseParser.add_limit_option(parser) p.BaseParser.add_offset_option(parser) return parser
def add_enable_l7_arg(parser): enable_group = parser.add_mutually_exclusive_group() enable_group.add_argument( '--enable-CC', action="store_true", dest='enable_l7', default=True, help=_("Enable CC Defence protection (default)")) enable_group.add_argument('--disable-CC', action="store_false", dest='enable_l7', help=_("Disable CC Defence protection"))
class SetAntiDDos(command.Command): _description = _("Update AntiDDos settings of floating IP") def get_parser(self, prog_name): parser = super(SetAntiDDos, self).get_parser(prog_name) pb.AntiDDosParser.add_floating_ip_arg(parser) pb.AntiDDosParser.add_enable_l7_arg(parser) pb.AntiDDosParser.add_maximum_service_traffic_arg(parser) pb.AntiDDosParser.add_http_request_rate_arg(parser) # pb.AntiDDosParser.add_cleaning_access_pos_arg(parser) # pb.AntiDDosParser.add_app_type_arg(parser) return parser def take_action(self, args): client = self.app.client_manager.antiddos if not args.enable_l7 and args.http_request_rate: raise argparse.ArgumentTypeError( 'argument --http-request-rate only effect ' 'when CC defence protection is enabled') floating_ip = client.antiddos.find(args.floating_ip) # issue 8, cleaning-pos fixed to 8, app-type fixed to 1 traffic_pos = pb.AntiDDosParser.get_traffic_pos_id( args.maximum_service_traffic) http_request_pos = pb.AntiDDosParser.get_http_request_pos_id( args.http_request_rate) task = client.antiddos.update_antiddos(floating_ip.floating_ip_id, args.enable_l7, traffic_pos, http_request_pos, 8, 1) if isinstance(task, br.StrWithMeta): raise exceptions.ClientException( 'this floating ip already has the same configuration') return 'Request Received, task id: ' + task['task_id']
def find(self, keyword): """find antiddos by keyword (UUID or IP)""" if not IP_PATTERN.match(keyword): try: # try keyword as UUID return self.get_antiddos(keyword) except exceptions.ClientException as e: pass else: # try keyword as IP results = self.list(ip=keyword) matched_number = len(results) if matched_number > 1: exactly_matched = [ obj for obj in results if obj.floating_ip_address == keyword ] if len(exactly_matched) == 1: return exactly_matched[0] raise execs.NotUniqueMatch elif matched_number == 1: return results[0] message = _("AntiDDos with ID or IP '%s' not exists.") % keyword raise exceptions.NotFound(message)
def get_parser(self, prog_name): parser = super(ListAntiDDosWeeklyReport, self).get_parser(prog_name) parser.add_argument('--start-date', metavar='<start-date>', required=False, type=parsetypes.date_type, help=_("start date (yyyy-MM-dd)")) return parser
def add_http_request_rate_arg(parser): parser.add_argument( '--http-request-rate', required=False, choices=http_request_rate, type=int, help=_("HTTP request rate (per second), " "only effect when CC defence protection is enabled"))
class CloseAntiDDos(command.Command): _description = _("Close AntiDDos of floating IP") def get_parser(self, prog_name): parser = super(CloseAntiDDos, self).get_parser(prog_name) pb.AntiDDosParser.add_floating_ip_arg(parser) return parser def take_action(self, args): client = self.app.client_manager.antiddos floating_ip = client.antiddos.find(args.floating_ip) task = client.antiddos.close_antiddos(floating_ip.floating_ip_id) return 'Request Received, task id: ' + task['task_id']
class QueryAntiDDosConfig(command.ShowOne): _description = _("Query AntiDDos configurations") def get_parser(self, prog_name): parser = super(QueryAntiDDosConfig, self).get_parser(prog_name) return parser def take_action(self, args): client = self.app.client_manager.antiddos data = client.antiddos.query_config_list() columns = resource.AntiDDosConfig.show_column_names formatter = resource.AntiDDosConfig.formatter return columns, data.get_display_data(columns, formatter=formatter)
class ShowAntiDDosAlertConfig(command.ShowOne): _description = _("Show AntiDDos alert config details") def get_parser(self, prog_name): parser = super(ShowAntiDDosAlertConfig, self).get_parser(prog_name) return parser def take_action(self, args): mgr = self.app.client_manager.antiddos.alerts alert_config = mgr.get() columns = resource.AlertConfig.show_column_names formatter = resource.AlertConfig.formatter output = alert_config.get_display_data(columns, formatter=formatter) return columns, output
class ListAntiDDosDailyReport(command.Lister): _description = _("List AntiDDos report(every 5min) of past 24h") def get_parser(self, prog_name): parser = super(ListAntiDDosDailyReport, self).get_parser(prog_name) pb.AntiDDosParser.add_floating_ip_arg(parser) return parser def take_action(self, args): manager = self.app.client_manager.antiddos.antiddos floating_ip = manager.find(args.floating_ip) reports = manager.get_antiddos_daily_report(floating_ip.floating_ip_id) columns = resource.AntiDDosDailyReport.list_column_names return columns, (r.get_display_data(columns) for r in reports)
class ShowAntiDDosStatus(command.ShowOne): _description = _("Display AntiDDos status of floating ip") def get_parser(self, prog_name): parser = super(ShowAntiDDosStatus, self).get_parser(prog_name) pb.AntiDDosParser.add_floating_ip_arg(parser) return parser def take_action(self, args): manager = self.app.client_manager.antiddos.antiddos floating_ip = manager.find(args.floating_ip) status = manager.get_antiddos_status(floating_ip.floating_ip_id) columns = resource.AntiDDosStatus.show_column_names return columns, status.get_display_data(columns)
class ShowAntiDDosTask(command.ShowOne): _description = _("Display antiddos related task details") def get_parser(self, prog_name): parser = super(ShowAntiDDosTask, self).get_parser(prog_name) parser.add_argument('task_id', metavar='<task id>', help=_("AntiDDos setting task id")) return parser def take_action(self, args): client = self.app.client_manager.antiddos task = client.antiddos.get_task_status(args.task_id) columns = resource.AntiDDosTask.show_column_names return columns, task.get_display_data(columns)
class ListAntiDDosWeeklyReport(command.ShowOne): _description = _("List AntiDDos weekly protection statistics") def get_parser(self, prog_name): parser = super(ListAntiDDosWeeklyReport, self).get_parser(prog_name) parser.add_argument('--start-date', metavar='<start-date>', required=False, type=parsetypes.date_type, help=_("start date (yyyy-MM-dd)")) return parser def take_action(self, args): manager = self.app.client_manager.antiddos.antiddos report = manager.get_antiddos_weekly_report(args.start_date) columns = resource.AntiDDosWeeklyReport.show_column_names formatter = resource.AntiDDosWeeklyReport.formatter output = report.get_display_data(columns, formatter=formatter) return columns, output
class ListAntiDDosStatus(command.Lister): _description = _("List AntiDDos status") def get_parser(self, prog_name): parser = super(ListAntiDDosStatus, self).get_parser(prog_name) parser.add_argument("--status", choices=resource.AntiDDos.status_list, help=_("list AntiDDos with status")) parser.add_argument("--ip", help=_("list AntiDDos with the ip (eg: 110.110.)")) p.BaseParser.add_limit_option(parser) p.BaseParser.add_offset_option(parser) return parser def take_action(self, args): client = self.app.client_manager.antiddos data = client.antiddos.list(status=args.status, ip=args.ip, limit=args.limit, offset=args.offset) columns = resource.AntiDDos.list_column_names return columns, (r.get_display_data(columns) for r in data)
class ListAntiDDosLogs(command.Lister): _description = _("List AntiDDos logs(every 5min) of past 24h") def get_parser(self, prog_name): parser = super(ListAntiDDosLogs, self).get_parser(prog_name) pb.AntiDDosParser.add_floating_ip_arg(parser) p.BaseParser.add_limit_option(parser) p.BaseParser.add_offset_option(parser) p.BaseParser.add_sortdir_option(parser) return parser def take_action(self, args): # TODO(Woo) no data in test env, need to test later manager = self.app.client_manager.antiddos.antiddos floating_ip = manager.find(args.floating_ip) logs = manager.get_antiddos_daily_logs(floating_ip.floating_ip_id, args.sort_dir, args.limit, args.offset) columns = resource.AntiDDosLog.list_column_names data = (r.get_display_data(columns, formatter=r.formatter) for r in logs) return columns, data
class OpenAntiDDos(command.Command): _description = _("Open AntiDDos for floating IP") def get_parser(self, prog_name): parser = super(OpenAntiDDos, self).get_parser(prog_name) pb.AntiDDosParser.add_floating_ip_arg(parser) pb.AntiDDosParser.add_enable_l7_arg(parser) pb.AntiDDosParser.add_maximum_service_traffic_arg(parser) pb.AntiDDosParser.add_http_request_rate_arg(parser) # pb.AntiDDosParser.add_cleaning_access_pos_arg(parser) # pb.AntiDDosParser.add_app_type_arg(parser) return parser def take_action(self, args): client = self.app.client_manager.antiddos if args.enable_l7 and not args.http_request_rate: raise argparse.ArgumentTypeError( 'argument --http-request-rate is required ' 'when CC defence protection is enabled') if not args.enable_l7 and args.http_request_rate: raise argparse.ArgumentTypeError( 'argument --http-request-rate only effect ' 'when CC defence protection is enabled') floating_ip = client.antiddos.find(args.floating_ip) # issue 8, cleaning-pos fixed to 8, app-type fixed to 1 traffic_pos = pb.AntiDDosParser.get_traffic_pos_id( args.maximum_service_traffic) http_request_pos = pb.AntiDDosParser.get_http_request_pos_id( args.http_request_rate) task = client.antiddos.open_antiddos(floating_ip.floating_ip_id, args.enable_l7, traffic_pos, http_request_pos, 8, 1) return 'Request Received, task id: ' + task['task_id']
class ShowAntiDDos(command.ShowOne): _description = _("Display AntiDDos settings of floating IP") def get_parser(self, prog_name): parser = super(ShowAntiDDos, self).get_parser(prog_name) pb.AntiDDosParser.add_floating_ip_arg(parser) return parser def take_action(self, args): client = self.app.client_manager.antiddos _antiddos = client.antiddos.find(args.floating_ip) # if user pass ip, we should reload antiddos object if _antiddos.floating_ip_id != args.floating_ip: _antiddos = client.antiddos.get_antiddos(_antiddos.floating_ip_id) if 'status' in _antiddos.original and _antiddos.status == 'notConfig': raise exceptions.ClientException( 'You have not config antiddos for this floating ip yet.') else: if not _antiddos.enable_L7: columns = resource.AntiDDos.show_column_names[:-1] else: columns = resource.AntiDDos.show_column_names return columns, _antiddos.get_display_data(columns)
def add_maximum_service_traffic_arg(parser): parser.add_argument('--maximum-service-traffic', required=True, choices=maximum_service_traffic, type=int, help=_("Maximum service traffic (Mbit/s)"))
def add_floating_ip_arg(parser): parser.add_argument('floating_ip', metavar='<floating ip>', help=_("For floating ip (UUID or IP)"))
def get_parser(self, prog_name): parser = super(ShowAntiDDosTask, self).get_parser(prog_name) parser.add_argument('task_id', metavar='<task id>', help=_("AntiDDos setting task id")) return parser