Skip to content

Commit

Permalink
Added package templates
Browse files Browse the repository at this point in the history
  • Loading branch information
jakefhyde committed Apr 6, 2022
1 parent 80d5f31 commit fbf5071
Show file tree
Hide file tree
Showing 21 changed files with 684 additions and 121 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,4 @@ Network Trash Folder
Temporary Items
.apdisk

corral
7 changes: 4 additions & 3 deletions cmd/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ import (
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"os"
"runtime"
"sync"

"github.com/rancherlabs/corral/pkg/config"
"github.com/rancherlabs/corral/pkg/corral"
_package "github.com/rancherlabs/corral/pkg/package"
Expand All @@ -16,9 +20,6 @@ import (
"github.com/spf13/viper"
"golang.org/x/crypto/ssh"
"golang.org/x/sync/errgroup"
"os"
"runtime"
"sync"
)

var (
Expand Down
3 changes: 2 additions & 1 deletion cmd/package/package.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ func NewCommandPackage() *cobra.Command {
NewCommandLogin(),
NewCommandInfo(),
NewCommandValidate(),
NewCommandDownload())
NewCommandDownload(),
NewCommandTemplate())
return cmd
}
94 changes: 94 additions & 0 deletions cmd/package/template.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package cmd_package

import (
"os"
"path/filepath"

_package "github.com/rancherlabs/corral/pkg/package"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"gopkg.in/yaml.v3"
)

const templateDescription = `
Create a package from existing package(s).
Examples:
corral package template a b c OUT
corral package template -f config.yaml
`

func NewCommandTemplate() *cobra.Command {
cmd := &cobra.Command{
Use: "template",
Short: "Create a package from a template",
Long: templateDescription,
Run: func(cmd *cobra.Command, args []string) {
err := template(cmd, args)
if err != nil {
logrus.Fatalf("Error rendering package template: %v", err)
}
},
Args: cobra.MinimumNArgs(1),
}

cmd.Flags().StringP("file", "f", "", "yaml file to define template values")

return cmd
}

// embed a template
func template(cmd *cobra.Command, args []string) error {
file, err := cmd.Flags().GetString("file")
if err != nil {
return err
}

body, err := os.ReadFile(file)
if err != nil {
return err
}

var t _package.TemplateSpec

if err = yaml.Unmarshal(body, &t); err != nil {
return err
}

srcs := append(t.Packages, args[:len(args)-1]...)
pkgs := make([]_package.Package, len(srcs))

for i, p := range srcs {
pkg, err := _package.LoadPackage(p) // ensures pkg is in cache
if err != nil {
return err
}
pkgs[i] = pkg
}

name := args[len(args)-1]

manifest, err := _package.MergePackages(name, pkgs)
if err != nil {
return err
}

manifest.Description = t.Description

buf, err := yaml.Marshal(manifest)
if err != nil {
return err
}

err = _package.ValidateManifest(buf)
if err != nil {
return err
}

err = os.WriteFile(filepath.Join(name, "manifest.yaml"), buf, 0664)
if err != nil {
return err
}

return nil
}
3 changes: 2 additions & 1 deletion cmd/package/validate.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package cmd_package

import (
"os"

_package "github.com/rancherlabs/corral/pkg/package"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"os"
)

func NewCommandValidate() *cobra.Command {
Expand Down
7 changes: 7 additions & 0 deletions examples/template/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: template
description: >
A simple template example.
This package was generated with the following command:
`corral package template -f config.yaml test simple-test`
packages:
- ../simple
27 changes: 27 additions & 0 deletions examples/template/simple-test/manifest.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: simple-test
description: |
A simple template example. This package was generated with the following command: `corral package template -f config.yaml simple-test`
commands:
- module: simple/module
- command: /app/setvar1.sh
node_pools:
- all
- command: ls /app
node_pools:
- all
- command: /app/setvar2.sh
node_pools:
- all
variables:
var1:
default: foo
description: Example variable for testing variable flows.
type: string
var1_out:
description: Set to the value of var1 by a corral set script.
readOnly: true
type: string
var2_out:
description: Set to the value of var1_out by a corral set script.
readOnly: true
type: string
5 changes: 5 additions & 0 deletions examples/template/simple-test/overlay/app/setvar1.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh

env

echo "corral_set var1_out=${CORRAL_var1}"
5 changes: 5 additions & 0 deletions examples/template/simple-test/overlay/app/setvar2.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh

env

echo "corral_set var2_out=${CORRAL_var1_out}"
14 changes: 14 additions & 0 deletions examples/template/simple-test/terraform/simple/module/corral.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
variable "corral_name" {}
variable "corral_public_key" {}

output "corral_node_pools" {
value = {
all = [
for n in docker_container.node : {
name = n.name
user = "corral"
address = "127.0.0.1:${n.ports[0].external}"
}
]
}
}
38 changes: 38 additions & 0 deletions examples/template/simple-test/terraform/simple/module/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 2.13.0"
}
}
}

