Maison  >  Article  >  développement back-end  >  Comment désorganiser une structure ou une carte d'objet Pulumi auto.Result

Comment désorganiser une structure ou une carte d'objet Pulumi auto.Result

WBOY
WBOYavant
2024-02-10 12:30:171214parcourir

如何解组 Pulumi auto.Result 对象结构或映射

L'éditeur php Xigua a expliqué comment désorganiser la structure ou le mappage de l'objet Pulumi auto.Result. Pulumi est un outil d'infrastructure en tant que code cross-cloud qui permet aux développeurs de définir et de gérer l'infrastructure cloud à l'aide de langages de programmation. Lors du développement avec Pulumi, vous rencontrez souvent des objets auto.Result, qui contiennent souvent plusieurs propriétés et structures imbriquées. Cet article explique comment désorganiser un objet Result et le mapper à une structure de données plus conviviale pour faciliter le traitement et la manipulation des données.

Contenu de la question

J'utilise l'API d'automatisation de pulumi pour déployer un serveur sur hetzner, mais je ne sais pas comment obtenir les informations de connexion générées à partir des résultats du déploiement.

Voici le code tronqué :

import (
    ...

    "github.com/pulumi/pulumi-command/sdk/go/command/remote"
    "github.com/pulumi/pulumi/sdk/v3/go/auto"
    "github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

...

deployfunc := func(ctx *pulumi.context) error {
        // create ssh key pair, upload them to hetzner, get back a `*hcloud.sshkey`
        ...
        
        // `server` is a *hcloud.server object
        server, _ := deployservertohetzner(ctx, sshkey)

        // this is the info i want to retrieve from the result
        connectinfo := remote.connectionargs{
            host:       server.ipv4address,
            port:       pulumi.float64(22),
            user:       pulumi.string("root"),
            privatekey: sshkeypair.private,
        }

        ctx.export("server-connect-info", connectinfo)

        return nil
    }

stack, _ := auto.upsertstackinlinesource(ctx, stackname, projectname, deployfunc, opts...)

res, _ := stack.up(ctx)

// this is a string but i need it as either map or struct
serverconnectinfo := fmt.sprintf("%v", res.outputs["server-connect-info"].value)

J'ai pu l'obtenir auprès de res.outputs 检索结果,但它是一个字符串。我知道服务器部署和带有连接详细信息的响应是成功的,因为当我登录 serverconnectinfo alors que cela ressemblait à ceci :

serverconnectinfo map[host:123.456.789.10 port:22 privatekey:-----begin openssh private key-----
b3blbnnza...
-----end openssh private key-----
user:root]

Sur la base de solutions douteuses en ligne, j'ai essayé de le rassembler comme json, puis de le désorganiser dans une instance pulumi remote.connectionargs. Cela ne fonctionne évidemment pas car la structure ressemble à ceci :

// From https://pkg.go.dev/github.com/pulumi/pulumi-command/[email protected]/go/command/remote#ConnectionArgs

type ConnectionArgs struct {
    ...
    Host pulumi.StringInput `pulumi:"host"`
    Port pulumi.Float64PtrInput `pulumi:"port"`
    PrivateKey pulumi.StringPtrInput `pulumi:"privateKey"`
    User pulumi.StringPtrInput `pulumi:"user"`
}

Je pensais créer ma propre structure et réessayer la solution de démarshalage et de marshaling json, mais il semble que si connectionargs 结构已经具有 pulumi 标签,则应该在某处存在某种 pulumi.unmarshal c'est la voie à suivre. ai-je tort? Quoi qu'il en soit, je ne l'ai pas trouvé.

J'ai également regardé la documentation mais je n'ai rien vu d'utile. Peut-être ai-je raté une page ?

Solution de contournement

Comme Peter l'a souligné dans les commentaires, res.outputs["server-connect-info"].value 是一个映射,并且正确地猜测我通过 fmt.sprintf exécutez-le. Comme j'étais stupide.

Ça marche :

serverconnectinfo := res.outputs["server-connect-info"].value.(map[string]interface{})

Fonctionne également très bien avec les tests Go à l'aide du package de test intégré :

assert.NotEmpty(t, serverConnectInfo["host"])
assert.Equal(t, serverConnectInfo["user"], "root")

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer