diff --git a/modules/cloud-function/README.md b/modules/cloud-function/README.md index d6edb666..4983f27f 100644 --- a/modules/cloud-function/README.md +++ b/modules/cloud-function/README.md @@ -218,6 +218,35 @@ module "cf-http" { } } # tftest modules=1 resources=2 +``` + +### Multiple Cloud Functions within project + +When deploying multiple functions do not reuse `bundle_config.output_path` between instances as the result is undefined. Default `output_path` creates file in `/tmp` folder using project Id and function name to avoid name conflicts. + +```hcl +module "cf-http-one" { + source = "./fabric/modules/cloud-function" + project_id = "my-project" + name = "test-cf-http-one" + bucket_name = "test-cf-bundles" + bundle_config = { + source_dir = "fabric/assets" + } +} + +module "cf-http-two" { + source = "./fabric/modules/cloud-function" + project_id = "my-project" + name = "test-cf-http-two" + bucket_name = "test-cf-bundles" + bundle_config = { + source_dir = "fabric/assets" + } +} +# tftest modules=2 resources=4 inventory=multiple_functions.yaml + + ``` diff --git a/tests/modules/cloud_function/examples/multiple_functions.yaml b/tests/modules/cloud_function/examples/multiple_functions.yaml new file mode 100644 index 00000000..b9956db5 --- /dev/null +++ b/tests/modules/cloud_function/examples/multiple_functions.yaml @@ -0,0 +1,25 @@ +# Copyright 2023 Google LLC +# +# 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. + +values: + module.cf-http-one.google_storage_bucket_object.bundle: + source: /tmp/bundle-my-project-test-cf-http-one.zip + module.cf-http-two.google_storage_bucket_object.bundle: + source: /tmp/bundle-my-project-test-cf-http-two.zip + +counts: + google_cloudfunctions_function: 2 + google_storage_bucket_object: 2 + modules: 2 + resources: 4 diff --git a/tests/modules/cloud_function/fixture/main.tf b/tests/modules/cloud_function/fixture/main.tf index e9021610..0096159f 100644 --- a/tests/modules/cloud_function/fixture/main.tf +++ b/tests/modules/cloud_function/fixture/main.tf @@ -15,15 +15,15 @@ */ module "test" { - count = var.instance_count source = "../../../../modules/cloud-function" project_id = "my-project" - name = "test_${count.index}" + name = "test" bucket_name = var.bucket_name v2 = var.v2 bundle_config = { - source_dir = "bundle" - excludes = null + source_dir = "bundle" + output_path = "bundle.zip" + excludes = null } iam = { "roles/cloudfunctions.invoker" = ["allUsers"] diff --git a/tests/modules/cloud_function/fixture/variables.tf b/tests/modules/cloud_function/fixture/variables.tf index fe97d9f8..19238627 100644 --- a/tests/modules/cloud_function/fixture/variables.tf +++ b/tests/modules/cloud_function/fixture/variables.tf @@ -19,11 +19,6 @@ variable "bucket_name" { default = "test" } -variable "instance_count" { - type = number - default = 1 -} - variable "v2" { type = any default = false diff --git a/tests/modules/cloud_function/test_plan.py b/tests/modules/cloud_function/test_plan.py index 940438ae..019d69ce 100644 --- a/tests/modules/cloud_function/test_plan.py +++ b/tests/modules/cloud_function/test_plan.py @@ -22,12 +22,6 @@ def resources(plan_runner, version): _, resources = plan_runner(v2=v2) return resources -@pytest.fixture -def plan(plan_runner, version, count): - v2 = {'v1': 'false', 'v2': 'true'}[version] - plan, _ = plan_runner(v2=v2, instance_count=count) - return plan - @pytest.mark.parametrize('version', ['v1', 'v2']) def test_resource_count(resources): @@ -48,19 +42,3 @@ def test_iam(resources, version): assert len(bindings) == 1 assert bindings[0]['role'] == 'roles/cloudfunctions.invoker' assert bindings[0]['members'] == ['allUsers'] - - -@pytest.mark.parametrize('version', ['v1', 'v2']) -@pytest.mark.parametrize('count', [2]) -def test_multiple_functions(plan, version, count): - """Tests whether multiple use of functions result in use of multiple bundle files""" - - # data objects are only accessible in prior_state of the plan, they are not present in root_module - archives = [ - resource for child_module in plan['prior_state']["values"]["root_module"]["child_modules"] - for resource in child_module["resources"] - if resource["type"] == "archive_file" - ] - file_names = set([x["values"]["output_path"] for x in archives]) - - assert len(archives) == len(file_names)