Example #1
0
    def Run(self, args):
        holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
        messages = holder.client.messages

        pm_ref = self.PACKET_MIRRORING_ARG.ResolveAsResource(
            args, holder.resources)

        def _MakeInstanceInfo(instance):
            return messages.PacketMirroringMirroredResourceInfoInstanceInfo(
                url=utils.ResolveInstanceURI(pm_ref.project, instance,
                                             holder.resources))

        def _MakeMirroredSubnetInfo(subnet):
            return messages.PacketMirroringMirroredResourceInfoSubnetInfo(
                url=utils.ResolveSubnetURI(pm_ref.project, pm_ref.region,
                                           subnet, holder.resources))

        mirrored_instance_infos = [
            _MakeInstanceInfo(instance) for instance in args.mirrored_instances
        ] if args.mirrored_instances else []

        mirrored_subnet_infos = [
            _MakeMirroredSubnetInfo(subnet) for subnet in args.mirrored_subnets
        ] if args.mirrored_subnets else []

        pm_filter = messages.PacketMirroringFilter()
        if args.filter_cidr_ranges or args.filter_protocols:
            if args.filter_cidr_ranges:
                pm_filter.cidrRanges.extend(args.filter_cidr_ranges)
            if args.filter_protocols:
                pm_filter.IPProtocols.extend(args.filter_protocols)

        mirrored_resources_info = messages.PacketMirroringMirroredResourceInfo(
            subnetworks=mirrored_subnet_infos,
            instances=mirrored_instance_infos,
            tags=args.mirrored_tags or [])
        template = messages.PacketMirroring(
            name=pm_ref.Name(),
            description=args.description,
            network=messages.PacketMirroringNetworkInfo(
                url=utils.ResolveNetworkURI(pm_ref.project, args.network,
                                            holder.resources)),
            collectorIlb=messages.PacketMirroringForwardingRuleInfo(
                url=utils.ResolveForwardingRuleURI(
                    pm_ref.project, pm_ref.region, args.collector_ilb,
                    holder.resources)),
            mirroredResources=mirrored_resources_info,
            priority=args.priority,
            filter=pm_filter,
            enable=messages.PacketMirroring.EnableValueValuesEnum.TRUE
            if args.enable else
            messages.PacketMirroring.EnableValueValuesEnum.FALSE)

        packet_mirroring = client.PacketMirroring(pm_ref,
                                                  compute_client=holder.client,
                                                  registry=holder.resources)

        return packet_mirroring.Create(template, is_async=args.async_ or False)
