Crossbuilder
Crossbuilder is a tool that allows the generation of Crossplane XRDs and
compositions from go code.
This tool builds on [mistermx/crossbuilder] to provide two tools, xrd-gen and
xrc-gen which can be used to build crossplane definitions and compositions.
Usage
The easiest way to use this build tool is to include it as a submodule to your
project at the crossbuilder path and then execute ./crossbuilder/scripts/gen
git submodule add https://github.com/mproffitt/crossbuilder
git submodule init
./crossbuilder/scripts/gen
Alternatively you may use the docker container which will set this up for you
docker run -v $(pwd):build docker.io/choclab/xrdtools:latest
XRD Generation
Crossbuilder's xrd-gen wraps around [kubebuilder] and [controller-gen] but
instead of generating CRDs (Custom Resource Definitions) it generates XRDs
(Composite Resource Definitions) that are part of the Crossplane ecosystem.
Crossbuilder has every feature that Kubebuilder's CRD generator provides plus
the ability to define XRD specific fields.
Take a look at the [api examples] for
more details.
Composition Generation
Crossbuilder provides a toolkit that allows building compositions from Go and
write them out as YAML.
Both Resource type compositions and Pipeline compositions are
supported.
Since go is a statically typed language, Crossbuilder is able to perform
additional validation checks, such as patch path validation, that is a common
cause of errors when writing Crossplane compositions. This is only applicable
when running xrc-gen against a Resource type composition. It is currently not
applicable for running against a Pipeline mode composition as resources may
come from custom composition functions and templates making them ineligible for
build-time discovery.
Compositions are written as go plugins and must implement the
CompositionBuilder interface as well as exposing a TemplateBasePath string
variable which is injected during the runtime process and may be passed to
the build module when templates are used.
package main
import (
"github.com/mproffitt/crossbuilder/pkg/generate/composition/build"
...
)
type builder struct {}
var Builder builder
var TemplateBasePath string
func (b *builder) GetCompositeTypeRef() build.ObjectKindReference {
// return object kind information
}
func (b *builder) Build(c build.CompositionSkeleton) {
build.TemplateBasePath = TemplateBasePath
// implement pipeline here
}
xrc-gen operates by first running xrd-gen on all directories under the
repository root which contain a generate.go file.
Once this has completed, it then attempts to detect any folder which contains
a main.go file, ignoring anything found under pkg, internal or crossbuilder
These locations are then compiled into the plugins folder which will be created
if it does not exist.
Once all plugins are compiled, they are loaded and executed to generate
composition manifests which are stored under apis/<group-prefix> - for example
if your composition has the type xexample.crossplane.example.io it will be
output to apis/xexample/composition_name.yaml
Structuring repositories
The current version of the tool attempts to remove most restrictions on
repository structure, other than composition locations must contain a main.go
file, and the API must contain a generate.go file:
.
├── compositions
│ ├── example
│ │ ├── main.go
│ │ └── templates
│ │ ├── template1.k
│ │ └── template2.k
│ └── anotherexample
│ └── main.go
├── generate.go
└── v1alpha1
├── doc.go
├── groupversion.go
├── example_types.go
├── anotherexample_types.go
└── zz_generated.deepcopy.go