prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  GCP: Firewalls resource policy fails with no resource attribute 'Firewall'
  When running this policy custodian fails: 
  
  - policies:
    - name: firewall-test
      resource: gcp.firewall
  
  The error returned is:
  AttributeError: 'Resource' object has no attribute 'firewall'
  
  </issue>
  <code>
  [start of tools/c7n_gcp/c7n_gcp/resources/network.py]
  1 # Copyright 2018 Capital One Services, LLC
  2 #
  3 # Licensed under the Apache License, Version 2.0 (the "License");
  4 # you may not use this file except in compliance with the License.
  5 # You may obtain a copy of the License at
  6 #
  7 # http://www.apache.org/licenses/LICENSE-2.0
  8 #
  9 # Unless required by applicable law or agreed to in writing, software
  10 # distributed under the License is distributed on an "AS IS" BASIS,
  11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12 # See the License for the specific language governing permissions and
  13 # limitations under the License.
  14 from c7n_gcp.query import QueryResourceManager, TypeInfo
  15 
  16 from c7n_gcp.provider import resources
  17 
  18 
  19 @resources.register('vpc')
  20 class Network(QueryResourceManager):
  21 
  22     class resource_type(TypeInfo):
  23         service = 'compute'
  24         version = 'v1'
  25         component = 'networks'
  26         scope_template = "projects/{}/global/networks"
  27 
  28 
  29 @resources.register('subnet')
  30 class Subnet(QueryResourceManager):
  31 
  32     class resource_type(TypeInfo):
  33         service = 'compute'
  34         version = 'v1'
  35         component = 'networks'
  36         enum_spec = ('aggregatedList', 'items.*.subnetworks[]', None)
  37         scope_template = "projects/{}/aggregated/subnetworks"
  38 
  39 
  40 @resources.register('firewall')
  41 class Firewall(QueryResourceManager):
  42 
  43     class resource_type(TypeInfo):
  44         service = 'compute'
  45         version = 'v1'
  46         component = 'firewall'
  47         scope_template = "projects/{}/global/firewalls"
  48 
  49 
  50 @resources.register('router')
  51 class Router(QueryResourceManager):
  52 
  53     class resource_type(TypeInfo):
  54         service = 'compute'
  55         version = 'v1'
  56         component = 'routers'
  57         enum_spec = ('aggregatedList', 'items.*.routers[]', None)
  58         scope_template = "projects/{}/aggregated/routers"
  59 
  60 
  61 @resources.register('route')
  62 class Route(QueryResourceManager):
  63 
  64     class resource_type(TypeInfo):
  65         service = 'compute'
  66         version = 'v1'
  67         component = 'routes'
  68         scope_template = "projects/{}/global/routes"
  69
  [end of tools/c7n_gcp/c7n_gcp/resources/network.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/tools/c7n_gcp/c7n_gcp/resources/network.py b/tools/c7n_gcp/c7n_gcp/resources/network.py
  --- a/tools/c7n_gcp/c7n_gcp/resources/network.py
  +++ b/tools/c7n_gcp/c7n_gcp/resources/network.py
  @@ -43,8 +43,7 @@
       class resource_type(TypeInfo):
           service = 'compute'
           version = 'v1'
  -        component = 'firewall'
  -        scope_template = "projects/{}/global/firewalls"
  +        component = 'firewalls'
   
   
   @resources.register('router')
  
verification_info: {"golden_diff": "diff --git a/tools/c7n_gcp/c7n_gcp/resources/network.py b/tools/c7n_gcp/c7n_gcp/resources/network.py\n--- a/tools/c7n_gcp/c7n_gcp/resources/network.py\n+++ b/tools/c7n_gcp/c7n_gcp/resources/network.py\n@@ -43,8 +43,7 @@\n     class resource_type(TypeInfo):\n         service = 'compute'\n         version = 'v1'\n-        component = 'firewall'\n-        scope_template = \"projects/{}/global/firewalls\"\n+        component = 'firewalls'\n \n \n @resources.register('router')\n", "issue": "GCP: Firewalls resource policy fails with no resource attribute 'Firewall'\nWhen running this policy custodian fails: \r\n\r\n- policies:\r\n  - name: firewall-test\r\n    resource: gcp.firewall\r\n\r\nThe error returned is:\r\nAttributeError: 'Resource' object has no attribute 'firewall'\n", "before_files": [{"content": "# Copyright 2018 Capital One Services, LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\nfrom c7n_gcp.query import QueryResourceManager, TypeInfo\n\nfrom c7n_gcp.provider import resources\n\n\n@resources.register('vpc')\nclass Network(QueryResourceManager):\n\n    class resource_type(TypeInfo):\n        service = 'compute'\n        version = 'v1'\n        component = 'networks'\n        scope_template = \"projects/{}/global/networks\"\n\n\n@resources.register('subnet')\nclass Subnet(QueryResourceManager):\n\n    class resource_type(TypeInfo):\n        service = 'compute'\n        version = 'v1'\n        component = 'networks'\n        enum_spec = ('aggregatedList', 'items.*.subnetworks[]', None)\n        scope_template = \"projects/{}/aggregated/subnetworks\"\n\n\n@resources.register('firewall')\nclass Firewall(QueryResourceManager):\n\n    class resource_type(TypeInfo):\n        service = 'compute'\n        version = 'v1'\n        component = 'firewall'\n        scope_template = \"projects/{}/global/firewalls\"\n\n\n@resources.register('router')\nclass Router(QueryResourceManager):\n\n    class resource_type(TypeInfo):\n        service = 'compute'\n        version = 'v1'\n        component = 'routers'\n        enum_spec = ('aggregatedList', 'items.*.routers[]', None)\n        scope_template = \"projects/{}/aggregated/routers\"\n\n\n@resources.register('route')\nclass Route(QueryResourceManager):\n\n    class resource_type(TypeInfo):\n        service = 'compute'\n        version = 'v1'\n        component = 'routes'\n        scope_template = \"projects/{}/global/routes\"\n", "path": "tools/c7n_gcp/c7n_gcp/resources/network.py"}]}