provider "docker" {}

resource "docker_volume" "data" {
count = 1
name = "${var.corral_name}-node-${count.index}"
}

resource "docker_container" "node" {
count = 1
image = "lscr.io/linuxserver/openssh-server"
name = "${var.corral_name}-node-${count.index}"

ports {
internal = 2222
}

env = [
"PUBLIC_KEY=${var.corral_public_key}",
"USER_NAME=corral",
"USER_PASSWORD=corral",
"SUDO_ACCESS=true",
"PASSWORD_ACCESS=true",
]

volumes {
container_path = "/app"
volume_name = docker_volume.data[count.index].name
}
}
16 changes: 16 additions & 0 deletions examples/template/test/manifest.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: test
description: >
A simple package for developing corral.
commands:
- command: /app/setvar2.sh
node_pools:
- all
variables:
var1_out:
type: string
readOnly: true
description: "Set to the value of var1 by a corral set script."
var2_out:
type: string
readOnly: true
description: "Set to the value of var1_out by a corral set script."
5 changes: 5 additions & 0 deletions examples/template/test/overlay/app/setvar2.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh

env

echo "corral_set var2_out=${CORRAL_var1_out}"
57 changes: 27 additions & 30 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,41 @@ module github.com/rancherlabs/corral
go 1.17

require (
github.com/blang/semver v3.5.1+incompatible
github.com/containerd/containerd v1.6.2
github.com/hashicorp/go-version v1.4.0
github.com/hashicorp/hc-install v0.3.1
github.com/hashicorp/terraform-exec v0.16.0
github.com/jedib0t/go-pretty/v6 v6.2.7
github.com/jedib0t/go-pretty/v6 v6.3.0
github.com/opencontainers/image-spec v1.0.2
github.com/pkg/sftp v1.13.4
github.com/sirupsen/logrus v1.8.1
github.com/spf13/cobra v1.3.0
github.com/spf13/viper v1.10.0
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
gopkg.in/yaml.v2 v2.4.0
k8s.io/apimachinery v0.23.3
oras.land/oras-go v1.0.0
)

require (
github.com/blang/semver v3.5.1+incompatible
github.com/containerd/containerd v1.5.9
github.com/pkg/errors v0.9.1
github.com/pkg/sftp v1.13.4
github.com/santhosh-tekuri/jsonschema/v5 v5.0.0
github.com/sirupsen/logrus v1.8.1
github.com/spf13/cobra v1.4.0
github.com/spf13/viper v1.10.1
github.com/stretchr/testify v1.7.0
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
k8s.io/apimachinery v0.23.5
oras.land/oras-go v1.1.0
)

require (
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/docker/cli v20.10.12+incompatible // indirect
github.com/docker/distribution v2.8.0+incompatible // indirect
github.com/docker/docker v20.10.12+incompatible // indirect
github.com/docker/cli v20.10.14+incompatible // indirect
github.com/docker/distribution v2.8.1+incompatible // indirect
github.com/docker/docker v20.10.14+incompatible // indirect
github.com/docker/docker-credential-helpers v0.6.4 // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/fsnotify/fsnotify v1.5.1 // indirect
github.com/go-logr/logr v1.2.2 // indirect
github.com/go-logr/logr v1.2.3 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/gorilla/mux v1.8.0 // indirect
Expand All @@ -50,9 +47,9 @@ require (
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/terraform-json v0.13.0 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/klauspost/compress v1.14.2 // indirect
github.com/klauspost/compress v1.15.1 // indirect
github.com/kr/fs v0.1.0 // indirect
github.com/magiconair/properties v1.8.5 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/mattn/go-runewidth v0.0.13 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/mitchellh/mapstructure v1.4.3 // indirect
Expand All @@ -64,23 +61,23 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_golang v1.12.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/common v0.33.0 // indirect
github.com/prometheus/procfs v0.7.3 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/spf13/afero v1.8.1 // indirect
github.com/spf13/afero v1.8.2 // indirect
github.com/spf13/cast v1.4.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/zclconf/go-cty v1.10.0 // indirect
golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
golang.org/x/net v0.0.0-20220403103023-749bd193bc2b // indirect
golang.org/x/sys v0.0.0-20220403205710-6acee93ad0eb // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/genproto v0.0.0-20220211171837-173942840c17 // indirect
google.golang.org/grpc v1.44.0 // indirect
google.golang.org/protobuf v1.27.1 // indirect
google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de // indirect
google.golang.org/grpc v1.45.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/ini.v1 v1.66.4 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/klog/v2 v2.40.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
k8s.io/klog/v2 v2.60.1 // indirect
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
)
Loading

0 comments on commit fbf5071

Please sign in to comment.