Skip to content

Commit 0dd24a0

Browse files
author
Fletcher Haynes
committed
Wrapped more of Namespaces and Deployments
1 parent 9ca5aae commit 0dd24a0

9 files changed

+308
-2
lines changed

config/config.exs

+4-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
# and its dependencies with the aid of the Mix.Config module.
33
use Mix.Config
44

5-
config :exkube, insecure_ca: :secure
5+
config :exkube, insecure_ca: :insecure,
6+
kube_user: "admin",
7+
kube_password: System.get_env("EXKUBE_PASSWORD"),
8+
api_url: System.get_env("EXKUBE_API")
69
# This configuration is loaded before any dependency and is restricted
710
# to this project. If another project depends on this project, this
811
# file won't be loaded nor affect the parent project. For this reason,

lib/deployments.ex

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
defmodule Exkube.Deployments do
2+
@moduledoc """
3+
This module contains functions for working with Deployments
4+
"""
5+
6+
require Logger
7+
alias Exkube.Base
8+
9+
@doc """
10+
This gets all of the Deployments
11+
"""
12+
def all do
13+
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} = Base.get("apis/apps/v1beta1/deployments")
14+
processed = Base.process_response_status_code(body, status_code)
15+
16+
# We need to process the result a bit to extract only the Namespace names
17+
case processed do
18+
{:ok, data} ->
19+
deployments = Enum.reduce(data["items"], [],
20+
fn(n), acc ->
21+
[%{name: n["metadata"]["name"], namespace: n["metadata"]["namespace"]} | acc]
22+
end
23+
)
24+
Logger.debug(inspect(deployments))
25+
{:ok, deployments}
26+
_ ->
27+
{:error, status_code}
28+
end
29+
end
30+
31+
@doc """
32+
Lists all the Deployments in a specific Namespace
33+
"""
34+
def all(namespace) do
35+
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} = Base.get("apis/apps/v1beta1/namespaces/" <> namespace <> "/deployments")
36+
processed = Base.process_response_status_code(body, status_code)
37+
38+
# We need to process the result a bit to extract only the Namespace names
39+
case processed do
40+
{:ok, data} ->
41+
deployments = Enum.reduce(data["items"], [],
42+
fn(n), acc ->
43+
[%{name: n["metadata"]["name"], namespace: n["metadata"]["namespace"]} | acc]
44+
end
45+
)
46+
Logger.debug(inspect(deployments))
47+
{:ok, deployments}
48+
_ ->
49+
{:error, status_code}
50+
end
51+
end
52+
53+
@doc """
54+
Gets the details of one Deployment. Defaults to the default Namespace if one is
55+
not specified.
56+
"""
57+
def one(namespace \\ "default") do
58+
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} =
59+
Base.get("apis/apps/v1beta1/namespaces/" <> namespace <> "/deployments/" <> namespace)
60+
61+
processed = Base.process_response_status_code(body, status_code)
62+
63+
# We need to process the result a bit to extract only the Namespace names
64+
case processed do
65+
{:ok, data} ->
66+
deployments = Enum.reduce(data["items"], [],
67+
fn(n), acc ->
68+
[%{name: n["metadata"]["name"], namespace: n["metadata"]["namespace"]} | acc]
69+
end
70+
)
71+
Logger.debug(inspect(deployments))
72+
{:ok, deployments}
73+
_ ->
74+
{:error, status_code}
75+
end
76+
end
77+
end

lib/exkube.ex

+49-1
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@ defmodule Exkube.Base do
77
use HTTPoison.Base
88
require Logger
99

10+
@kube_user Application.get_env(:exkube, :kube_user)
11+
@kube_password Application.get_env(:exkube, :kube_password)
12+
@insecure_ca Application.get_env(:exkube, :insecure_ca)
13+
@endpoint Application.get_env(:exkube, :api_url)
14+
1015
@doc """
1116
Checks the health endpoint of Kubernetes cluster
1217
1318
Returns `{:ok, "ok"}` if healthy or `{:error, %{status_code, body}}` if not
1419
"""
1520
def status(api_url) do
1621
url = api_url <> "/healthz"
17-
result = HTTPoison.request!(:get, url, "", [], hackney: [Application.get_env(:exkube, :insecure_ca)])
22+
result = HTTPoison.request!(:get, url, "", [], hackney: [@insecure_ca])
1823
%HTTPoison.Response{status_code: status_code, body: body} = result
1924

2025
case status_code do
@@ -24,4 +29,47 @@ defmodule Exkube.Base do
2429
{:error, %{status_code: status_code, body: body}}
2530
end
2631
end
32+
33+
@doc """
34+
Processes the status code out of a response and returns a tuple
35+
"""
36+
def process_response_status_code(body, status_code) do
37+
case status_code do
38+
403 ->
39+
{:error, :forbidden}
40+
404 ->
41+
{:error, :not_found}
42+
200 ->
43+
data = JSON.decode!(body)
44+
{:ok, data}
45+
201 ->
46+
data = JSON.decode!(body)
47+
{:ok, data}
48+
_ ->
49+
data = JSON.decode!(body)
50+
{:error, status_code: status_code, body: data}
51+
end
52+
end
53+
54+
@doc """
55+
Builds up a URL
56+
"""
57+
def process_url(url) do
58+
@endpoint <> url
59+
end
60+
61+
@doc """
62+
Adds in the necessary auth headers if they exist
63+
"""
64+
def process_request_options(options) do
65+
options ++ [hackney: [@insecure_ca, basic_auth: {@kube_user, @kube_password}]]
66+
end
67+
68+
@doc """
69+
Adds in the necessary headers
70+
"""
71+
def process_request_headers(headers) do
72+
headers ++ [{"Content-Type", "application/json"}]
73+
end
74+
2775
end

