Skip to content

Commit

Permalink
Add add-owner-reference/3 to Bonny.Controller refs #49
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Ruoss committed Sep 1, 2022
1 parent 07fec64 commit da358fb
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 0 deletions.
44 changes: 44 additions & 0 deletions lib/bonny/controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ defmodule Bonny.Controller do
@impl Bonny.Controller
defdelegate conn(), to: Bonny.Config

defdelegate add_owner_reference(resource, owner, opts \\ []), to: Bonny.Controller

defoverridable list_operation: 0, conn: 0
end
end
Expand Down Expand Up @@ -153,4 +155,46 @@ defmodule Bonny.Controller do
_ -> K8s.Client.list(api_version, kind)
end
end

@spec add_owner_reference(map(), map(), keyword(boolean)) :: map()
def add_owner_reference(resource, owner, opts \\ [])

def add_owner_reference(%{"metadata" => _} = resource, owner, opts) do
owner_ref = owner_reference(owner, opts)

put_in(
resource,
[
"metadata",
Access.key("ownerReferences", []),
K8s.Resource.NamedList.access(owner_ref["name"])
],
owner_ref
)
end

def add_owner_reference(%{metadata: _} = resource, owner, opts) do
owner_ref = owner_reference(owner, opts)

put_in(
resource,
[
:metadata,
Access.key(:ownerReferences, []),
K8s.Resource.NamedList.access(owner_ref["name"])
],
owner_ref
)
end

defp owner_reference(resource, opts) do
%{
"apiVersion" => get_in(resource, ["apiVersion"]),
"kind" => get_in(resource, ["kind"]),
"name" => get_in(resource, ["metadata", "name"]),
"uid" => get_in(resource, ["metadata", "uid"]),
"blockOwnerDeletion" => Keyword.get(opts, :block_owner_deletion, false),
"controller" => true
}
end
end
73 changes: 73 additions & 0 deletions test/bonny/controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,79 @@ defmodule Bonny.ControllerTest do
end
end

describe "add_owner_reference/3" do
setup do
resource = %{
"apiVersion" => "example.com/v1",
"kind" => "Cog",
"metadata" => %{
"name" => "some-cog",
"namespace" => "default"
}
}

resource_with_atoms = %{
apiVersion: "example.com/v1",
kind: "Cog",
metadata: %{
name: "some-cog",
namespace: "default"
}
}

owner = %{
"apiVersion" => "example.com/v1",
"kind" => "Widget",
"metadata" => %{
"name" => "some-widget",
"namespace" => "default",
"uid" => "d9607e19-f88f-11e6-a518-42010a800195"
}
}

[resource: resource, resource_with_atoms: resource_with_atoms, owner: owner]
end

test "adds the reference", %{resource: resource, owner: owner} do
resource_with_ownerref = Bonny.Controller.add_owner_reference(resource, owner)

assert hd(resource_with_ownerref["metadata"]["ownerReferences"]) == %{
"apiVersion" => "example.com/v1",
"kind" => "Widget",
"blockOwnerDeletion" => false,
"controller" => true,
"name" => "some-widget",
"uid" => "d9607e19-f88f-11e6-a518-42010a800195"
}
end

test "adds the reference for resource with atoms", %{
resource_with_atoms: resource,
owner: owner
} do
resource_with_ownerref = Bonny.Controller.add_owner_reference(resource, owner)

assert hd(resource_with_ownerref[:metadata][:ownerReferences]) == %{
"apiVersion" => "example.com/v1",
"kind" => "Widget",
"blockOwnerDeletion" => false,
"controller" => true,
"name" => "some-widget",
"uid" => "d9607e19-f88f-11e6-a518-42010a800195"
}
end

test "sets blockOnwerDeletion", %{resource: resource, owner: owner} do
resource_with_ownerref =
Bonny.Controller.add_owner_reference(resource, owner, block_owner_deletion: true)

assert resource_with_ownerref
|> get_in(["metadata", "ownerReferences"])
|> hd()
|> Map.get("blockOwnerDeletion") == true
end
end

test "builds RBAC rules when set" do
assert V2.Whizbang.rules() == [
%{apiGroups: ["apiextensions.k8s.io"], resources: ["bar"], verbs: ["*"]},
Expand Down

0 comments on commit da358fb

Please sign in to comment.