grafana / grafana-foundation-sdk

A set of tools, types and libraries for building and manipulating Grafana objects.
Apache License 2.0
25 stars 1 forks source link

New Examples: Pulumi! #146

Closed julienduchesne closed 1 month ago

julienduchesne commented 1 month ago

In this PR, the linux-node-overview dashboard is deployed to a Grafana instance using Pulumi in the three existing example languages

Changes to needed to make this happen:

Overview of what it looks like

All of these are runnable with:

$ pulumi install
$ pulumi up

Go


func main() {
    pulumi.Run(func(ctx *pulumi.Context) error {
        grafanaProvider, err := grafana.NewProvider(ctx, "grafana", &grafana.ProviderArgs{
            Auth: pulumi.String("admin:admin"),
            Url:  pulumi.String("http://localhost:3000"),
        })
        if err != nil {
            return err
        }

        sampleDashboard, err := linuxNodeOverview.Build()
        if err != nil {
            return err
        }

        dashboardJson, err := json.MarshalIndent(sampleDashboard, "", "  ")
        if err != nil {
            return err
        }

        pulumiDashboard, err := grafana.NewDashboard(ctx, *sampleDashboard.Uid, &grafana.DashboardArgs{
            ConfigJson: pulumi.String(dashboardJson),
        }, pulumi.Provider(grafanaProvider))
        if err != nil {
            return err
        }

        ctx.Export("dashboardUID", pulumiDashboard.Uid)

        return nil
    })
}

Python

from grafana_foundation_sdk.cog.encoder import JSONEncoder
import pulumiverse_grafana as grafana
import pulumi
import os
import sys

if __name__ == '__main__':
    # Hack to re-use other examples
    sys.path.append(os.path.join(os.path.dirname(__file__),
                    "..", '..', "python", "linux-node-overview"))
    from main import builder

    provider = grafana.Provider(
        'grafana', url='http://localhost:3000', auth='admin:admin')

    dashboard = builder.build()
    dashboard_json = JSONEncoder(
        sort_keys=True, indent=2).encode(dashboard)

    pulumi_dashboard = grafana.dashboard.Dashboard(dashboard.uid,
                                                   config_json=dashboard_json,
                                                   opts=pulumi.ResourceOptions(providers=[provider]))

    # Export the Name of the repository
    pulumi.export('dashboardUID', pulumi_dashboard.uid)

Typescript

import * as pulumi from "@pulumi/pulumi";
import * as grafana from "@pulumiverse/grafana";
import { builder } from '../../typescript/linux-node-overview/src/index';

const provider = new grafana.Provider("grafana", { url: "http://localhost:3000", auth: "admin:admin" });

const dashboard = builder.build();

const pulumiDashboard = new grafana.Dashboard(dashboard.uid || 'uid', { configJson: JSON.stringify(dashboard, null, 2) }, { provider: provider });

export const dashboardUid = pulumiDashboard.uid;