@@ -7,58 +7,67 @@ defmodule Discovery.Resources.Deployment do
7
7
8
8
import Discovery.K8Config
9
9
10
+ @ template_path "#{ :code . priv_dir ( :discovery ) } /templates/deploy.yml"
11
+
10
12
@ spec create_deployment ( DeployUtils . app ( ) ) :: { :error , any ( ) } | { :ok , map ( ) }
11
13
def create_deployment ( app ) do
12
- with { :ok , map } <-
13
- "#{ :code . priv_dir ( :discovery ) } /templates/deploy.yml"
14
- |> YamlElixir . read_from_file ( atoms: false ) ,
15
- map <- put_in ( map [ "apiVersion" ] , api_version ( :deployment ) ) ,
16
- map <- put_in ( map , [ "metadata" , "name" ] , "#{ app . app_name } -#{ app . uid } " ) ,
17
- map <- put_in ( map , [ "metadata" , "annotations" , "app_id" ] , "#{ app . app_name } " ) ,
18
- map <- add_service_account ( map ) ,
19
- map <-
20
- put_in ( map , [ "spec" , "selector" , "matchLabels" , "app" ] , "#{ app . app_name } -#{ app . uid } " ) ,
21
- map <-
22
- put_in ( map , [ "spec" , "template" , "spec" , "imagePullSecrets" ] , [
23
- % { "name" => Application . get_env ( :discovery , :image_pull_secrets ) }
24
- ] ) ,
25
- map <-
26
- put_in (
27
- map ,
28
- [ "spec" , "template" , "metadata" , "labels" , "app" ] ,
29
- "#{ app . app_name } -#{ app . uid } "
30
- ) do
31
- deployment_container = map [ "spec" ] [ "template" ] [ "spec" ] [ "containers" ] |> hd
32
-
33
- deployment_container =
34
- put_in ( deployment_container [ "envFrom" ] , [
35
- % {
36
- "configMapRef" => % { "name" => "#{ app . app_name } -#{ app . uid } " }
37
- }
38
- ] )
39
-
40
- deployment_container = put_in ( deployment_container [ "image" ] , "#{ app . app_image } " )
41
- deployment_container = put_in ( deployment_container [ "name" ] , "#{ app . app_name } " )
42
-
43
- deployment_container =
44
- put_in ( deployment_container [ "ports" ] , [
45
- % {
46
- "containerPort" => app . app_container_port ,
47
- "name" => "#{ app . app_name } -port" ,
48
- "protocol" => "TCP"
49
- }
50
- ] )
51
-
52
- deployment_container = put_in ( deployment_container [ "resources" ] , resources ( ) )
53
-
54
- map = put_in ( map [ "spec" ] [ "template" ] [ "spec" ] [ "containers" ] , [ deployment_container ] )
55
-
56
- { :ok , map }
14
+ with { :ok , map } <- read_deployment_template ( ) ,
15
+ updated_map <- update_deployment_map ( map , app ) ,
16
+ { :ok , updated_map } <- update_container ( updated_map , app ) ,
17
+ { :ok , final_map } <- update_labels ( updated_map , app ) do
18
+ { :ok , final_map }
57
19
else
58
20
{ :error , _ } -> { :error , "error in creating deployment config" }
59
21
end
60
22
end
61
23
24
+ defp read_deployment_template ( ) do
25
+ "#{ @ template_path } "
26
+ |> YamlElixir . read_from_file ( atoms: false )
27
+ end
28
+
29
+ defp update_deployment_map ( map , app ) do
30
+ map =
31
+ map
32
+ |> put_in ( [ "apiVersion" ] , api_version ( :deployment ) )
33
+ |> put_in ( [ "metadata" , "name" ] , "#{ app . app_name } -#{ app . uid } " )
34
+ |> put_in ( [ "metadata" , "annotations" , "app_id" ] , "#{ app . app_name } " )
35
+ |> add_service_account ( )
36
+ |> put_in ( [ "spec" , "selector" , "matchLabels" , "app" ] , "#{ app . app_name } -#{ app . uid } " )
37
+ |> put_in ( [ "spec" , "template" , "spec" , "nodeSelector" ] , % {
38
+ "kubernetes.io/arch" => Application . get_env ( :discovery , :kubernetes_arch )
39
+ } )
40
+ |> put_in ( [ "spec" , "template" , "spec" , "imagePullSecrets" ] , [
41
+ % { "name" => Application . get_env ( :discovery , :image_pull_secrets ) }
42
+ ] )
43
+
44
+ { :ok , map }
45
+ end
46
+
47
+ defp update_container ( map , app ) do
48
+ [ deployment_container | _ ] = get_in ( map , [ "spec" , "template" , "spec" , "containers" ] )
49
+
50
+ deployment_container =
51
+ deployment_container
52
+ |> put_in ( [ "envFrom" ] , [ % { "configMapRef" => % { "name" => "#{ app . app_name } -#{ app . uid } " } } ] )
53
+ |> put_in ( [ "image" ] , "#{ app . app_image } " )
54
+ |> put_in ( [ "name" ] , "#{ app . app_name } " )
55
+ |> put_in ( [ "ports" ] , [
56
+ % {
57
+ "containerPort" => app . app_container_port ,
58
+ "name" => "#{ app . app_name } -port" ,
59
+ "protocol" => "TCP"
60
+ }
61
+ ] )
62
+ |> put_in ( [ "resources" ] , resources ( ) )
63
+
64
+ map |> put_in ( [ "spec" , "template" , "spec" , "containers" ] , [ deployment_container ] )
65
+ end
66
+
67
+ defp update_labels ( map , app ) do
68
+ map |> put_in ( [ "spec" , "template" , "metadata" , "labels" , "app" ] , "#{ app . app_name } -#{ app . uid } " )
69
+ end
70
+
62
71
@ spec write_to_file ( map , String . t ( ) ) :: :ok
63
72
def write_to_file ( map , location ) do
64
73
Utils . to_yml ( map , location )
0 commit comments