npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@unmango/pulumi-homelab

v0.0.1

Published

This repo is a collection of Pulumi resources for commonly deployed homelab applications implemented as a [component provider](https://www.pulumi.com/docs/intro/concepts/resources/#components). Deployment options exist for both kubernetes and docker, with

Downloads

10

Readme

Homelab Pulumi Component Provider

This repo is a collection of Pulumi resources for commonly deployed homelab applications implemented as a component provider. Deployment options exist for both kubernetes and docker, with (hopefully) further customization from there.

An example of using the StaticPage component in TypeScript is in examples/simple.

Note that the provider plugin (pulumi-resource-homelab) must be on your PATH to be used by Pulumi deployments. In this case, pulumi-resource-homelab is a platform-specific binary that includes its Node.js dependency along with the provider code, created using nexe. By default, running make install will create the binary specific to your host environment, but you can override the binary target by passing in make install target=<targe-string> where target-string is a valid nexe target.

After running make install, pulumi-resource-homelab will be available in the ./bin directory. You can add this to your path in bash with export PATH=$PATH:$PWD/bin.

If creating a provider for distribution to other users, they will need pulumi-resource-homelab directory on their PATH. See the Packaging section below for more on distributing the provider to users.

Prerequisites

  • Pulumi CLI
  • Node.js
  • Yarn
  • Go 1.15 (to regenerate the SDKs)
  • Python 3.6+ (to build the Python SDK)
  • .NET Core SDK (to build the .NET SDK)

Build and Test

# Build and install the provider
make install_provider

# Regenerate SDKs
make generate

# Ensure the pulumi-provider-homelab script is on PATH
$ export PATH=$PATH:$PWD/bin

# Test Node.js SDK
$ make install_nodejs_sdk
$ cd examples/simple
$ yarn install
$ yarn link @unmango/pulumi-homelab
$ pulumi stack init test
$ pulumi config set aws:region us-east-1
$ pulumi up

Naming

The homelab provider's plugin must be named pulumi-resource-homelab (in the format pulumi-resource-<provider>).

While the provider plugin must follow this naming convention, the SDK package naming can be customized.

Packaging

The provider plugin can be packaged into a tarball and hosted at a custom server URL to make it easier to distribute to users.

Currently, three tarball files are necessary for Linux, macOS, and Windows (pulumi-resource-homelab-v0.0.1-linux-amd64.tar.gz, pulumi-resource-homelab-v0.0.1-darwin-amd64.tar.gz, pulumi-resource-homelab-v0.0.1-windows-amd64.tar.gz) each containing the same file: the platform-specific binary pulumi-resource-homelab created in the ./bin directory after running make install_provider. These artifacts can be generated automatically in the dist directory using make dist.

Example component

Let's look at the example StaticPage component resource in more detail.

Schema

The example StaticPage component resource is defined in schema.yaml:

resources:
  homelab:index:StaticPage:
    isComponent: true
    inputProperties:
      indexContent:
        type: string
        description: The HTML content for index.html.
    requiredInputs:
      - indexContent
    properties:
      bucket:
        "$ref": "/aws/v3.30.0/schema.json#/resources/aws:s3%2Fbucket:Bucket",
        description: The bucket resource.
      websiteUrl:
        type: string
        description: The website URL.
    required:
      - bucket
      - websiteUrl

The component resource's type token is homelab:index:StaticPage in the format of <package>:<module>:<type>. In this case, it's in the homelab package and index module. This is the same type token passed inside the implementation of StaticPage in provider/cmd/pulumi-resource-homelab/staticPage.ts, and also the same token referenced in construct in provider/cmd/pulumi-resource-homelab/provider.ts.

This component has a required indexContent input property typed as string, and two required output properties: bucket and websiteUrl. Note that bucket is typed as the aws:s3/bucket:Bucket resource from the aws provider (in the schema the / is escaped as %2F).

Since this component returns a type from the aws provider, each SDK must reference the associated Pulumi aws SDK for the language. For the .NET, Node.js, and Python SDKs, dependencies are specified in the language section of the schema:

language:
  csharp:
    packageReferences:
      Pulumi: 2.*
      Pulumi.Aws: 3.*
  nodejs:
    dependencies:
      "@pulumi/aws": "^3.30.0"
    devDependencies:
      typescript: "^3.7.0"
  python:
    requires:
      pulumi: ">=2.21.2,<3.0.0",
      pulumi-aws: ">=3.30.0,<4.0.0"

For the Go SDK, dependencies are specified in the sdk/go.mod file.

Implementation

The implementation of this component is in provider/cmd/pulumi-resource-homelab/staticPage.ts and the structure of the component's inputs and outputs aligns with what is defined in schema.yaml:

export interface StaticPageArgs {
    indexContent: pulumi.Input<string>;
}

export class StaticPage extends pulumi.ComponentResource {
    public readonly bucket: aws.s3.Bucket;
    public readonly websiteUrl: pulumi.Output<string>;

    constructor(name: string, args: StaticPageArgs, opts?: pulumi.ComponentResourceOptions) {
        super("homelab:index:StaticPage", name, args, opts);

        ...
    }
}

The provider makes this component resource available in the construct method in provider/cmd/pulumi-resource-homelab/provider.ts. When construct is called and the type argument is homelab:index:StaticPage, we create an instance of the StaticPage component resource and return its URN and outputs as its state.

async function constructStaticPage(name: string, inputs: pulumi.Inputs,
    options: pulumi.ComponentResourceOptions): Promise<provider.ConstructResult> {

    // Create the component resource.
    const staticPage = new StaticPage(name, inputs as StaticPageArgs, options);

    // Return the component resource's URN and outputs as its state.
    return {
        urn: staticPage.urn,
        state: {
            bucket: staticPage.bucket,
            websiteUrl: staticPage.websiteUrl,
        },
    };
}