sparse-intern-71089
02/08/2022, 2:33 PMbored-table-20691
02/08/2022, 3:16 PMlate-energy-66663
02/08/2022, 6:15 PMMachine 1
hostname: <http://ec2-15-161-152-141.eu-south-1.compute.amazonaws.com|ec2-15-161-152-141.eu-south-1.compute.amazonaws.com>
Public ip : 15.161.152.141
Machine2
hostname: <http://ec2-15-160-154-234.eu-south-1.compute.amazonaws.com|ec2-15-160-154-234.eu-south-1.compute.amazonaws.com>
Public ip : 15.160.154.234
bored-table-20691
02/08/2022, 6:28 PMctx.Export("machine-1-hostname", ...)
ctx.Export("machine-1-public-ip", ...)
ctx.Export("machine-2-hostname", ...)
ctx.Export("machine-2-public-ip", ...)
bored-table-20691
02/08/2022, 6:28 PMlate-energy-66663
02/08/2022, 6:42 PMfor k, v := range nodeList {
ctx.Export("publicIp"+strconv.Itoa(k), v.PublicIp)
ctx.Export("publicHostName"+strconv.Itoa(k), v.PublicDns)
late-energy-66663
02/08/2022, 6:45 PM{
Machine 1: {
hostname: <http://ec2-15-161-152-141.eu-south-1.compute.amazonaws.com|ec2-15-161-152-141.eu-south-1.compute.amazonaws.com>
Public ip : 15.161.152.141
}
},
{
Machine 2: {
hostname: <http://ec2-15-161-152-142.eu-south-1.compute.amazonaws.com|ec2-15-161-152-142.eu-south-1.compute.amazonaws.com>
Public ip : 15.161.152.142
}
}
bored-table-20691
02/08/2022, 6:48 PMlate-energy-66663
02/08/2022, 6:49 PMbored-table-20691
02/08/2022, 7:02 PMvar nodeList []*ec2.Instance
...
var ips []pulumi.StringOutput
var dns []pulumi.StringOutput
for _, node := range nodeList {
ips = append(ips, node.PublicIp)
dns = append(ips, node.PublicDns)
}
jsonOut := pulumi.All(ips..., dns...).ApplyT(func (args []interface{}) (string, error) {
length := len(args) / 2
var output []map[string]string
for idx, _ := range args {
ip := args[idx].(string)
dns := args[idx+length].(string)
output = append(output, map[string]string{
"ip": ip,
"dns": dns,
}
}
outputBytes, err := json.Marshal(output)
if err != nil {
return nil, err
}
return string(outputBytes), nil
})
ctx.Export("machine-info", jsonOut)
late-energy-66663
02/08/2022, 7:14 PMlate-energy-66663
02/13/2022, 11:44 PMpanic: interface conversion: interface {} is []pulumi.StringOutput, not string
goroutine 160 [running]:
late-energy-66663
02/14/2022, 1:18 AMbored-table-20691
02/14/2022, 4:15 AMlate-energy-66663
02/14/2022, 3:00 PMfunc NewVirtualMachine(ctx *pulumi.Context, name string, args *virtualmachines.VirtualMachinesArgs, opts ...pulumi.ResourceOption) (*virtualmachines.VirtualMachines, error) {
vm := &virtualmachines.VirtualMachines{}
err := ctx.RegisterComponentResource("virtual_machine", name, vm, opts...)
if err != nil {
return nil, err
}
stackName := ctx.Stack()
// Create a valid webserver security group
vm.SecurityGroup, err = ec2.NewSecurityGroup(ctx, "web-secgrp", &ec2.SecurityGroupArgs{
Ingress: ec2.SecurityGroupIngressArray{
ec2.SecurityGroupIngressArgs{
//Protocol: pulumi.String("tcp"),
Protocol: args.Protocol,
FromPort: <http://pulumi.Int|pulumi.Int>(80),
ToPort: <http://pulumi.Int|pulumi.Int>(80),
CidrBlocks: pulumi.StringArray{pulumi.String("0.0.0.0/0")},
},
},
})
if err != nil {
return nil, err
}
userData := pulumi.Sprintf(`#!/bin/bash
echo "Hello from stack %s" > index.html
nohup python -m SimpleHTTPServer 80 &`, stackName)
deployer, err := ec2.NewKeyPair(ctx, "deployer", &ec2.KeyPairArgs{
PublicKey: pulumi.String("ssh-rsa-key "),
})
if err != nil {
return nil, err
}
var nodeList []*ec2.Instance
var ips []pulumi.StringOutput
var dns []pulumi.StringOutput
for i := 1; i <= args.NumberOfNodes; i++ {
name := fmt.Sprintf("Machine-%d", i)
vm.Instance, err = ec2.NewInstance(ctx, name, &ec2.InstanceArgs{
Tags: pulumi.StringMap{"Name": pulumi.String(fmt.Sprintf("Machine-%d", i))},
//InstanceType: pulumi.String("t3.large"),
InstanceType: args.InstanceType,
VpcSecurityGroupIds: pulumi.StringArray{vm.SecurityGroup.ID()},
Ami: pulumi.String("ami-0f8ce9c417115413d"),
UserData: userData,
KeyName: deployer.KeyName,
})
if err != nil {
panic("error creating ec2 instance")
}
nodeList = append(nodeList, vm.Instance)
for _, node := range nodeList {
ips = append(ips, node.PublicIp)
dns = append(dns, node.PublicDns)
}
}
jsonOut := pulumi.All(ips, dns).ApplyT(func(args []interface{}) (string, error) {
length := len(args) / 2
var output []map[string]string
for idx, _ := range args {
ip := args[idx].(string)
dns := args[idx+length].(string)
output = append(output, map[string]string{
"ip": ip,
"dns": dns,
})
}
outputBytes, err := json.Marshal(output)
if err != nil {
return fmt.Sprintf("Not able to create json"), err
}
fmt.Println(string(outputBytes))
return string(outputBytes), nil
})
ctx.Export("machine-info", jsonOut)
return vm, nil
}
Get Deploy Function :
unc (v *virtualMachinesService) GetDeployVMFunc(vm *virtualmachines.CreateVmReq) pulumi.RunFunc {
return func(ctx *pulumi.Context) error {
fmt.Println(vm.Protocol)
_, err := NewVirtualMachine(ctx, "ec2-vms", &virtualmachines.VirtualMachinesArgs{
Protocol: pulumi.String(vm.Protocol),
NumberOfNodes: vm.NumberOfNodes,
InstanceType: pulumi.String(vm.InstanceType),
})
if err != nil {
return err
}
return nil
}
}
Deploy function :
// set out program for the deployment with the resulting network info
w.SetProgram(VirtualMachinesService.GetDeployVMFunc(vm))
fmt.Println("deploying vm webserver...")
// wire up our update to stream progress to stdout
stdoutStreamer := optup.ProgressStreams(os.Stdout)
res, err := s.Up(ctx, stdoutStreamer)
if err != nil {
fmt.Printf("Failed to deploy vm stack: %v\n", err)
os.Exit(1)
}
//time.Sleep(60 * time.Second)
for key, element := range res.Outputs {
fmt.Println("key", key, "=>", element.Value)
}
fmt.Println("Update succeeded!")
late-energy-66663
02/14/2022, 3:03 PMtype VirtualMachines struct {
pulumi.ResourceState
PublicIP *ec2.Eip `pulumi:"publicip"`
NetworkInterface *ec2.NetworkInterface
VPC *ec2.Vpc
Instance *ec2.Instance `pulumi:"instance"`
Internet_gateway *ec2.InternetGateway
Route *ec2.Route
GetAvailabilityZones *ec2.AvailabilityZoneGroup
Subnet *ec2.Subnet
SecurityGroup *ec2.SecurityGroup
}
late-energy-66663
02/14/2022, 3:05 PMjsonOut := pulumi.All(ips, dns).ApplyT(func(args []interface{}) (string, error) {
Error:
panic: interface conversion: interface {} is []pulumi.StringOutput, not string
goroutine 160 [running]
bored-table-20691
02/14/2022, 4:58 PMApplyT
function?late-energy-66663
02/14/2022, 5:53 PM+ pulumi:pulumi:Stack prod-prod-dev creating
+ virtual_machine ec2-vms creating
+ aws:ec2:KeyPair deployer creating
+ aws:ec2:SecurityGroup web-secgrp creating
+ aws:ec2:KeyPair deployer created
+ aws:ec2:SecurityGroup web-secgrp created
+ aws:ec2:Instance Machine-1 creating
+ aws:ec2:Instance Machine-2 creating
+ aws:ec2:Instance Machine-3 creating
+ aws:ec2:Instance Machine-2 created
+ aws:ec2:Instance Machine-3 created
+ aws:ec2:Instance Machine-1 created
panic: interface conversion: interface {} is []pulumi.StringOutput, not string
goroutine 213 [running]:
<http://github.com/services.NewVirtualMachine.func1(0xc0001acce0|github.com/services.NewVirtualMachine.func1(0xc0001acce0>, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0)
Documents/github.com/services/virtual_machines.go:208 +0x489
reflect.Value.call(0x2869700, 0x2d3f6a8, 0x13, 0x2cda1e6, 0x4, 0xc000ec4348, 0x1, 0x1, 0x1010f7b, 0xc000081a28, ...)
/usr/local/go/src/reflect/value.go:476 +0x8e7
reflect.Value.Call(0x2869700, 0x2d3f6a8, 0x13, 0xc000ec4348, 0x1, 0x1, 0x2749b40, 0xc000eba888, 0xc000081b90)
/usr/local/go/src/reflect/value.go:337 +0xb9
<http://github.com/pulumi/pulumi/sdk/v3/go/pulumi.makeContextful.func1(0xc000ec4330|github.com/pulumi/pulumi/sdk/v3/go/pulumi.makeContextful.func1(0xc000ec4330>, 0x2, 0x2, 0xc000ec4330, 0x2a6ec0, 0x2842ea0)
/Users/go/pkg/mod/github.com/pulumi/pulumi/sdk/v3@v3.19.0/go/pulumi/types.go:362 +0x7c
reflect.Value.call(0xc000dbc300, 0xc000c63b90, 0x13, 0x2cda1e6, 0x4, 0xc000081f60, 0x2, 0x2, 0x296c2a0, 0x2749b40, ...)
/usr/local/go/src/reflect/value.go:476 +0x8e7
reflect.Value.Call(0xc000dbc300, 0xc000c63b90, 0x13, 0xc000d31760, 0x2, 0x2, 0xc000ec4300, 0x3, 0x3)
/usr/local/go/src/reflect/value.go:337 +0xb9
<http://github.com/pulumi/pulumi/sdk/v3/go/pulumi.(*OutputState).ApplyTWithContext.func1(0xc0007fa690|github.com/pulumi/pulumi/sdk/v3/go/pulumi.(*OutputState).ApplyTWithContext.func1(0xc0007fa690>, 0x30297d8, 0xc0001b4050, 0x3043708, 0xc0007fa700, 0xc000dbc300, 0xc000c63b90, 0x13)
/Users/go/pkg/mod/github.com/pulumi/pulumi/sdk/v3@v3.19.0/go/pulumi/types.go:470 +0x2f1
created by <http://github.com/pulumi/pulumi/sdk/v3/go/pulumi.(*OutputState).ApplyTWithContext|github.com/pulumi/pulumi/sdk/v3/go/pulumi.(*OutputState).ApplyTWithContext>
/Users/go/pkg/mod/github.com/pulumi/pulumi/sdk/v3@v3.19.0/go/pulumi/types.go:458 +0x1f6
exit status 2
late-energy-66663
02/14/2022, 5:53 PMbored-table-20691
02/14/2022, 5:53 PMDocuments/github.com/services/virtual_machines.go:208
This line, which line is it? And can you share the full function for ApplyT
?late-energy-66663
02/14/2022, 5:57 PMvirtual_machines.go
file have all the function I mentioned in the above commentslate-energy-66663
02/14/2022, 5:57 PMbored-table-20691
02/14/2022, 5:57 PMlate-energy-66663
02/14/2022, 5:57 PMfunc NewVirtualMachine(ctx *pulumi.Context, name string, args *virtualmachines.VirtualMachinesArgs, opts ...pulumi.ResourceOption) (*virtualmachines.VirtualMachines, error) {
vm := &virtualmachines.VirtualMachines{}
err := ctx.RegisterComponentResource("virtual_machine", name, vm, opts...)
if err != nil {
return nil, err
}
stackName := ctx.Stack()
// Create a valid webserver security group
vm.SecurityGroup, err = ec2.NewSecurityGroup(ctx, "web-secgrp", &ec2.SecurityGroupArgs{
Ingress: ec2.SecurityGroupIngressArray{
ec2.SecurityGroupIngressArgs{
//Protocol: pulumi.String("tcp"),
Protocol: args.Protocol,
FromPort: <http://pulumi.Int|pulumi.Int>(80),
ToPort: <http://pulumi.Int|pulumi.Int>(80),
CidrBlocks: pulumi.StringArray{pulumi.String("0.0.0.0/0")},
},
},
})
if err != nil {
return nil, err
}
userData := pulumi.Sprintf(`#!/bin/bash
echo "Hello from stack %s" > index.html
nohup python -m SimpleHTTPServer 80 &`, stackName)
deployer, err := ec2.NewKeyPair(ctx, "deployer", &ec2.KeyPairArgs{
PublicKey: pulumi.String("ssh-rsa-key "),
})
if err != nil {
return nil, err
}
var nodeList []*ec2.Instance
var ips []pulumi.StringOutput
var dns []pulumi.StringOutput
for i := 1; i <= args.NumberOfNodes; i++ {
name := fmt.Sprintf("Machine-%d", i)
vm.Instance, err = ec2.NewInstance(ctx, name, &ec2.InstanceArgs{
Tags: pulumi.StringMap{"Name": pulumi.String(fmt.Sprintf("Machine-%d", i))},
//InstanceType: pulumi.String("t3.large"),
InstanceType: args.InstanceType,
VpcSecurityGroupIds: pulumi.StringArray{vm.SecurityGroup.ID()},
Ami: pulumi.String("ami-0f8ce9c417115413d"),
UserData: userData,
KeyName: deployer.KeyName,
})
if err != nil {
panic("error creating ec2 instance")
}
nodeList = append(nodeList, vm.Instance)
for _, node := range nodeList {
ips = append(ips, node.PublicIp)
dns = append(dns, node.PublicDns)
}
}
jsonOut := pulumi.All(ips, dns).ApplyT(func(args []interface{}) (string, error) {
length := len(args) / 2
var output []map[string]string
for idx, _ := range args {
ip := args[idx].(string)
dns := args[idx+length].(string)
output = append(output, map[string]string{
"ip": ip,
"dns": dns,
})
}
outputBytes, err := json.Marshal(output)
if err != nil {
return fmt.Sprintf("Not able to create json"), err
}
fmt.Println(string(outputBytes))
return string(outputBytes), nil
})
ctx.Export("machine-info", jsonOut)
return vm, nil
}
bored-table-20691
02/14/2022, 5:57 PMlate-energy-66663
02/14/2022, 5:58 PMfor idx, _ := range args {
ip := args[idx].(string)
dns := args[idx+length].(string)
output = append(output, map[string]string{
"ip": ip,
"dns": dns,
})
}
late-energy-66663
02/14/2022, 5:59 PMip := args[idx].(string)
bored-table-20691
02/14/2022, 5:59 PMbored-table-20691
02/14/2022, 6:31 PMoutputs := []pulumi.StringOutput
for _, node := range nodeList {
outputs = append(outputs, node.PublicIp, node.PublicDns)
}
jsonOut := pulumi.All(outputs...).ApplyT(func(args []interface{}) (string, error) {
length := len(args)
for idx := 0; idx < length; idx += 2 {
ip := args[idx].(string)
dns := args[idx+1].(string)
output = append(output, map[string]string{
"ip": ip,
"dns": dns,
})
}
outputBytes, err := json.Marshal(output)
if err != nil {
return fmt.Sprintf("Not able to create json"), err
}
fmt.Println(string(outputBytes))
return string(outputBytes), nil
})
ctx.Export("machine-info", jsonOut)
return vm, nil
}
late-energy-66663
02/14/2022, 7:06 PMfor _, nodes := range nodeList {
jsonout := pulumi.All(nodes.PublicIp, nodes.PublicDns).ApplyT(func(args []interface{}) (string, error) {
var output []map[string]string
ip := args[0].(string)
dns := args[1].(string)
output = append(output, map[string]string{
"ip": ip,
"dns": dns,
})
outputBytes, err := json.Marshal(output)
if err != nil {
return fmt.Sprintf("Not able to create json"), err
}
return string(outputBytes), nil
})
// fmt.Println(jsonout)
ctx.Export("machine-info", jsonout)
}
late-energy-66663
02/14/2022, 7:06 PMbored-table-20691
02/14/2022, 7:10 PMlate-energy-66663
02/14/2022, 7:16 PMjsonOut := pulumi.All(outputs...).ApplyT(func(args []interface{}) (string, error) {
Cannot use ‘outputs’ (type []pulumi.StringOutput) as the type []interface{}late-energy-66663
02/14/2022, 7:16 PMbored-table-20691
02/14/2022, 7:17 PMoutputs := []interface{}{}
bored-table-20691
02/14/2022, 7:17 PMlate-energy-66663
02/14/2022, 7:17 PMbored-table-20691
02/14/2022, 7:18 PMpulumi.All
accepts a variable argument list, and will wait until they’re all resolved.
If you pass in just outputs
- then it waits for that value to be resolved (which it is, immediately, since it’s not a future). outputs…
passes each element as an argument, allowing you to wait for each one.late-energy-66663
02/14/2022, 7:18 PMlate-energy-66663
02/14/2022, 7:20 PMlate-energy-66663
02/14/2022, 7:21 PMctx.RegisterResourceOutputs(vm, pulumi.Map{
"PublicIP": vm.Instance.PublicIp,
late-energy-66663
02/14/2022, 7:22 PMctx.Export
, Cant we use ctx.RegisterResourceOutputs
and use the output some wherebored-table-20691
02/14/2022, 7:24 PMctx.Export
exports it as a stack output, so that other stacks can use it as stack references, or if you need some other automation otuside your stack to access it.bored-table-20691
02/14/2022, 7:25 PMRegisterResourceOutputs
call registers it as an output of a component resource.late-energy-66663
02/14/2022, 7:29 PMcall registers it as an output of a component resource
, so what impact it has on the program as wholebored-table-20691
02/14/2022, 7:29 PMlate-energy-66663
02/14/2022, 7:29 PMlate-energy-66663
02/14/2022, 7:30 PMbored-table-20691
02/14/2022, 7:31 PMlate-energy-66663
02/14/2022, 7:31 PMlate-energy-66663
02/14/2022, 7:43 PMctx.RegisterResourceOutputs(vm, pulumi.Map{
"PublicIP": vm.Instance.PublicIp,
}
bored-table-20691
02/14/2022, 7:43 PMlate-energy-66663
02/14/2022, 7:51 PM+ aws:ec2:Instance Machine-4 creating
+ aws:ec2:Instance Machine-4 created
+ aws:ec2:Instance Machine-5 created
[{"dns":"<http://ec2-15-161-190-245.eu-south-1.compute.amazonaws.com|ec2-15-161-190-245.eu-south-1.compute.amazonaws.com>","ip":"15.161.190.245"},{"dns":"<http://ec2-15-161-197-181.eu-south-1.compute.amazonaws.com|ec2-15-161-197-181.eu-south-1.compute.amazonaws.com>","ip":"15.161.197.181"},{"dns":"<http://ec2-15-161-107-21.eu-south-1.compute.amazonaws.com|ec2-15-161-107-21.eu-south-1.compute.amazonaws.com>","ip":"15.161.107.21"},{"dns":"<http://ec2-15-160-211-73.eu-south-1.compute.amazonaws.com|ec2-15-160-211-73.eu-south-1.compute.amazonaws.com>","ip":"15.160.211.73"},{"dns":"<http://ec2-15-161-228-178.eu-south-1.compute.amazonaws.com|ec2-15-161-228-178.eu-south-1.compute.amazonaws.com>","ip":"15.161.228.178"}]
virtual_machine ec2-vms
pulumi:pulumi:Stack prod-prod-dev
Outputs:
+ machine-info: "[{\"dns\":\"<http://ec2-15-161-190-245.eu-south-1.compute.amazonaws.com|ec2-15-161-190-245.eu-south-1.compute.amazonaws.com>\",\"ip\":\"15.161.190.245\"},{\"dns\":\"<http://ec2-15-161-197-181.eu-south-1.compute.amazonaws.com|ec2-15-161-197-181.eu-south-1.compute.amazonaws.com>\",\"ip\":\"15.161.197.181\"},{\"dns\":\"<http://ec2-15-161-107-21.eu-south-1.compute.amazonaws.com|ec2-15-161-107-21.eu-south-1.compute.amazonaws.com>\",\"ip\":\"15.161.107.21\"},{\"dns\":\"<http://ec2-15-160-211-73.eu-south-1.compute.amazonaws.com|ec2-15-160-211-73.eu-south-1.compute.amazonaws.com>\",\"ip\":\"15.160.211.73\"},{\"dns\":\"<http://ec2-15-161-228-178.eu-south-1.compute.amazonaws.com|ec2-15-161-228-178.eu-south-1.compute.amazonaws.com>\",\"ip\":\"15.161.228.178\"}]"
Resources:
+ 2 created
7 unchanged
Duration: 16s
key machine-info => [{"dns":"<http://ec2-15-161-190-245.eu-south-1.compute.amazonaws.com|ec2-15-161-190-245.eu-south-1.compute.amazonaws.com>","ip":"15.161.190.245"},{"dns":"<http://ec2-15-161-197-181.eu-south-1.compute.amazonaws.com|ec2-15-161-197-181.eu-south-1.compute.amazonaws.com>","ip":"15.161.197.181"},{"dns":"<http://ec2-15-161-107-21.eu-south-1.compute.amazonaws.com|ec2-15-161-107-21.eu-south-1.compute.amazonaws.com>","ip":"15.161.107.21"},{"dns":"<http://ec2-15-160-211-73.eu-south-1.compute.amazonaws.com|ec2-15-160-211-73.eu-south-1.compute.amazonaws.com>","ip":"15.160.211.73"},{"dns":"<http://ec2-15-161-228-178.eu-south-1.compute.amazonaws.com|ec2-15-161-228-178.eu-south-1.compute.amazonaws.com>","ip":"15.161.228.178"}]
Update succeeded!
bored-table-20691
02/14/2022, 7:55 PMlate-energy-66663
02/14/2022, 7:59 PMjsonOut
is of pulumi.Output . Can I use it directly to store value to some struct or do I have export it first which we did and can be seen on the outputbored-table-20691
02/14/2022, 8:01 PMlate-energy-66663
02/14/2022, 8:06 PMres, err := s.Up(ctx, stdoutStreamer)
if err != nil {
fmt.Printf("Failed to deploy vm stack: %v\n", err)
os.Exit(1)
}
//time.Sleep(60 * time.Second)
for key, element := range res.Outputs {
fmt.Println("key", key, "=>", element.Value)
}
bored-table-20691
02/14/2022, 8:09 PMbored-table-20691
02/14/2022, 8:09 PMpulumi stack output
late-energy-66663
02/14/2022, 8:12 PMlate-energy-66663
02/14/2022, 8:15 PMApplyT
output to some STRUCT which can then be use in the program like using the struct value to some other programs.
pulumi.All(outputs...).ApplyT(func(args []interface{}) (vm.struct
, error)
something like abovebored-table-20691
02/14/2022, 8:18 PMApplyT
will always be a future.late-energy-66663
02/14/2022, 8:18 PMlate-energy-66663
02/14/2022, 8:18 PMlate-energy-66663
02/19/2022, 4:05 AMctx.export
for i := 1; i <= 3; i++ {
name := fmt.Sprintf("Machine-%d", i)
vm.Instance, err = ec2.NewInstance(ctx, name, &ec2.InstanceArgs{
Tags: pulumi.StringMap{"Name": pulumi.String(fmt.Sprintf("Machine-%d", i))},
//InstanceType: pulumi.String("t3.large"),
InstanceType: args.InstanceType,
VpcSecurityGroupIds: pulumi.StringArray{vm.SecurityGroup.ID()},
Ami: pulumi.String("ami-0f8ce9c417115413d"),
UserData: userData,
KeyName: deployer.KeyName,
})
I have updated the code we discussed last week , adding the new slice which picks the name of the node and trying to append it to the output slice interface . But some how not getting the desired result where the name is also added as part of dns, ip . Just wondering where i am missing the trick . really Appreciate for the advise
nodeName = append(nodeName, pulumi.Sprintf(name))
nodeList = append(nodeList, vm.Instance)
}
//var outputs []pulumi.StringOutput
outputs := []interface{}{}
for _, names := range nodeName {
for _, node := range nodeList {
outputs = append(outputs, node.PublicIp, node.PublicDns, names)
}
}
jsonOut := pulumi.All(outputs...).ApplyT(func(args []interface{}) (string, error) {
length := len(args)
fmt.Println(length)
var output []map[string]string
for idx := 0; idx < length; idx += 3 {
ip := args[idx].(string)
dns := args[idx+1].(string)
name := args[idx+2].(string)
output = append(output, map[string]string{
"ip": ip,
"dns": dns,
"name": name,
})
}
outputBytes, err := json.Marshal(output)
if err != nil {
return fmt.Sprintf("Not able to create json"), err
}
fmt.Println(string(outputBytes))
return string(outputBytes), nil
})
ctx.Export("machine-info", jsonOut)
return vm, nil
}
bored-table-20691
02/22/2022, 1:58 PMnodeName
and nodeList
are the same length):
for idx, node := range nodeList {
outputs = append(outputs, node.PublicIp, node.PublicDns, nodeName[idx])
}
And then in the ApplyT
function, it would be similar to what you have in your code above.late-energy-66663
02/22/2022, 5:19 PM