# `Bonny.CRD`
[🔗](https://github.com/coryodaniel/bonny/blob/v1.5.0/lib/bonny/crd.ex#L1)

Represents the `spec` portion of a Kubernetes [CustomResourceDefinition](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/) manifest.

> The CustomResourceDefinition API resource allows you to define custom resources. Defining a CRD object creates a new custom resource with a name and schema that you specify. The Kubernetes API serves and handles the storage of your custom resource.

# `t`

```elixir
@type t() :: %Bonny.CRD{
  additional_printer_columns: [columns_t()],
  group: String.t() | nil,
  names: names_t(),
  scope: :namespaced | :cluster,
  version: String.t()
}
```

CRD Spec

# `api_version`

```elixir
@spec api_version(t()) :: String.t()
```

Gets group version from CRD spec

## Examples
  Returns apiVersion for an operator

    iex> Bonny.CRD.api_version(%Bonny.CRD{group: "hello.example.com", version: "v1", scope: :namespaced, names: %{}})
    "hello.example.com/v1"

  Returns apiVersion for `apps` resources

    iex> Bonny.CRD.api_version(%Bonny.CRD{group: "apps", version: "v1", scope: :namespaced, names: %{}})
    "apps/v1"

  Returns apiVersion for `core` resources

    iex> Bonny.CRD.api_version(%Bonny.CRD{group: "", version: "v1", scope: :namespaced, names: %{}})
    "v1"

    iex> Bonny.CRD.api_version(%Bonny.CRD{group: nil, version: "v1", scope: :namespaced, names: %{}})
    "v1"

# `default_columns`

```elixir
@spec default_columns() :: [map()]
```

Default CLI printer columns.

These are added to the CRDs columns _when_ columns are set.

The kubernetes API returns these by default when they _are not_ set.

# `kind`

```elixir
@spec kind(t()) :: binary()
```

CRD Kind or plural name

## Examples

    iex> Bonny.CRD.kind(%Bonny.CRD{names: %{plural: "greetings"}, scope: :namespaced, group: "test", version: "v1"})
    "greetings"

# `to_manifest`

```elixir
@spec to_manifest(t(), String.t()) :: map()
```

Generates the map equivalent of the Kubernetes CRD YAML manifest

```yaml
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  creationTimestamp: null
  name: widgets.example.com
spec:
  group: example.com
  names:
    kind: Widget
    plural: widgets
  scope: Namespaced
  version: v1
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
