def testParse(self):
     arg_groups = ['ALL_SUBNETS']
     for resource_class in self.resource_classes:
         resource_enum = resource_class.AdvertisedGroupsValueListEntryValuesEnum
         expected_groups = [resource_enum.ALL_SUBNETS]
         actual_groups = routers_utils.ParseGroups(resource_class,
                                                   arg_groups)
         self.assertEqual(expected_groups, actual_groups)
Пример #2
0
def ParseAdvertisements(messages, resource_class, args):
    """Parses and validates a completed advertisement configuration from flags.

  Args:
    messages: API messages holder.
    resource_class: RouterBgp or RouterBgpPeer class type to parse for.
    args: Flag arguments to generate configuration from.

  Returns:
    The validated tuple of mode, groups and prefixes.  If mode is DEFAULT,
    validates that no custom advertisements were specified and returns empty
    lists for each.

  Raises:
    CustomWithDefaultError: If custom advertisements were specified at the same
    time as DEFAULT mode.
  """

    mode = None
    if args.advertisement_mode is not None:
        mode = routers_utils.ParseMode(resource_class, args.advertisement_mode)
    groups = None
    if args.set_advertisement_groups is not None:
        groups = routers_utils.ParseGroups(resource_class,
                                           args.set_advertisement_groups)
    prefixes = None
    if args.set_advertisement_ranges is not None:
        prefixes = routers_utils.ParseIpRanges(messages,
                                               args.set_advertisement_ranges)

    if (mode is not None
            and mode is resource_class.AdvertiseModeValueValuesEnum.DEFAULT):
        if groups or prefixes:
            raise CustomWithDefaultError(messages, resource_class)
        else:
            # Switching to default mode clears out any existing custom advertisements
            return mode, [], []
    else:
        return mode, groups, prefixes
Пример #3
0
    def _Run(self, args, support_bfd=False, support_enable=False):
        # Manually ensure replace/incremental flags are mutually exclusive.
        router_utils.CheckIncompatibleFlagsOrRaise(args)

        holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
        messages = holder.client.messages
        service = holder.client.apitools_client.routers

        router_ref = self.ROUTER_ARG.ResolveAsResource(args, holder.resources)

        request_type = messages.ComputeRoutersGetRequest
        replacement = service.Get(request_type(**router_ref.AsDict()))

        # Retrieve specified peer and update base fields.
        peer = _UpdateBgpPeerMessage(messages,
                                     replacement,
                                     args,
                                     support_bfd=support_bfd,
                                     support_enable=support_enable)

        if router_utils.HasReplaceAdvertisementFlags(args):
            mode, groups, ranges = router_utils.ParseAdvertisements(
                messages=messages,
                resource_class=messages.RouterBgpPeer,
                args=args)

            router_utils.PromptIfSwitchToDefaultMode(
                messages=messages,
                resource_class=messages.RouterBgpPeer,
                existing_mode=peer.advertiseMode,
                new_mode=mode)

            attrs = {
                'advertiseMode': mode,
                'advertisedGroups': groups,
                'advertisedIpRanges': ranges,
            }

            for attr, value in attrs.items():
                if value is not None:
                    setattr(peer, attr, value)

        if router_utils.HasIncrementalAdvertisementFlags(args):
            # This operation should only be run on custom mode peers.
            router_utils.ValidateCustomMode(
                messages=messages,
                resource_class=messages.RouterBgpPeer,
                resource=peer)

            # These arguments are guaranteed to be mutually exclusive in args.
            if args.add_advertisement_groups:
                groups_to_add = routers_utils.ParseGroups(
                    resource_class=messages.RouterBgpPeer,
                    groups=args.add_advertisement_groups)
                peer.advertisedGroups.extend(groups_to_add)

            if args.remove_advertisement_groups:
                groups_to_remove = routers_utils.ParseGroups(
                    resource_class=messages.RouterBgpPeer,
                    groups=args.remove_advertisement_groups)
                router_utils.RemoveGroupsFromAdvertisements(
                    messages=messages,
                    resource_class=messages.RouterBgpPeer,
                    resource=peer,
                    groups=groups_to_remove)

            if args.add_advertisement_ranges:
                ip_ranges_to_add = routers_utils.ParseIpRanges(
                    messages=messages, ip_ranges=args.add_advertisement_ranges)
                peer.advertisedIpRanges.extend(ip_ranges_to_add)

            if args.remove_advertisement_ranges:
                router_utils.RemoveIpRangesFromAdvertisements(
                    messages=messages,
                    resource_class=messages.RouterBgpPeer,
                    resource=peer,
                    ip_ranges=args.remove_advertisement_ranges)

        request_type = messages.ComputeRoutersPatchRequest
        result = service.Patch(
            request_type(project=router_ref.project,
                         region=router_ref.region,
                         router=router_ref.Name(),
                         routerResource=replacement))

        operation_ref = resources.REGISTRY.Parse(
            result.name,
            collection='compute.regionOperations',
            params={
                'project': router_ref.project,
                'region': router_ref.region,
            })

        if args. async:
            log.UpdatedResource(
                operation_ref,
                kind='peer [{0}] in router [{1}]'.format(
                    peer.name, router_ref.Name()),
                is_async=True,
                details='Run the [gcloud compute operations describe] command '
                'to check the status of this operation.')
            return result

        target_router_ref = holder.resources.Parse(
            router_ref.Name(),
            collection='compute.routers',
            params={
                'project': router_ref.project,
                'region': router_ref.region,
            })

        operation_poller = poller.Poller(service, target_router_ref)
        return waiter.WaitFor(
            operation_poller, operation_ref,
            'Updating peer [{0}] in router [{1}]'.format(
                peer.name, router_ref.Name()))
