Forklift buildx provider
This commit is contained in:
206
docs/generate.go
Normal file
206
docs/generate.go
Normal file
@@ -0,0 +1,206 @@
|
||||
// Copyright 2024, Pulumi Corporation.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:generate go run generate.go yaml ../provider/internal/embed
|
||||
|
||||
// Package main ingests a multi-document YAML file and converts it into
|
||||
// Markdown examples.
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
|
||||
"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
|
||||
)
|
||||
|
||||
func main() {
|
||||
if len(os.Args) < 3 {
|
||||
fmt.Fprintf(os.Stdout, "Usage: %s <yaml source dir path> <markdown destination path>\n", os.Args[0])
|
||||
os.Exit(1)
|
||||
}
|
||||
yamlPath := os.Args[1]
|
||||
mdPath := os.Args[2]
|
||||
|
||||
if !filepath.IsAbs(yamlPath) {
|
||||
cwd, err := os.Getwd()
|
||||
contract.AssertNoErrorf(err, "getting working directory")
|
||||
yamlPath = filepath.Join(cwd, yamlPath)
|
||||
}
|
||||
|
||||
if err := os.MkdirAll(mdPath, 0o750); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fileInfo, err := os.Lstat(mdPath)
|
||||
if err != nil || !fileInfo.IsDir() {
|
||||
fmt.Fprintf(os.Stderr, "Expect markdown destination %q to be a directory\n", mdPath)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
yamlFiles, err := os.ReadDir(yamlPath)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, yamlFile := range yamlFiles {
|
||||
if err := processYaml(filepath.Join(yamlPath, yamlFile.Name()), mdPath); err != nil {
|
||||
log.Fatal(fmt.Errorf("processing %q: %w", yamlFile.Name(), err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func markdownExamples(examples []string) string {
|
||||
s := "{{% examples %}}\n## Example Usage\n"
|
||||
for _, example := range examples {
|
||||
s += example
|
||||
}
|
||||
s += "{{% /examples %}}"
|
||||
return s
|
||||
}
|
||||
|
||||
func markdownExample(description string,
|
||||
typescript string,
|
||||
python string,
|
||||
csharp string,
|
||||
golang string,
|
||||
yaml string,
|
||||
java string,
|
||||
) string {
|
||||
return fmt.Sprintf("{{%% example %%}}\n### %s\n\n"+
|
||||
"```typescript\n%s```\n"+
|
||||
"```python\n%s```\n"+
|
||||
"```csharp\n%s```\n"+
|
||||
"```go\n%s```\n"+
|
||||
"```yaml\n%s```\n"+
|
||||
"```java\n%s```\n"+
|
||||
"{{%% /example %%}}\n",
|
||||
description, typescript, python, csharp, golang, yaml, java)
|
||||
}
|
||||
|
||||
func convert(language, tempDir, programFile string) (string, error) {
|
||||
exampleDir := filepath.Join(tempDir, "example"+language)
|
||||
//nolint:gosec // No user-provided input.
|
||||
cmd := exec.Command(
|
||||
"pulumi",
|
||||
"convert",
|
||||
"--language",
|
||||
language,
|
||||
"--out",
|
||||
filepath.Clean(filepath.Join(tempDir, exampleDir)),
|
||||
"--generate-only",
|
||||
)
|
||||
|
||||
cmd.Stderr = os.Stderr
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Dir = tempDir
|
||||
if err := cmd.Run(); err != nil {
|
||||
return "", fmt.Errorf("converting: %w", err)
|
||||
}
|
||||
content, err := os.ReadFile(filepath.Clean(filepath.Join(tempDir, exampleDir, programFile)))
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("reading: %w", err)
|
||||
}
|
||||
|
||||
return string(content), nil
|
||||
}
|
||||
|
||||
func processYaml(path string, mdDir string) error {
|
||||
yamlFile, err := os.Open(filepath.Clean(path))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
base := filepath.Base(path)
|
||||
md := strings.NewReplacer(".yaml", ".md", ".yml", ".md").Replace(base)
|
||||
|
||||
defer contract.IgnoreClose(yamlFile)
|
||||
decoder := yaml.NewDecoder(yamlFile)
|
||||
exampleStrings := []string{}
|
||||
for {
|
||||
example := map[string]interface{}{}
|
||||
err := decoder.Decode(&example)
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
|
||||
description, ok := example["description"].(string)
|
||||
if !ok {
|
||||
description = "TODO: Description"
|
||||
}
|
||||
dir, err := os.MkdirTemp("", "")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer func() {
|
||||
contract.IgnoreError(os.RemoveAll(dir))
|
||||
}()
|
||||
|
||||
src, err := os.OpenFile(filepath.Clean(filepath.Join(dir, "Pulumi.yaml")), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Println("Converting:", example)
|
||||
|
||||
if err = yaml.NewEncoder(src).Encode(example); err != nil {
|
||||
return err
|
||||
}
|
||||
contract.AssertNoErrorf(src.Close(), "closing")
|
||||
|
||||
typescript, err := convert("typescript", dir, "index.ts")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
python, err := convert("python", dir, "__main__.py")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
csharp, err := convert("csharp", dir, "Program.cs")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
golang, err := convert("go", dir, "main.go")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
java, err := convert("java", dir, "src/main/java/generated_program/App.java")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
yamlContent, err := os.ReadFile(filepath.Clean(filepath.Join(dir, "Pulumi.yaml")))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
yaml := string(yamlContent)
|
||||
|
||||
exampleStrings = append(exampleStrings, markdownExample(description, typescript, python, csharp, golang, yaml, java))
|
||||
}
|
||||
fmt.Fprintf(os.Stdout, "Writing %s\n", filepath.Join(mdDir, md))
|
||||
f, err := os.OpenFile(filepath.Clean(filepath.Join(mdDir, md)), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer contract.IgnoreClose(f)
|
||||
_, err = f.Write([]byte(markdownExamples(exampleStrings)))
|
||||
contract.AssertNoErrorf(err, "writing examples")
|
||||
return nil
|
||||
}
|
||||
180
docs/yaml/image-examples.yaml
Normal file
180
docs/yaml/image-examples.yaml
Normal file
@@ -0,0 +1,180 @@
|
||||
name: ecr
|
||||
description: Push to AWS ECR with caching
|
||||
outputs:
|
||||
ref: ${my-image.ref}
|
||||
resources:
|
||||
ecr-repository:
|
||||
type: aws:ecr:Repository
|
||||
my-image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
tags:
|
||||
- ${ecr-repository.repositoryUrl}:latest
|
||||
push: true
|
||||
context:
|
||||
location: ./app
|
||||
cacheFrom:
|
||||
- registry:
|
||||
ref: ${ecr-repository.repositoryUrl}:cache
|
||||
cacheTo:
|
||||
- registry:
|
||||
ref: ${ecr-repository.repositoryUrl}:cache
|
||||
imageManifest: true
|
||||
ociMediaTypes: true
|
||||
registries:
|
||||
- username: ${auth-token.userName}
|
||||
password: ${auth-token.password}
|
||||
address: ${ecr-repository.repositoryUrl}
|
||||
runtime: yaml
|
||||
variables:
|
||||
auth-token:
|
||||
fn::aws:ecr:getAuthorizationToken:
|
||||
registryId: ${ecr-repository.registryId}
|
||||
---
|
||||
name: multi-platform
|
||||
runtime: yaml
|
||||
description: Multi-platform image
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
platforms:
|
||||
- plan9/amd64
|
||||
- plan9/386
|
||||
---
|
||||
name: registry
|
||||
runtime: yaml
|
||||
description: Registry export
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
tags:
|
||||
- "docker.io/pulumi/pulumi:3.107.0"
|
||||
context:
|
||||
location: "app"
|
||||
push: true
|
||||
registries:
|
||||
- address: docker.io
|
||||
username: pulumibot
|
||||
password: ${dockerHubPassword}
|
||||
outputs:
|
||||
ref: ${my-image.ref}
|
||||
---
|
||||
name: caching
|
||||
runtime: yaml
|
||||
description: Caching
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
cacheTo:
|
||||
- local:
|
||||
dest: tmp/cache
|
||||
mode: max
|
||||
cacheFrom:
|
||||
- local:
|
||||
src: tmp/cache
|
||||
---
|
||||
name: dbc
|
||||
runtime: yaml
|
||||
description: Docker Build Cloud
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
exec: true
|
||||
builder:
|
||||
name: cloud-builder-name
|
||||
---
|
||||
name: build-args
|
||||
runtime: yaml
|
||||
description: Build arguments
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
buildArgs:
|
||||
SET_ME_TO_TRUE: "true"
|
||||
---
|
||||
name: build-target
|
||||
runtime: yaml
|
||||
description: Build target
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
target: "build-me"
|
||||
---
|
||||
name: named-contexts
|
||||
runtime: yaml
|
||||
description: Named contexts
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: app
|
||||
named:
|
||||
"golang:latest":
|
||||
location: "docker-image://golang@sha256:b8e62cf593cdaff36efd90aa3a37de268e6781a2e68c6610940c48f7cdf36984"
|
||||
---
|
||||
name: remote-context
|
||||
runtime: yaml
|
||||
description: Remote context
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "https://raw.githubusercontent.com/pulumi/pulumi-docker/api-types/provider/testdata/Dockerfile"
|
||||
|
||||
---
|
||||
name: inline
|
||||
runtime: yaml
|
||||
description: Inline Dockerfile
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
dockerfile:
|
||||
inline: |
|
||||
FROM busybox
|
||||
COPY hello.c ./
|
||||
context:
|
||||
location: "app"
|
||||
---
|
||||
name: remote-context
|
||||
runtime: yaml
|
||||
description: Remote context
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
dockerfile:
|
||||
location: app/Dockerfile
|
||||
context:
|
||||
location: "https://github.com/docker-library/hello-world.git"
|
||||
---
|
||||
name: docker-load
|
||||
runtime: yaml
|
||||
description: Local export
|
||||
resources:
|
||||
image:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
exports:
|
||||
- docker:
|
||||
tar: true
|
||||
48
docs/yaml/index-examples.yaml
Normal file
48
docs/yaml/index-examples.yaml
Normal file
@@ -0,0 +1,48 @@
|
||||
name: registry-caching
|
||||
description: Multi-platform registry caching
|
||||
runtime: yaml
|
||||
resources:
|
||||
arm64:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
platforms:
|
||||
- linux/arm64
|
||||
tags:
|
||||
- "docker.io/pulumi/pulumi:3.107.0-arm64"
|
||||
cacheTo:
|
||||
- registry:
|
||||
ref: "docker.io/pulumi/pulumi:cache-arm64"
|
||||
mode: max
|
||||
cacheFrom:
|
||||
- registry:
|
||||
ref: "docker.io/pulumi/pulumi:cache-arm64"
|
||||
|
||||
amd64:
|
||||
type: dockerbuild:index:Image
|
||||
properties:
|
||||
context:
|
||||
location: "app"
|
||||
platforms:
|
||||
- linux/amd64
|
||||
tags:
|
||||
- "docker.io/pulumi/pulumi:3.107.0-amd64"
|
||||
cacheTo:
|
||||
- registry:
|
||||
ref: "docker.io/pulumi/pulumi:cache-amd64"
|
||||
mode: max
|
||||
cacheFrom:
|
||||
- registry:
|
||||
ref: "docker.io/pulumi/pulumi:cache-amd64"
|
||||
|
||||
index:
|
||||
type: dockerbuild:index:Index
|
||||
properties:
|
||||
tag: "docker.io/pulumi/pulumi:3.107.0"
|
||||
sources:
|
||||
- ${amd64.ref}
|
||||
- ${arm64.ref}
|
||||
|
||||
outputs:
|
||||
ref: ${index.ref}
|
||||
Reference in New Issue
Block a user