Skip to content
Snippets Groups Projects
Commit 975f7446 authored by Ravi Tripathi's avatar Ravi Tripathi
Browse files

Add CD feature to the repo:

1. Add a GitLab CD file to deploy the images created at [ohpc-packer](https://gitlab.rc.uab.edu/rc/ohpc-packer) via Terraform.
2. Use the existing routers and networks for Terraform deploy
3. Added a submodule for [CRI_Cluster_Monitor](https://github.com/eesaanatluri/CRI_Cluster_Monitor) and updated the existing one for [CRI_XCBC](https://github.com/jprorama/CRI_XCBC)
4. Refactored code to work with newer versions (>1.3) of terraform.
parent a989cafb
No related branches found
No related tags found
No related merge requests found
image: gitlab.rc.uab.edu:4567/rc/packer-openstack-hpc-image:latest
variables:
ANSIBLE_REMOTE_TMP: "/tmp"
OS_REGION_NAME: "bhm1"
OS_INTERFACE: "public"
OS_IDENTITY_API_VERSION: "3"
OS_AUTH_TYPE: "v3applicationcredential"
OS_AUTH_URL: "https://keystone.cloud.rc.uab.edu:5000/v3"
TF_ROOT: ${CI_PROJECT_DIR}/
TF_VAR_internal_network: "xdmod-packer-clusternet"
TF_VAR_external_network: "xdmod-packer-dmznet"
TF_VAR_flavor: "m1.medium"
GIT_SUBMODULE_STRATEGY: "recursive"
GIT_SUBMODULE_UPDATE_FLAGS: "--force"
cache:
paths:
- .terraform
- .terraform.lock.hcl
- terraform.tfstate
stages: # List of stages for jobs, and their order of execution
- validate
- build
- deploy
- cleanup
tf-validate:
stage: validate
tags: [build]
script:
- cd CRI_XCBC && git checkout dev && cd ..
- terraform --version
- terraform init
- terraform validate
- pwd
- terraform plan
- 'sed -i -E "s/(cod_deploy: ).*/\1false/" CRI_XCBC/group_vars/all'
tf-apply:
cache:
paths:
- .terraform/
stage: build
tags: [build]
script:
- export BUILD_DATE=$(TZ=America/Chicago date +%Y%m%d%H%M%S)
- XDMOD_IMAGES=($(openstack image list --sort-column Name --sort-descending -f value -c Name -c ID | grep -P ' xdmod-\d{14}$' | awk '{print $2}'))
- export TF_VAR_image_ohpc="${XDMOD_IMAGES[0]}"
# - export TF_VAR_image_ohpc="xdmod-20230629191611"
- echo $TF_VAR_image_ohpc
- export TF_VAR_keypair_name="os-gen-keypair-$BUILD_DATE"
- terraform apply -auto-approve || terraform destroy -auto-approve
clean-up:
stage: cleanup
tags: [build]
script:
- terraform destroy -auto-approve
when: manual
......@@ -2,3 +2,7 @@
path = CRI_XCBC
url = https://github.com/jprorama/CRI_XCBC.git
branch = feat-openstack
[submodule "CRI_Cluster_Monitor"]
path = CRI_Cluster_Monitor
url = https://github.com/eesaanatluri/CRI_Cluster_Monitor.git
Subproject commit 14479ffde246b1526b7059cc7638b9b183de9f0a
Subproject commit 89297776283f025d8b51e4f83dc7ac78f3ada92b
Subproject commit 0d1a06538ef0e6bea7940a426bc5bd2fe628591c
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
# is created as a datasource this module and called in root module
variable "public_network_name" {type = "string"}
variable "public_network_name" {type = string}
variable "name" {default = "dmz"}
variable "admin_state_up" {}
variable "enable_dhcp" {}
data "openstack_networking_network_v2" "public_network" {name = var.public_network_name}
# creates dmznet
......@@ -36,8 +44,9 @@ resource "openstack_networking_router_interface_v2" "router" {
subnet_id = openstack_networking_subnet_v2.external_subnet.id
}
output "external_network_id" {
value = data.openstack_networking_network_v2.public_network.id
output "id" {
value = openstack_networking_network_v2.external_network.id
depends_on = [openstack_networking_subnet_v2.external_subnet]
}
output "external_subnet_id" {
......
variable "public_network_name" {}
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
provider "openstack" {
use_octavia = true
endpoint_overrides = {
"network" = "https://neutron-api.cloud.rc.uab.edu:9696/v2.0/"
}
}
# defines where floating ip will come from using variable public_network_name defined in root module
resource "openstack_networking_floatingip_v2" "ohpc_ip" {
......
......@@ -2,6 +2,23 @@ variable "name" {default = "cluster"}
variable "admin_state_up" { }
variable "enable_dhcp" {}
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
provider "openstack" {
use_octavia = true
endpoint_overrides = {
"network" = "https://neutron-api.cloud.rc.uab.edu:9696/v2.0/"
}
}
# creates clusternet
resource "openstack_networking_network_v2" "internal_network" {
name = "${var.name}net"
......@@ -18,10 +35,11 @@ resource "openstack_networking_subnet_v2" "internal_subnet" {
enable_dhcp = var.enable_dhcp
}
output "internal_network_id" {
value = openstack_networking_network_v2.internal_network.id
output "id" {
value = openstack_networking_network_v2.internal_network.id
depends_on = [openstack_networking_subnet_v2.internal_subnet]
}
output "internal_subnet_id" {
value = openstack_networking_subnet_v2.internal_subnet.id
}
\ No newline at end of file
}
variable "keypair_name" {}
variable "ssh_public_key" {}
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
provider "openstack" {
use_octavia = true
endpoint_overrides = {
"network" = "https://neutron-api.cloud.rc.uab.edu:9696/v2.0/"
}
}
resource "openstack_compute_keypair_v2" "keypair" {
name = var.keypair_name
public_key = file(var.ssh_public_key)
public_key = var.ssh_public_key
}
output "keypair_name" {
......@@ -11,5 +28,5 @@ output "keypair_name" {
}
output "public_key" {
value = file(var.ssh_public_key)
value = var.ssh_public_key
}
# runs the external-network module
module "dmz-network" {
source = "./external-network"
# Default name var is in the module main file
admin_state_up = var.admin_state_up
enable_dhcp = var.enable_dhcp
public_network_name = var.public_network_name
}
# calls the outputs defined in the external-network module
output "external_network_id" {
value = "${module.dmz-network.external_network_id}"
}
output "router_id" {
value = "${module.dmz-network.router_id}"
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
# runs the internal-network module
module "cluster-network" {
source = "./internal-network"
# Default name var is in the module main file
admin_state_up = var.admin_state_up
enable_dhcp = var.enable_dhcp
}
# calls the outputs defined in the internal-network module
output "internal_network_id" {
value = "${module.cluster-network.internal_network_id}"
provider "openstack" {
endpoint_overrides = {
"network" = "https://neutron-api.cloud.rc.uab.edu:9696/v2.0/"
}
}
# runs the floating-ip module - uses public network name defined above
......@@ -35,12 +22,12 @@ module "floating-ip-address" {
# calls the outputs defined in the floating-ip module
output "floating_ip_ohpc" {
value = "${module.floating-ip-address.ohpc_address}"
value = module.floating-ip-address.ohpc_address
}
output "floating_ip_ood" {
value = "${module.floating-ip-address.ood_address}"
}
#output "floating_ip_ood" {
# value = module.floating-ip-address.ood_address
#}
# runs the key-pair module - imports local public key into openstack and give it the name defined above in the variables
module "import-keypair" {
......@@ -51,66 +38,65 @@ module "import-keypair" {
# calls the outputs defined in the key-pair module
output "keypair_name" {
value = "${module.import-keypair.keypair_name}"
value = module.import-keypair.keypair_name
}
data "openstack_networking_network_v2" "external_net" {name = var.external_network}
data "openstack_networking_network_v2" "internal_net" {name = var.internal_network}
# runs the ohpc-instance module - creates ohpc instance using variables defined above
# calls functions from dmz-network, import-keypair, and floating-ip-address modules to get values created there for use
module "create-ohpc-instance" {
external_subnet_id = "${module.dmz-network.external_subnet_id}"
source = "./ohpc-instance"
ohpc_instance_name = var.ohpc_instance_name
image_ohpc = var.image_ohpc
flavor = var.flavor
key_pair = "${module.import-keypair.keypair_name}"
external_network = var.external_network
internal_network = var.internal_network
key_pair = module.import-keypair.keypair_name
external_network = data.openstack_networking_network_v2.external_net.id
internal_network = data.openstack_networking_network_v2.internal_net.id
internal_ip = var.ohpc_private_ip
floating_ip_ohpc = "${module.floating-ip-address.ohpc_address}"
host_prefix = var.host_prefix
floating_ip_ohpc = module.floating-ip-address.ohpc_address
ohpc_user = var.ohpc_user
ssh_private_key = var.ssh_private_key
}
# runs the ood-instance module - creates ood instance using variables defined above
# calls functions from cluster-network, import-keypair, and floating-ip-address modules to get values created there for use
module "create-ood-instance" {
internal_subnet_id = "${module.cluster-network.internal_subnet_id}"
source = "./ood-instance"
ood_instance_name = var.ood_instance_name
image_ood = var.image_ood
flavor = var.flavor
key_pair = "${module.import-keypair.keypair_name}"
internal_network = var.internal_network
internal_ip = var.ood_private_ip
external_network = var.external_network
floating_ip_ood = "${module.floating-ip-address.ood_address}"
host_prefix = var.host_prefix
ood_user = var.ood_user
ssh_private_key = var.ssh_private_key
}
#module "create-ood-instance" {
# internal_subnet_id = module.cluster-network.internal_subnet_id
# source = "./ood-instance"
# ood_instance_name = var.ood_instance_name
# image_ood = var.image_ood
# flavor = var.flavor
# key_pair = module.import-keypair.keypair_name
# internal_network = var.internal_network
# external_network = var.external_network
# floating_ip_ood = module.floating-ip-address.ood_address
# host_prefix = var.host_prefix
# ood_user = var.ood_user
# ssh_private_key = var.ssh_private_key
#}
# runs the nodes module - creates nodes using variables defined above
# calls functions from cluster-network and import-keypair modules to get values created there for use
module "nodes" {
internal_subnet_id = "${module.cluster-network.internal_subnet_id}"
source = "./nodes"
image_compute = var.image_compute
flavor = var.flavor
key_pair = "${module.import-keypair.keypair_name}"
key_pair = module.import-keypair.keypair_name
compute_node_count = var.compute_node_count
internal_network = var.internal_network
internal_network = data.openstack_networking_network_v2.internal_net.id
}
# calls the outputs defined in the ohpc-instance module
output "ohpc-ssh_host" {
value = "${module.create-ohpc-instance.ssh_host}"
value = module.create-ohpc-instance.ssh_host
}
# calls the outputs defined in the ood-instance module
output "ood-ssh_host" {
value = "${module.create-ood-instance.ssh_host}"
}
#output "ood-ssh_host" {
# value = module.create-ood-instance.ssh_host
#}
# compute node and ood post provision
# use single null_resource for serial provisioner runs to avoid race conditions
......@@ -124,26 +110,36 @@ resource "null_resource" "ops" {
connection {
host = module.create-ohpc-instance.ssh_host
user = var.ohpc_user
private_key = file(var.ssh_private_key)
private_key = var.ssh_private_key
}
# moves CRI_XCBC file into directory made above
provisioner "file" {
source = "CRI_XCBC"
destination = "/"
provisioner "remote-exec" {
inline = [
"ls -al /CRI_XCBC",
]
}
# moves CRI_XCBC file into directory made above
# compute node
provisioner "remote-exec" {
provisioner "remote-exec" {
inline = [
for node, net in module.nodes.network:
"ansible-playbook -c local -i /CRI_XCBC/hosts -l `hostname -s` -e \"{'compute_nodes':[{'name':'${node}', 'ip':'${net[0].fixed_ip_v4}', 'mac':'${net[0].mac}', 'vnfs':'', 'sockets':'1', 'corespersocket':'1'}]}\" /CRI_XCBC/site-ops.yaml -b -v"]
"sudo sed -i -E 's/xdmod..nip.io/xdmod.rc.uab.edu/g' /etc/httpd/conf.d/xdmod.conf",
"sudo sed -i -E 's/xdmod..nip.io/xdmod.rc.uab.edu/g' /etc/xdmod/simplesamlphp/config/config.php",
"sudo systemctl restart httpd",
]
}
# ood node
# compute node registration on ohpc
provisioner "remote-exec" {
inline = [
for net in module.create-ood-instance.network:
"ansible-playbook -c local -i /CRI_XCBC/hosts -l `hostname -s` -e \"{'compute_nodes':[{'name':'${var.ood_instance_name}', 'ip':'${net.fixed_ip_v4}', 'mac':'${net.mac}', 'vnfs':'', 'sockets':'1', 'corespersocket':'1'}]}\" /CRI_XCBC/site-ops.yaml -b -v"]
for node, net in module.nodes.network:
"ansible-playbook -c local -i /CRI_XCBC/hosts -l `hostname -s` -e \"{'cod_deploy':'false', 'compute_nodes':[{'name':'${node}', 'ip':'${net[0].fixed_ip_v4}', 'mac':'${net[0].mac}', 'vnfs':'', 'sockets':'1', 'corespersocket':'1'}]}\" /CRI_XCBC/site-ops.yaml -b -v"
]
}
# ood node
# provisioner "remote-exec" {
# inline = [
# for net in module.create-ood-instance.network:
# "ansible-playbook -c local -i /CRI_XCBC/hosts -l `hostname -s` -e \"{'compute_nodes':[{'name':'${var.ood_instance_name}', 'ip':'${net.fixed_ip_v4}', 'mac':'${net.mac}', 'vnfs':'', 'sockets':'1', 'corespersocket':'1'}]}\" /CRI_XCBC/site-ops.yaml -b -v"]
# }
}
# is created in internal-network module and called in root module
variable "internal_subnet_id" {type = "string"}
variable "image_compute" {}
variable "flavor" {}
# is created in key-pair module and called in root module
variable "key_pair" {type = "string"}
variable "key_pair" {type = string}
variable "compute_node_count" { }
variable "internal_network" {}
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
provider "openstack" {
use_octavia = true
endpoint_overrides = {
"network" = "https://neutron-api.cloud.rc.uab.edu:9696/v2.0/"
}
}
data "openstack_images_image_v2" "compute" {
name = var.image_compute
most_recent = true
......@@ -17,7 +31,6 @@ data "openstack_images_image_v2" "compute" {
# creates compute node
resource "openstack_compute_instance_v2" "compute" {
depends_on = [var.internal_subnet_id]
name = "c${count.index}"
image_id = data.openstack_images_image_v2.compute.id
flavor_name = var.flavor
......@@ -35,7 +48,7 @@ resource "openstack_compute_instance_v2" "compute" {
# defines the networks of the instance
network {
name = var.internal_network
uuid = var.internal_network
}
}
......
# is created in external-network module and called in root module
variable "external_subnet_id" {type = "string"}
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
variable "ohpc_instance_name" {}
variable "image_ohpc" {}
variable "flavor" {}
# is created in key-pair module and called in root module
variable "key_pair" {type = "string"}
variable "key_pair" {type = string}
variable "internal_network" {}
variable "internal_ip" {}
variable "external_network" {}
# is created in floating-ip module and called in root module
variable "floating_ip_ohpc" {type = "string"}
variable "floating_ip_ohpc" {type = string}
variable "host_prefix" {}
variable "ohpc_user" {}
variable "ssh_private_key" {}
# creates details for the OHPC instance
resource "openstack_compute_instance_v2" "ohpc" {
depends_on = [var.external_subnet_id]
name = var.ohpc_instance_name
image_name = var.image_ohpc
flavor_name = var.flavor
......@@ -40,10 +47,10 @@ resource "openstack_compute_instance_v2" "ohpc" {
# defines the networks of the instance
network {
name = var.external_network
uuid = var.external_network
}
network {
name = var.internal_network
uuid = var.internal_network
fixed_ip_v4 = var.internal_ip
}
}
......@@ -52,13 +59,6 @@ resource "openstack_compute_instance_v2" "ohpc" {
resource "openstack_compute_floatingip_associate_v2" "ohpc" {
floating_ip = var.floating_ip_ohpc
instance_id = openstack_compute_instance_v2.ohpc.id
# defines ssh connection
connection {
host = format(var.host_prefix,element(split(".", var.floating_ip_ohpc),3,),)
user = var.ohpc_user
private_key = file(var.ssh_private_key)
}
}
output "id" {
......@@ -66,5 +66,5 @@ output "id" {
}
output "ssh_host" {
value = format(var.host_prefix,element(split(".", var.floating_ip_ohpc),3,),)
value = var.floating_ip_ohpc
}
# is created in internal-network module and called in root module
variable "internal_subnet_id" {type = "string"}
variable "internal_subnet_id" {type = string}
variable "ood_instance_name" {}
variable "image_ood" {}
variable "flavor" {}
# is created in key-pair module and called in root module
variable "key_pair" {type = "string"}
variable "key_pair" {type = string}
variable "internal_network" {}
variable "internal_ip" {}
variable "external_network" {}
# is created in floating-ip module and called in root module
variable "floating_ip_ood" {type = "string"}
variable "floating_ip_ood" {type = string}
variable "host_prefix" {}
variable "ood_user" {}
variable "ssh_private_key" {}
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.42.0"
}
}
}
provider "openstack" {
use_octavia = true
endpoint_overrides = {
"network" = "https://neutron-api.cloud.rc.uab.edu:9696/v2.0/"
}
}
# creates details for the OOD instance
resource "openstack_compute_instance_v2" "ood" {
......@@ -52,13 +68,6 @@ resource "openstack_compute_instance_v2" "ood" {
resource "openstack_compute_floatingip_associate_v2" "ood" {
floating_ip = var.floating_ip_ood
instance_id = openstack_compute_instance_v2.ood.id
# defines ssh connection
connection {
host = format(var.host-prefix,element(split(".", var.floating_ip_ood),3,),)
user = var.ood_user
private_key = file(var.ssh_private_key)
}
}
......
......@@ -6,7 +6,7 @@ variable "admin_state_up" {default = true}
variable "enable_dhcp" {default = true}
# variable for floating-ip - also used in exrernal network creation
variable "public_network_name" {default = "bright-external-flat-externalnet"}
variable "public_network_name" {default = "uab-campus"}
# variables for keypair module
variable "keypair_name" {default = "os-gen-keypair"}
......@@ -16,18 +16,17 @@ variable "ssh_public_key" {default = "~/.ssh/id_rsa.pub"}
variable "ohpc_instance_name" {default = "ohpc"}
variable "ohpc_private_ip" {default = "10.1.1.10"}
variable "ood_instance_name" { default = "ood"}
variable "image_ohpc" {default = "CentOS-7-x86_64-GenericCloud-1905"}
variable "image_ood" {default = "CentOS-7-x86_64-GenericCloud-1905"}
variable "image_ohpc" {default = "xdmod-20230614063844"}
variable "image_ood" {default = ""}
variable "ood_private_ip" {default = "10.1.1.11"}
variable "flavor" {default = "m1.medium"}
variable "flavor" {default = "m1.xlarge"}
variable "internal_network" {default = "clusternet"}
variable "external_network" {default = "dmznet"}
variable "host_prefix" {default = "164.111.161.%s"}
variable "ohpc_user" {default = "centos"}
variable "ood_user" {default = "centos"}
variable "ssh_private_key" {default = "~/.ssh/id_rsa"}
# variables for node creation module
variable "image_compute" {default = "CentOS-7-x86_64-GenericCloud-1905"}
variable "compute_node_count" {default = 2}
variable "image_compute" {default = "compute-v1"}
variable "compute_node_count" {default = 1}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment