[sdk/python] Add a smoke test for output deps (#8113)

Ensure that output property dependencies are deserialized and translated
properly.

Fixes #7444.

Co-authored-by: Justin Van Patten <jvp@justinvp.com>
This commit is contained in:
Pat Gavlin 2021-10-02 09:06:11 -07:00 committed by GitHub
parent 33953c0a6b
commit 4eec3b7e1b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 117 additions and 1 deletions

View file

@ -0,0 +1,13 @@
# Copyright 2016-2021, Pulumi Corporation.
#
# 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.

View file

@ -0,0 +1,44 @@
# Copyright 2016-2021, Pulumi Corporation.
#
# 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.
import pulumi
from typing import Optional
@pulumi.input_type
class MyResourceArgs:
def __init__(__self__, *, in_prop: Optional[pulumi.Input[str]] = None):
if in_prop is not None:
pulumi.set(__self__, "in_prop", in_prop)
@property
@pulumi.getter(name="inProp")
def in_prop(self) -> Optional[pulumi.Input[str]]:
return pulumi.get(self, "in_prop")
@in_prop.setter
def in_prop(self, value: pulumi.Input[str]):
pulumi.set(self, "in_prop")
class MyResource(pulumi.ComponentResource):
@property
@pulumi.getter(name="outProp")
def out_prop(self) -> pulumi.Output[str]:
return pulumi.get(self, "out_prop")
def __init__(self, name, args, opts=None):
args.__dict__["out_prop"] = None
pulumi.ComponentResource.__init__(self, "test:index:MyResource", name, props=args, opts=opts, remote=True)
resA = MyResource("resA", MyResourceArgs())
# resB is not registered, but is used as a dependency of A's output property
resC = MyResource("resC", MyResourceArgs(in_prop=resA.out_prop))

View file

@ -0,0 +1,52 @@
# Copyright 2016-2021, Pulumi Corporation.
#
# 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.
from os import path
import unittest
from ..util import LanghostTest
# This test ensures that output property dependencies are deserialized and names translated appropriately.
class OutputPropertyDependenciesTest(LanghostTest):
def test_output_property_dependencies(self):
self.run_test(
program=path.join(self.base_path(), "output_property_dependencies"),
expected_resource_count=2)
def register_resource(self, _ctx, _dry_run, ty, name, _resource, _dependencies, _parent, _custom, protect,
_provider, _property_deps, _delete_before_replace, _ignore_changes, _version, _import,
_replace_on_changes):
self.assertEqual(ty, "test:index:MyResource")
if name == "resA":
return {
"urn": name,
"id": name,
"object": {
"outProp": "qux",
},
"propertyDependencies": {
"outProp": ["resB"],
},
}
elif name == "resC":
self.assertListEqual(_dependencies, [ "resA", "resB" ], msg=f"{name}._dependencies")
self.assertDictEqual(_property_deps, {
"inProp": [ "resA", "resB" ],
}, msg=f"{name}._property_deps")
return {
"urn": name,
"id": name,
"object": {
"outProp": "qux",
},
}

View file

@ -135,8 +135,15 @@ class LanghostMockResourceMonitor(proto.ResourceMonitorServicer):
loop.close()
else:
obj_proto = None
output_property_dependencies = None
if "propertyDependencies" in outs:
output_property_dependencies = {}
for key, urns in outs["propertyDependencies"].items():
output_property_dependencies[key] = proto.RegisterResourceResponse.PropertyDependencies(urns=urns)
return proto.RegisterResourceResponse(
urn=outs.get("urn"), id=outs.get("id"), object=obj_proto)
urn=outs.get("urn"), id=outs.get("id"), object=obj_proto, propertyDependencies=output_property_dependencies)
def RegisterResourceOutputs(self, request, context):
urn = request.urn