diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..8dc056d3ec08c84cd6ebf70a17a6f7c526a882eb --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,61 @@ +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 diff --git a/.gitmodules b/.gitmodules index b7f611afd1125ab2232e3381104ffdae348eb447..65161492f0b2238d7869890ea8d3a2ac2e12c569 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 diff --git a/CRI_Cluster_Monitor b/CRI_Cluster_Monitor new file mode 160000 index 0000000000000000000000000000000000000000..14479ffde246b1526b7059cc7638b9b183de9f0a --- /dev/null +++ b/CRI_Cluster_Monitor @@ -0,0 +1 @@ +Subproject commit 14479ffde246b1526b7059cc7638b9b183de9f0a diff --git a/CRI_XCBC b/CRI_XCBC index 89297776283f025d8b51e4f83dc7ac78f3ada92b..0d1a06538ef0e6bea7940a426bc5bd2fe628591c 160000 --- a/CRI_XCBC +++ b/CRI_XCBC @@ -1 +1 @@ -Subproject commit 89297776283f025d8b51e4f83dc7ac78f3ada92b +Subproject commit 0d1a06538ef0e6bea7940a426bc5bd2fe628591c diff --git a/external-network/main.tf b/external-network/main.tf index 403064c8d8b40ca0fffb1f33a0a6b005ee8f45cc..9556f4f6fbeb7843ea6bf667529926244ff0f51b 100644 --- a/external-network/main.tf +++ b/external-network/main.tf @@ -1,12 +1,20 @@ +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" { diff --git a/floating-ip/floating-main.tf b/floating-ip/floating-main.tf index a9581cfc9f299dd9ae31fcfe91cc2512f796ca57..0fbd567977d11e9d11c287065e0687ee0477afa6 100644 --- a/floating-ip/floating-main.tf +++ b/floating-ip/floating-main.tf @@ -1,5 +1,22 @@ 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" { diff --git a/internal-network/main.tf b/internal-network/main.tf index c3ad09bafadfded0e1305f5a0532d5373780e240..e2837d3bd6d7944c51f4698e3bc1585b7a667675 100644 --- a/internal-network/main.tf +++ b/internal-network/main.tf @@ -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 +} diff --git a/key-pair/main.tf b/key-pair/main.tf index c65cda4ffc656ab1241197ed6d0a15533547bdaf..a47d89849b856b3b91cbf706a97e61b483b2faf3 100644 --- a/key-pair/main.tf +++ b/key-pair/main.tf @@ -1,9 +1,26 @@ 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 } diff --git a/main.tf b/main.tf index c95d2c2cd8f849093eb79e9e6b66e942429db731..4f7148279d22f2a84de66838235906f412e3b69d 100644 --- a/main.tf +++ b/main.tf @@ -1,30 +1,17 @@ -# 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"] +# } } diff --git a/nodes/main.tf b/nodes/main.tf index dfeeeadd5fa32df3107c5e63258e0833506de556..4d7326df068248fa991ac5e5eae70c2258d790c7 100644 --- a/nodes/main.tf +++ b/nodes/main.tf @@ -1,15 +1,29 @@ -# 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 } } diff --git a/ohpc-instance/main.tf b/ohpc-instance/main.tf index cf39081368c88a4208823ef9ea0af75dcf87ee35..013957f9d7c0e35f8e33b6881da50bd537aade11 100644 --- a/ohpc-instance/main.tf +++ b/ohpc-instance/main.tf @@ -1,28 +1,35 @@ # 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 } diff --git a/ood-instance/main.tf b/ood-instance/main.tf index a6a4419dd94634936cb51b31187cb4349bf6656f..0db6ea2ccb413d3773644caa3f4bfd6c652bcb62 100644 --- a/ood-instance/main.tf +++ b/ood-instance/main.tf @@ -1,24 +1,40 @@ # 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) - } } diff --git a/vars.tf b/vars.tf index 00bbcd100a31a4f8cee76c2d3e64636e339588e9..4a2526d1f3002a7f8652c740c5d0dcc460b16f55 100644 --- a/vars.tf +++ b/vars.tf @@ -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}