Example #2
0
    def _UpdateResource(self, pm_ref, resource, cleared_fields, holder, args,
                        messages):
        if args.enable is not None:
            resource.enable = (
                messages.PacketMirroring.EnableValueValuesEnum.TRUE
                if args.enable else
                messages.PacketMirroring.EnableValueValuesEnum.FALSE)

        if args.collector_ilb is not None:
            resource.collectorIlb = messages.PacketMirroringForwardingRuleInfo(
                url=utils.ResolveForwardingRuleURI(
                    pm_ref.project, pm_ref.region, args.collector_ilb,
                    holder.resources))

        if args.description is not None:
            resource.description = args.description

        if args.clear_mirrored_tags:
            resource.mirroredResources.tags[:] = []
            cleared_fields.append('mirroredResources.tags')
        elif args.add_mirrored_tags:
            resource.mirroredResources.tags.extend(args.add_mirrored_tags)
        elif args.set_mirrored_tags:
            resource.mirroredResources.tags[:] = args.set_mirrored_tags
        elif args.remove_mirrored_tags:
            for tag in args.remove_mirrored_tags:
                if tag not in resource.mirroredResources.tags:
                    raise exceptions.InvalidArgumentException(
                        'Tag %s not found in this packet mirroring.' % tag)
            resource.mirroredResources.tags[:] = [
                x for x in resource.mirroredResources.tags
                if x not in args.remove_mirrored_tags
            ]

        def _MakeSubnetInfo(subnet):
            return messages.PacketMirroringMirroredResourceInfoSubnetInfo(
                url=utils.ResolveSubnetURI(pm_ref.project, pm_ref.region,
                                           subnet, holder.resources))

        if args.clear_mirrored_subnets:
            resource.mirroredResources.subnetworks[:] = []
            cleared_fields.append('mirroredResources.subnetworks')
        elif args.add_mirrored_subnets:
            resource.mirroredResources.subnetworks.extend([
                _MakeSubnetInfo(subnet) for subnet in args.add_mirrored_subnets
            ])
        elif args.set_mirrored_subnets:
            resource.mirroredResources.subnetworks[:] = [
                _MakeSubnetInfo(subnet) for subnet in args.set_mirrored_subnets
            ]
        elif args.remove_mirrored_subnets:
            urls = [
                utils.ResolveSubnetURI(pm_ref.project, pm_ref.region, subnet,
                                       holder.resources)
                for subnet in args.remove_mirrored_subnets
            ]
            for url in urls:
                if next((x for x in resource.mirroredResources.subnetworks
                         if x.url == url), None) is None:
                    raise exceptions.InvalidArgumentException(
                        'Subnet %s not found in this packet mirroring.' % url)
            resource.mirroredResources.subnetworks = [
                x for x in resource.mirroredResources.subnetworks
                if x.url not in urls
            ]

        def _MakeInstanceInfo(instance):
            return messages.PacketMirroringMirroredResourceInfoInstanceInfo(
                url=utils.ResolveInstanceURI(pm_ref.project, instance,
                                             holder.resources))

        if args.clear_mirrored_instances:
            resource.mirroredResources.instances[:] = []
            cleared_fields.append('mirroredResources.instances')
        elif args.add_mirrored_instances:
            resource.mirroredResources.instances.extend([
                _MakeInstanceInfo(instance)
                for instance in args.add_mirrored_instances
            ])
        elif args.set_mirrored_instances:
            resource.mirroredResources.instances[:] = [
                _MakeInstanceInfo(instance)
                for instance in args.set_mirrored_instances
            ]
        elif args.remove_mirrored_instances:
            urls = [
                utils.ResolveInstanceURI(pm_ref.project, instance,
                                         holder.resources)
                for instance in args.remove_mirrored_instances
            ]
            for url in urls:
                if next((x for x in resource.mirroredResources.instances
                         if x.url == url), None) is None:
                    raise exceptions.InvalidArgumentException(
                        'Instance %s not found in this packet mirroring.' %
                        url)
            resource.mirroredResources.instances = [
                x for x in resource.mirroredResources.instances
                if x.url not in urls
            ]

        if args.clear_filter_protocols:
            resource.filter.IPProtocols[:] = []
        elif args.add_filter_protocols:
            resource.filter.IPProtocols.extend(args.add_filter_protocols)
        elif args.set_filter_protocols:
            resource.filter.IPProtocols[:] = args.set_filter_protocols
        elif args.remove_filter_protocols:
            for protocol in args.remove_filter_protocols:
                if protocol not in resource.filter.IPProtocols:
                    raise exceptions.InvalidArgumentException(
                        'Protocol %s not found in this packet mirroring.' %
                        protocol)
            resource.filter.IPProtocols[:] = [
                x for x in resource.filter.IPProtocols
                if x not in args.remove_filter_protocols
            ]

        if args.clear_filter_cidr_ranges:
            resource.filter.cidrRanges[:] = []
        elif args.add_filter_cidr_ranges:
            resource.filter.cidrRanges.extend(args.add_filter_cidr_ranges)
        elif args.set_filter_cidr_ranges:
            resource.filter.cidrRanges[:] = args.set_filter_cidr_ranges
        elif args.remove_filter_cidr_ranges:
            for cidr in args.remove_filter_cidr_ranges:
                if cidr not in resource.filter.cidrRanges:
                    raise exceptions.InvalidArgumentException(
                        'CIDR Range %s not found in this packet mirroring.' %
                        cidr)
            resource.filter.cidrRanges[:] = [
                x for x in resource.filter.cidrRanges
                if x not in args.remove_filter_cidr_ranges
            ]

        if self.enable_filter_direction and args.filter_direction:
            resource.filter.direction = messages.PacketMirroringFilter.DirectionValueValuesEnum(
                args.filter_direction.upper())