[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:
parent
33953c0a6b
commit
4eec3b7e1b
|
@ -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.
|
|
@ -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))
|
|
@ -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",
|
||||
},
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue