Skip to content

Commit

Permalink
[GH-11] introduce argo installation
Browse files Browse the repository at this point in the history
  • Loading branch information
johncosta committed Dec 10, 2023
1 parent eb49808 commit 105bcdc
Show file tree
Hide file tree
Showing 9 changed files with 198 additions and 7 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,12 @@ module "k8s" {
# writes the kubeconfig to the local filesystem
path_to_kubeconfig = "/full/path/to/.kube"
use_cluster_name_in_config = true
cluster_addons = {
argo = {
enabled = true
most_recent = true
}
}
}
```
26 changes: 24 additions & 2 deletions main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ data "digitalocean_kubernetes_versions" "version" {
version_prefix = var.cluster_version_prefix
}

resource "digitalocean_kubernetes_cluster" "cluster" {
resource "digitalocean_kubernetes_cluster" "this" {
name = local.cluster_name
region = var.cluster_region
version = data.digitalocean_kubernetes_versions.version.latest_version
Expand Down Expand Up @@ -45,6 +45,28 @@ resource "digitalocean_vpc" "vpc" {
resource "local_sensitive_file" "kubeconfig" {
count = local.create_kubeconfig ? 1 : 0

content = digitalocean_kubernetes_cluster.cluster.kube_config[0].raw_config
content = digitalocean_kubernetes_cluster.this.kube_config[0].raw_config
filename = local.full_path_to_kubeconfig

depends_on = [
digitalocean_kubernetes_cluster.this
]
}

module "cluster_addons" {
source = "./modules/cluster-addons"

# The module must be dependant on the kubeconfig creation. We pass these values to the module
# so that it can use them to configure the cluster addons
full_path_to_kubeconfig = local_sensitive_file.kubeconfig[0].filename
cluster_id = digitalocean_kubernetes_cluster.this.id

# Cluster Addons Configuration
cluster_addons = var.cluster_addons

providers = {
kubernetes = kubernetes.default
helm = helm.default
null = null.default
}
}
60 changes: 60 additions & 0 deletions modules/cluster-addons/argo.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
locals {
argo_config = lookup(var.cluster_addons, "argo", null)
argo_enabled = local.argo_config != null ? lookup(local.argo_config, "enabled", false) : false
argo_chart_version = local.argo_config != null ? lookup(local.argo_config, "chart_version", null) : null
namespace = "argo"
}

resource "null_resource" "kubeconfig" {
count = local.argo_enabled ? 1 : 0

provisioner "local-exec" {
command = "until [ -f ${var.full_path_to_kubeconfig} ]; do sleep 0.5; done"
}
}

resource "null_resource" "kubectl_get_all" {
count = local.argo_enabled ? 1 : 0

provisioner "local-exec" {
command = "kubectl get all -A; while [ $? -ne 0 ]; do kubectl get all -A; done"
}

depends_on = [
null_resource.kubeconfig
]
}

resource "kubernetes_namespace" "argo" {
count = local.argo_enabled ? 1 : 0

metadata {
name = local.namespace
}

depends_on = [
null_resource.kubeconfig,
null_resource.kubectl_get_all
]
}

resource "helm_release" "argo" {
count = local.argo_enabled ? 1 : 0

name = "argo"
namespace = local.namespace
repository = "https://argoproj.github.io/argo-helm"
chart = "argo-cd"
version = local.argo_chart_version

set {
name = "crds.install"
value = "true"
}

depends_on = [
kubernetes_namespace.argo,
null_resource.kubeconfig,
null_resource.kubectl_get_all
]
}
19 changes: 19 additions & 0 deletions modules/cluster-addons/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.24.0"
configuration_aliases = [kubernetes]
}
helm = {
source = "hashicorp/helm"
version = "~> 2.12.1"
configuration_aliases = [helm]
}
null = {
source = "hashicorp/null"
version = "~> 3.2.2"
configuration_aliases = [null]
}
}
}
3 changes: 3 additions & 0 deletions modules/cluster-addons/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
output "cluster_id" {
value = var.cluster_id
}
29 changes: 29 additions & 0 deletions modules/cluster-addons/variables.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
variable "full_path_to_kubeconfig" {
type = string
description = "Full path to the kubeconfig file"
}

variable "cluster_addons" {
type = map(
object({
enabled = bool
chart_version = string
})
)
description = <<EOT
cluster_addons = {
addon = {
enabled = false
chart_version = "1.0.0"
}
}
EOT
nullable = true
default = null
}

variable "cluster_id" {
type = string
description = "The cluster ID"
nullable = false
}
14 changes: 9 additions & 5 deletions outputs.tf
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
output "cluster_name" {
value = digitalocean_kubernetes_cluster.cluster.name
value = digitalocean_kubernetes_cluster.this.name
}

output "cluster_id" {
value = digitalocean_kubernetes_cluster.cluster.id
value = digitalocean_kubernetes_cluster.this.id
}

output "cluster_urn" {
value = digitalocean_kubernetes_cluster.cluster.urn
value = digitalocean_kubernetes_cluster.this.urn
}

output "cluster_endpoint" {
value = digitalocean_kubernetes_cluster.cluster.endpoint
value = digitalocean_kubernetes_cluster.this.endpoint
}

output "cluster_kube_config" {
value = digitalocean_kubernetes_cluster.cluster.kube_config
value = digitalocean_kubernetes_cluster.this.kube_config
}

output "full_path_to_kubeconfig" {
Expand All @@ -25,3 +25,7 @@ output "full_path_to_kubeconfig" {
output "environment_variable_kubeconfig" {
value = "export KUBECONFIG=${local.full_path_to_kubeconfig}"
}

output "cluster_addons" {
value = var.cluster_addons
}
28 changes: 28 additions & 0 deletions provider.tf
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,33 @@ terraform {
source = "hashicorp/local"
version = "~> 2.4.0"
}
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.24.0"
}
helm = {
source = "hashicorp/helm"
version = "~> 2.12.1"
}
null = {
source = "hashicorp/null"
version = "~> 3.2.2"
}
}
}

provider "kubernetes" {
alias = "default"
config_path = local_sensitive_file.kubeconfig[0].filename
}

provider "helm" {
alias = "default"
kubernetes {
config_path = local_sensitive_file.kubeconfig[0].filename
}
}

provider "null" {
alias = "default"
}
19 changes: 19 additions & 0 deletions variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,22 @@ variable "use_cluster_name_in_config" {
nullable = true
default = false
}

variable "cluster_addons" {
type = map(
object({
enabled = bool
chart_version = string
})
)
description = <<EOT
cluster_addons = {
addon = {
enabled = "true"
chart_version = "1.0.0"
}
}
EOT
nullable = true
default = null
}

0 comments on commit 105bcdc

Please sign in to comment.