From 680bce2f3ee2aacd26290879275f09c7cbfb9475 Mon Sep 17 00:00:00 2001 From: gatici Date: Wed, 31 Jan 2024 14:13:57 +0300 Subject: [PATCH] Add the Terraform module Signed-off-by: gatici --- terraform/.gitignore | 37 +++++++++++++++++ terraform/CONTRIBUTING.md | 86 +++++++++++++++++++++++++++++++++++++++ terraform/README.md | 72 ++++++++++++++++++++++++++++++++ terraform/main.tf | 55 +++++++++++++++++++++++++ terraform/outputs.tf | 4 ++ terraform/terraform.tf | 11 +++++ terraform/variables.tf | 29 +++++++++++++ 7 files changed, 294 insertions(+) create mode 100644 terraform/.gitignore create mode 100644 terraform/CONTRIBUTING.md create mode 100644 terraform/README.md create mode 100644 terraform/main.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/terraform.tf create mode 100644 terraform/variables.tf diff --git a/terraform/.gitignore b/terraform/.gitignore new file mode 100644 index 0000000..bfb2fa2 --- /dev/null +++ b/terraform/.gitignore @@ -0,0 +1,37 @@ +.idea/* +.vscode/* +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc +.terraform.lock.hcl \ No newline at end of file diff --git a/terraform/CONTRIBUTING.md b/terraform/CONTRIBUTING.md new file mode 100644 index 0000000..9a421a2 --- /dev/null +++ b/terraform/CONTRIBUTING.md @@ -0,0 +1,86 @@ +# Contributing + +## Development environment + +### Prerequisites + +Make sure the following software and tools are installed in the development +environment. + +- `microk8s` +- `juju` +- `terraform` + +### Prepare Development Environment + +Install Microk8s: + +```console +sudo snap install microk8s --channel=1.27-strict/stable +sudo usermod -a -G snap_microk8s $USER +newgrp snap_microk8s +``` + +Enable `storage` plugin for Microk8s: + +```console +sudo microk8s enable hostpath-storage +``` + +Install Juju: + +```console +sudo snap install juju --channel=3.1/stable +``` + +Install Terraform: + +```console +sudo snap install --classic terraform +``` + +Bootstrap the Juju Controller using Microk8s: + +```console +juju bootstrap microk8s +``` + +Add a Juju model: + +```console +juju add model +```` + +### Terraform provider + +The Terraform module uses the Juju provider to provision Juju resources. Please refer to the [Juju provider documentation](https://registry.terraform.io/providers/juju/juju/latest/docs) for more information. + +A Terraform working directory needs to be initialized at the beginning. + +Initialise the provider: + +```console +terraform init +``` + +## Testing + +Terraform CLI provides various ways to do formatting and validation. + +Formats to a canonical format and style: + +```console +terraform fmt +``` + +Check the syntactical validation: + +```console +terraform validate +``` + +Preview the changes: + +```console +terraform plan +``` diff --git a/terraform/README.md b/terraform/README.md new file mode 100644 index 0000000..3474679 --- /dev/null +++ b/terraform/README.md @@ -0,0 +1,72 @@ +# SD-Core PCF K8s Terraform Module + +This SD-Core PCF K8s Terraform module aims to deploy the [sdcore-pcf-k8s charm](https://charmhub.io/sdcore-pcf-k8s) via Terraform. + +## Getting Started + +### Prerequisites + +The following software and tools needs to be installed and should be running in the local environment. + +- `microk8s` +- `juju 3.x` +- `terrafom` + +### Deploy the sdcore-pcf-k8s charm using Terraform + +Make sure that `storage` plugin is enabled for Microk8s: + +```console +sudo microk8s enable hostpath-storage +``` + +Add a Juju model: + +```console +juju add model +``` + +Initialise the provider: + +```console +terraform init +``` + +Customize the configuration inputs under `terraform.tfvars` file according to requirement. + +Replace the `model-name` value in the `terraform.tfvars` file: + +```yaml +model_name = +db_application_name = +certs_application_name = +nrf_application_name = +``` + +Run Terraform Plan by providing var-file: + +```console +terraform plan -var-file="terraform.tfvars" +``` + +Deploy the resources, skip the approval: + +```console +terraform apply -auto-approve +``` + +### Check the Output + +Run `juju switch ` to switch to the target Juju model and observe the status of the applications. + +```console +juju status --relations +``` + +### Clean up + +Remove the applications: + +```console +terraform destroy -auto-approve +``` diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 0000000..63b16a0 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,55 @@ +resource "juju_application" "pcf" { + name = "pcf" + model = var.model_name + + charm { + name = "sdcore-pcf-k8s" + channel = var.channel + } + + units = 1 + trust = true +} + +resource "juju_integration" "pcf-db" { + model = var.model_name + + application { + name = juju_application.pcf.name + endpoint = "database" + } + + application { + name = var.db_application_name + endpoint = "database" + } +} + +resource "juju_integration" "pcf-certs" { + model = var.model_name + + application { + name = juju_application.pcf.name + endpoint = "certificates" + } + + application { + name = var.certs_application_name + endpoint = "certificates" + } +} + +resource "juju_integration" "pcf-nrf" { + model = var.model_name + + application { + name = juju_application.pcf.name + endpoint = "fiveg_nrf" + } + + application { + name = var.nrf_application_name + endpoint = "fiveg-nrf" + } +} + diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 0000000..7055bf3 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,4 @@ +output "pcf_application_name" { + description = "Name of the deployed application." + value = juju_application.pcf.name +} \ No newline at end of file diff --git a/terraform/terraform.tf b/terraform/terraform.tf new file mode 100644 index 0000000..545a7bb --- /dev/null +++ b/terraform/terraform.tf @@ -0,0 +1,11 @@ +# Copyright 2023 Canonical Ltd. +# See LICENSE file for licensing details. + +terraform { + required_providers { + juju = { + source = "juju/juju" + version = "~> 0.10.1" + } + } +} diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 0000000..2e8271a --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,29 @@ +variable "model_name" { + description = "Name of Juju model to deploy application to." + type = string + default = "" +} + +variable "channel" { + description = "The channel to use when deploying a charm." + type = string + default = "1.3/edge" +} + +variable "db_application_name" { + description = "The name of the application providing the `database` endpoint." + type = string + default = "" +} + +variable "certs_application_name" { + description = "Name of the application providing the `certificates` integration endpoint." + type = string + default = "" +} + +variable "nrf_application_name" { + description = "The name of the application providing the `fiveg_nrf` endpoint." + type = string + default = "" +} \ No newline at end of file