def testRemoveGroupsFromAdvertisements_groupNotFoundError(self):
        router_bgp = self.messages.RouterBgp()
        router_bgp.advertisedGroups = []

        groups_to_remove = [
            (self.messages.RouterBgp.AdvertisedGroupsValueListEntryValuesEnum.
             ALL_SUBNETS)
        ]
        error_msg = 'Advertised group ALL_SUBNETS not found on this router.'
        with self.AssertRaisesExceptionMatches(router_utils.GroupNotFoundError,
                                               error_msg):
            router_utils.RemoveGroupsFromAdvertisements(
                messages=self.messages,
                resource_class=self.messages.RouterBgp,
                resource=router_bgp,
                groups=groups_to_remove)
    def testRemoveGroupsFromAdvertisementsBgp_success(self):
        router_bgp = self.messages.RouterBgp()
        groups = [(self.messages.RouterBgp.
                   AdvertisedGroupsValueListEntryValuesEnum.ALL_SUBNETS)]
        router_bgp.advertisedGroups = groups

        groups_to_remove = [
            (self.messages.RouterBgp.AdvertisedGroupsValueListEntryValuesEnum.
             ALL_SUBNETS)
        ]
        router_utils.RemoveGroupsFromAdvertisements(
            messages=self.messages,
            resource_class=self.messages.RouterBgp,
            resource=router_bgp,
            groups=groups_to_remove)

        expected_groups = []
        self.assertEqual(router_bgp.advertisedGroups, expected_groups)
Пример #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()))
Пример #5
0
  def Run(self, args):
    # Manually ensure replace/incremental flags are mutually exclusive.
    router_utils.CheckIncompatibleFlagsOrRaise(args)

    holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
    client = holder.client
    messages = client.messages

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

    existing = client.MakeRequests([routers_utils.GetGetRequest(client,
                                                                ref)])[0]
    replacement = copy.deepcopy(existing)

    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.bgp.advertiseMode,
          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 = router_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 = router_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 = router_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 client.apitools_client.IncludeFields(cleared_fields):
      resource_list = client.MakeRequests(
          [routers_utils.GetPatchRequest(client, ref, replacement)])
    return resource_list
Пример #6
0
    def Run(self, args):
        # Manually ensure replace/incremental flags are mutually exclusive.
        router_utils.CheckIncompatibleFlagsOrRaise(args)

        holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
        client = holder.client
        messages = client.messages

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

        existing = client.MakeRequests(
            [routers_utils.GetGetRequest(client, ref)])[0]
        # TODO(b/38240188): Clean up test resources and remove this copy step.
        replacement = copy.deepcopy(existing)

        # Retrieve specified peer and update base fields.
        peer = _UpdateBgpPeer(replacement, args)

        if router_utils.HasReplaceAdvertisementFlags(args):
            mode, groups, prefixes = 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,
                'advertisedPrefixs': prefixes,
            }

            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 = router_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 = router_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 = router_utils.ParseIpRanges(
                    messages=messages, ip_ranges=args.add_advertisement_ranges)
                peer.advertisedPrefixs.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)

        # TODO(b/62667314): Replace MakeRequests with proper poll + mock testing.
        resource_list = client.MakeRequests(
            [routers_utils.GetPatchRequest(client, ref, replacement)])
        return resource_list
Пример #7
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

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

        request_type = messages.ComputeRoutersGetRequest
        existing = service.Get(request_type(**ref.AsDict()))
        replacement = copy.deepcopy(existing)

        # Retrieve specified peer and update base fields.
        peer = _UpdateBgpPeer(replacement, args)

        if router_utils.HasReplaceAdvertisementFlags(args):
            mode, groups, prefixes = 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,
                'advertisedPrefixs': prefixes,
            }

            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 = router_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 = router_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 = router_utils.ParseIpRanges(
                    messages=messages, ip_ranges=args.add_advertisement_ranges)
                peer.advertisedPrefixs.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
        resource = service.Patch(
            request_type(project=ref.project,
                         region=ref.region,
                         router=ref.Name(),
                         routerResource=replacement))

        return resource