This commit is contained in:
evanboyle 2020-01-23 19:29:11 -08:00
parent 567a515296
commit 03ec1f323c
2 changed files with 84 additions and 1 deletions

View file

@ -500,6 +500,7 @@ func makeResourceState(t string, resourceV Resource, providers map[string]Provid
var rs *ResourceState
var crs *CustomResourceState
var prs *ProviderResourceState
var srs *StackReferenceState
switch r := resourceV.(type) {
case *ResourceState:
@ -508,6 +509,8 @@ func makeResourceState(t string, resourceV Resource, providers map[string]Provid
crs = r
case *ProviderResourceState:
prs = r
case *StackReferenceState:
srs = r
}
state := &resourceState{outputs: map[string]Output{}}
@ -525,6 +528,8 @@ func makeResourceState(t string, resourceV Resource, providers map[string]Provid
crs = fieldV.Addr().Interface().(*CustomResourceState)
case field.Anonymous && field.Type == providerResourceStateType:
prs = fieldV.Addr().Interface().(*ProviderResourceState)
case field.Anonymous && field.Type == stackReferenceStateType:
srs = fieldV.Addr().Interface().(*StackReferenceState)
case field.Type.Implements(outputType):
tag := typ.Field(i).Tag.Get("pulumi")
if tag == "" {
@ -542,6 +547,11 @@ func makeResourceState(t string, resourceV Resource, providers map[string]Provid
prs.pkg = t[len("pulumi:providers:"):]
}
if srs != nil {
crs = &srs.CustomResourceState
}
if crs != nil {
rs = &crs.ResourceState
crs.id = IDOutput{newOutputState(idType, resourceV)}

View file

@ -14,7 +14,10 @@
package pulumi
import "reflect"
import (
"fmt"
"reflect"
)
type (
// ID is a unique identifier assigned by a resource provider to a resource.
@ -26,6 +29,7 @@ type (
var resourceStateType = reflect.TypeOf(ResourceState{})
var customResourceStateType = reflect.TypeOf(CustomResourceState{})
var providerResourceStateType = reflect.TypeOf(ProviderResourceState{})
var stackReferenceStateType = reflect.TypeOf(StackReferenceState{})
// ResourceState is the base
type ResourceState struct {
@ -70,6 +74,22 @@ func (s ProviderResourceState) getPackage() string {
return s.pkg
}
type StackReferenceState struct {
CustomResourceState
name StringOutput
outputs MapOutput
}
func (s StackReferenceState) GetOutput(name StringInput) StringOutput {
return All(name.ToStringOutput(), s.outputs).
ApplyT(func(args []interface{}) (string, error) {
n := args[0].(string)
outs := args[1].(map[string]string)
return outs[n], nil
}).(StringOutput)
}
// Resource represents a cloud resource managed by Pulumi.
type Resource interface {
// URN is this resource's stable logical URN used to distinctly address it before, during, and after deployments.
@ -109,6 +129,59 @@ type ProviderResource interface {
getPackage() string
}
// Manages a reference to a Pulumi stack. The referenced stack's outputs are available via its "outputs" property or
// the "output" method.
type StackReference interface {
CustomResource
GetOutput(name StringInput) StringOutput
}
type StackReferenceArgs struct {
Name StringInput
}
type stackReferenceInputs struct {
name StringInput
outputs MapOutput
}
func (*stackReferenceInputs) ElementType() reflect.Type {
return reflect.TypeOf((*stackReferenceInputs)(nil))
}
// NewStackReference creates a new stack reference that makes available outputs from the specified stack
func NewStackReference(ctx Context, name string, args *StackReferenceArgs, opts ...ResourceOption) StackReference {
var stack StringInput
if args != nil {
stack = args.Name
}
if stack == nil {
stack = String(name)
}
var o MapOutput
var stackRef StackReferenceState = StackReferenceState{
name: stack.ToStringOutput(),
outputs: o,
}
t := "pulumi:pulumi:StackReference"
id := stack.ToStringOutput().ApplyT(func(s string) (ID, error) { return ID(s), nil }).(IDOutput)
props := &stackReferenceInputs{
name: stack,
outputs: o,
}
err := ctx.ReadResource(t, name, id, props /*todo*/, &stackRef, opts...)
if err != nil {
fmt.Println(err)
}
return &stackRef
}
type CustomTimeouts struct {
Create string
Update string