Пример #4
0
    def Run(self, args):
        # Manually ensure replace/incremental flags are mutually exclusive.
        router_utils.CheckIncompatibleFlagsOrRaise(args)

        holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
        messages = holder.client.messages
        service = holder.client.apitools_client.routers

        router_ref = self.ROUTER_ARG.ResolveAsResource(args, holder.resources)

        request_type = messages.ComputeRoutersGetRequest
        replacement = service.Get(request_type(**router_ref.AsDict()))
        existing_mode = replacement.bgp.advertiseMode

        if router_utils.HasReplaceAdvertisementFlags(args):
            mode, groups, prefixes = router_utils.ParseAdvertisements(
                messages=messages,
                resource_class=messages.RouterBgp,
                args=args)

            router_utils.PromptIfSwitchToDefaultMode(
                messages=messages,
                resource_class=messages.RouterBgp,
                existing_mode=existing_mode,
                new_mode=mode)

            attrs = {
                'advertiseMode': mode,
                'advertisedGroups': groups,
                'advertisedPrefixs': prefixes,
            }

            for attr, value in attrs.items():
                if value is not None:
                    setattr(replacement.bgp, attr, value)

        if router_utils.HasIncrementalAdvertisementFlags(args):
            # This operation should only be run on custom mode routers.
            router_utils.ValidateCustomMode(messages=messages,
                                            resource_class=messages.RouterBgp,
                                            resource=replacement.bgp)

            # These arguments are guaranteed to be mutually exclusive in args.
            if args.add_advertisement_groups:
                groups_to_add = routers_utils.ParseGroups(
                    resource_class=messages.RouterBgp,
                    groups=args.add_advertisement_groups)
                replacement.bgp.advertisedGroups.extend(groups_to_add)

            if args.remove_advertisement_groups:
                groups_to_remove = routers_utils.ParseGroups(
                    resource_class=messages.RouterBgp,
                    groups=args.remove_advertisement_groups)
                router_utils.RemoveGroupsFromAdvertisements(
                    messages=messages,
                    resource_class=messages.RouterBgp,
                    resource=replacement.bgp,
                    groups=groups_to_remove)

            if args.add_advertisement_ranges:
                ip_ranges_to_add = routers_utils.ParseIpRanges(
                    messages=messages, ip_ranges=args.add_advertisement_ranges)
                replacement.bgp.advertisedPrefixs.extend(ip_ranges_to_add)

            if args.remove_advertisement_ranges:
                router_utils.RemoveIpRangesFromAdvertisements(
                    messages=messages,
                    resource_class=messages.RouterBgp,
                    resource=replacement.bgp,
                    ip_ranges=args.remove_advertisement_ranges)

        # Cleared list fields need to be explicitly identified for Patch API.
        cleared_fields = []
        if not replacement.bgp.advertisedGroups:
            cleared_fields.append('bgp.advertisedGroups')
        if not replacement.bgp.advertisedPrefixs:
            cleared_fields.append('bgp.advertisedPrefixs')

        with holder.client.apitools_client.IncludeFields(cleared_fields):
            request_type = messages.ComputeRoutersPatchRequest
            result = service.Patch(
                request_type(project=router_ref.project,
                             region=router_ref.region,
                             router=router_ref.Name(),
                             routerResource=replacement))

        operation_ref = resources.REGISTRY.Parse(
            result.name,
            collection='compute.regionOperations',
            params={
                'project': router_ref.project,
                'region': router_ref.region,
            })

        if args. async:
            log.UpdatedResource(
                operation_ref,
                kind='router [{0}]'.format(router_ref.Name()),
                async=True,
                details='Run the [gcloud compute operations describe] command '
                'to check the status of this operation.')
            return result

        target_router_ref = holder.resources.Parse(
            router_ref.Name(),
            collection='compute.routers',
            params={
                'project': router_ref.project,
                'region': router_ref.region,
            })

        operation_poller = poller.Poller(service, target_router_ref)
        return waiter.WaitFor(
            operation_poller, operation_ref,
            'Updating router [{0}]'.format(router_ref.Name()))