lib/namespaces.ex

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
defmodule Exkube.Namespaces do
2+
@moduledoc """
3+
This module contains functions for working with Namespaces
4+
"""
5+
6+
use HTTPoison.Base
7+
8+
require Logger
9+
alias Exkube.Base
10+
11+
@doc """
12+
This gets all of the Namespaces
13+
"""
14+
def all do
15+
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} = Base.get("api/v1/namespaces")
16+
processed = Base.process_response_status_code(body, status_code)
17+
18+
# We need to process the result a bit to extract only the Namespace names
19+
case processed do
20+
{:ok, data} ->
21+
namespaces = Enum.reduce(data["items"], [],
22+
fn(n), acc ->
23+
[n["metadata"]["name"] | acc]
24+
end
25+
)
26+
{:ok, namespaces}
27+
_ ->
28+
{:error, status_code}
29+
end
30+
end
31+
32+
@doc """
33+
This retrieves the details for one Namespace if it exists
34+
"""
35+
def one(%{namespace: namespace}) do
36+
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} = Base.get("api/v1/namespaces/" <> namespace)
37+
Base.process_response_status_code(body, status_code)
38+
end
39+
40+
@doc """
41+
This creates a new Namespace if it doesn't exist
42+
"""
43+
def create(%{namespace: namespace}) do
44+
body = Poison.encode!(%{
45+
kind: "Namespace",
46+
apiVersion: "v1",
47+
metadata: %{
48+
name: namespace,
49+
labels: %{
50+
name: namespace
51+
}
52+
}
53+
})
54+
55+
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} = Base.post("api/v1/namespaces", body)
56+
Base.process_response_status_code(body, status_code)
57+
end
58+
59+
@doc """
60+
This creates a new Namespace if it doesn't exist
61+
"""
62+
def delete(%{namespace: namespace}) do
63+
{:ok, %HTTPoison.Response{status_code: status_code, body: body}} = Base.delete("api/v1/namespaces/" <> namespace)
64+
Base.process_response_status_code(body, status_code)
65+
end
66+
67+
end

lib/persistent_volume_claims.ex

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
defmodule Exkube.PersistentVolumeClaims do
2+
@moduledoc """
3+
This contains functions for working with Persistent Volumes Claims
4+
"""
5+
6+
@doc """
7+
This gets all of the Persistent Volume Claims from all Namespaces
8+
"""
9+
def all do
10+
11+
end
12+
13+
@doc """
14+
This gets all of the Persistent Volume Claims from a Namespace
15+
"""
16+
def all(%{"namespace" => namespace}) do
17+
18+
end
19+
end

lib/persistent_volumes.ex

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
defmodule Exkube.PersistentVolumes do
2+
@moduledoc """
3+
This contains functions for working with Persistent Volumes
4+
"""
5+
6+
@doc """
7+
This gets all of the Persistent Volumes from all Namespaces
8+
"""
9+
def all do
10+
11+
end
12+
13+
@doc """
14+
This gets all of the Persistent Volumes from a Namespace
15+
"""
16+
def all(%{"namespace" => namespace}) do
17+
18+
end
19+
end

lib/pods.ex

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
defmodule Exkube.Pods do
2+
@moduledoc """
3+
This module contains functions for working with Kubernetes Pods
4+
"""
5+
6+
@doc """
7+
Gets all of the Pods from all Namespaces
8+
"""
9+
def all do
10+
11+
end
12+
13+
@doc """
14+
Gets all of the Pods from a specific Namespace
15+
"""
16+
def all(%{"namespace" => namespace}) do
17+
18+
end
19+
end

test/deployments_test.exs

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
defmodule Exkube.DeploymentsTest do
2+
@moduledoc """
3+
Tests for the Namespaces module
4+
"""
5+
use ExUnit.Case, async: true
6+
alias Exkube.Deployments
7+
require Logger
8+
9+
test "can list deployments", %{} do
10+
result = Deployments.all
11+
assert elem(result, 0) == :ok
12+
end
13+
#
14+
# test "can get one namespace", %{} do
15+
# result = Namespaces.one(%{namespace: "uops"})
16+
# assert elem(result, 0) == :ok
17+
# end
18+
#
19+
# test "can create and delete new namespace", %{} do
20+
# name = "test-" <> Integer.to_string(:rand.uniform(1000))
21+
# result = Namespaces.create(%{namespace: name})
22+
# assert elem(result, 0) == :ok
23+
# result = Namespaces.delete(%{namespace: name})
24+
# assert elem(result, 0) == :ok
25+
# end
26+
27+
end

test/namespaces_test.exs

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
defmodule Exkube.NamespacesTest do
2+
@moduledoc """
3+
Tests for the Namespaces module
4+
"""
5+
use ExUnit.Case, async: true
6+
alias Exkube.Namespaces
7+
require Logger
8+
9+
test "can list namespaces", %{} do
10+
result = Namespaces.all
11+
assert elem(result, 0) == :ok
12+
end
13+
14+
test "can get one namespace", %{} do
15+
result = Namespaces.one(%{namespace: "uops"})
16+
assert elem(result, 0) == :ok
17+
end
18+
19+
test "can create and delete new namespace", %{} do
20+
name = "test-" <> Integer.to_string(:rand.uniform(1000))
21+
result = Namespaces.create(%{namespace: name})
22+
assert elem(result, 0) == :ok
23+
result = Namespaces.delete(%{namespace: name})
24+
assert elem(result, 0) == :ok
25+
end
26+
27+
end

0 commit comments

Comments
 (0)