HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/394/lib/googlecloudsdk/api_lib/app/api/appengine_firewall_api_client.py
# -*- coding: utf-8 -*- #
# Copyright 2017 Google LLC. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Functions for creating a client to talk to the App Engine Admin API."""

from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals

from apitools.base.py import list_pager
from googlecloudsdk.api_lib.app import util
from googlecloudsdk.api_lib.app.api import appengine_api_client_base as base
from googlecloudsdk.calliope import base as calliope_base


VERSION_MAP = {
    calliope_base.ReleaseTrack.GA: 'v1',
    calliope_base.ReleaseTrack.ALPHA: 'v1alpha',
    calliope_base.ReleaseTrack.BETA: 'v1beta'
}


def GetApiClientForTrack(release_track):
  api_version = VERSION_MAP[release_track]
  return AppengineFirewallApiClient.GetApiClient(api_version)


class AppengineFirewallApiClient(base.AppengineApiClientBase):
  """Client used by gcloud to communicate with the App Engine API."""

  def __init__(self, client):
    base.AppengineApiClientBase.__init__(self, client)

  def Create(self, priority, source_range, action, description):
    """Creates a firewall rule for the given application.

    Args:
      priority: int, the priority of the rule between [1, 2^31-1].
                The default rule may not be created, only updated.
      source_range: str, the ip address or range to take action on.
      action: firewall_rules_util.Action, optional action to take on matched
        addresses.
      description: str, an optional string description of the rule.

    Returns:
      The new firewall rule.
    """
    rule = self.messages.FirewallRule(
        priority=priority,
        action=action,
        description=description,
        sourceRange=source_range)

    request = self.messages.AppengineAppsFirewallIngressRulesCreateRequest(
        parent=self._FormatApp(), firewallRule=rule)

    return self.client.apps_firewall_ingressRules.Create(request)

  def Delete(self, resource):
    """Deletes a firewall rule for the given application.

    Args:
      resource: str, the resource path to the firewall rule.
    """
    request = self.messages.AppengineAppsFirewallIngressRulesDeleteRequest(
        name=resource.RelativeName())

    self.client.apps_firewall_ingressRules.Delete(request)

  def List(self, matching_address=None):
    """Lists all ingress firewall rules for the given application.

    Args:
      matching_address: str, an optional ip address to filter matching rules.

    Returns:
      A list of FirewallRule objects.
    """

    request = self.messages.AppengineAppsFirewallIngressRulesListRequest(
        parent=self._FormatApp(), matchingAddress=matching_address)

    return list_pager.YieldFromList(
        self.client.apps_firewall_ingressRules,
        request,
        field='ingressRules',
        batch_size_attribute='pageSize')

  def Get(self, resource):
    """Gets a firewall rule for the given application.

    Args:
      resource: str, the resource path to the firewall rule.

    Returns:
      A FirewallRule object.
    """
    request = self.messages.AppengineAppsFirewallIngressRulesGetRequest(
        name=resource.RelativeName())

    response = self.client.apps_firewall_ingressRules.Get(request)

    return response

  def Update(self,
             resource,
             priority,
             source_range=None,
             action=None,
             description=None):
    """Updates a firewall rule for the given application.

    Args:
      resource: str, the resource path to the firewall rule.
      priority: int, the priority of the rule.
      source_range: str, optional ip address or range to take action on.
      action: firewall_rules_util.Action, optional action to take on matched
        addresses.
      description: str, optional string description of the rule.

    Returns:
      The updated firewall rule.

    Raises:
      NoFieldsSpecifiedError: when no fields have been specified for the update.
    """

    mask_fields = []

    if action:
      mask_fields.append('action')
    if source_range:
      mask_fields.append('sourceRange')
    if description:
      mask_fields.append('description')

    rule = self.messages.FirewallRule(
        priority=priority,
        action=action,
        description=description,
        sourceRange=source_range)

    if not mask_fields:
      raise util.NoFieldsSpecifiedError()

    request = self.messages.AppengineAppsFirewallIngressRulesPatchRequest(
        name=resource.RelativeName(),
        firewallRule=rule,
        updateMask=','.join(mask_fields))

    return self.client.apps_firewall_ingressRules.Patch(request)