diff --git a/activity-tracking/README.md b/activity-tracking/README.md new file mode 100644 index 0000000..5beb3a7 --- /dev/null +++ b/activity-tracking/README.md @@ -0,0 +1,70 @@ +# Generic Activity Tracking + +## Use Case: Pass Activity Tracking + +If you just want to include `pass` placeholder within a lab, use the following link. + +| Service | Method | Action | Link | +|---------|--------|--------|------| +| N/A | N/A | Demo a `pass` activity within a lab | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/pass_step_check) | + + +## Use Case: Service Exists Activity Tracking + +If you are spinning up a resource, it can be helpful to check the existence within a project. +Use the Terraform scripts below to validate a resource exists with generic activity tracking code. + +| Service | Method | Action | Link | +|---------|--------|--------|------| +| BigQuery | get_dataset | Check if a `dataset` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/bq_dataset_check) | +| Cloud Storage | get_bucket | Check if a `storage bucket` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/gcs_bucket_check) | +| Firewall | get_firewall | Check if a `firewall rule` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/fw_rule_check) | +| Logging | get_sink | Check if a `log sink` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/log_sink_check) | +| PubSub | get_topic | Check if a `Topic` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/pubsub_topic_check) | +| PubSub | get_subscription | Check if a `Subscription` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/pubsub_sub_check) | +| Source Repo | get_repo | Check if a `Repository` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/source_repo_check) | +| Compute | get_network | Check if a `network` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/vpc_network_check) | +| Compute | get_subnetwork | Check if a `subnetwork` is defined within a project | [Link](https://github.com/CloudVLab/terraform-lab-foundation/tree/main/activity-tracking/vpc_subnet_check) | + + +## Setup + +1. Amend the `variables.tf` file to set the name the `step` to be generated. + + +```terraform +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "bigquery_dataset_check" +} +``` + +__Note:__ The Terraform `default` value will determine the name of: + +- [ ] The file to be generated +- [ ] The name of the method to be created + +## Generate + +To generate the file, use Terraform to create the output file. + +1. Initialise the folder +``` +terraform init +``` + +2. Validate the code +``` +terraform validate +``` + +3. Create the activity tracking code file +``` +terraform apply -auto-approve +``` + +4. Optional: To remove the file created +``` +terraform destroy -auto-approve +``` diff --git a/activity-tracking/bq_dataset_create/.terraform.lock.hcl b/activity-tracking/bq_dataset_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/bq_dataset_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/bq_dataset_create/README.md b/activity-tracking/bq_dataset_create/README.md new file mode 100644 index 0000000..c8140c8 --- /dev/null +++ b/activity-tracking/bq_dataset_create/README.md @@ -0,0 +1,15 @@ +# BigQuery Dataset Create + +Checks if a dataset exists within a project. + +``` + bigquery = handles['project_0.BigqueryV2'] + dataset_name = resources['project_0']['startup_script.bq_dataset_name'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] BigqueryV2 + diff --git a/activity-tracking/bq_dataset_create/stable/main.tf b/activity-tracking/bq_dataset_create/stable/main.tf new file mode 100644 index 0000000..8b54259 --- /dev/null +++ b/activity-tracking/bq_dataset_create/stable/main.tf @@ -0,0 +1,37 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Verifies the creation of the bucket +def ${var.step_name}(handles:, maximum_score:, resources:) + + # Service handle initialization + bigquery = handles['project_0.BigqueryV2'] + dataset_name = resources['project_0']['startup_script.bq_dataset_name'] + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Assessment specific variables + isAvailable = false + + # Get the object information + dataset = bigquery.get_dataset(dataset_name.to_s) || [] + + # Check the object exists + if dataset + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create the BigQuery dataset.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + + return ret_hash +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/bq_dataset_create/stable/variable.tf b/activity-tracking/bq_dataset_create/stable/variable.tf new file mode 100644 index 0000000..c65fe28 --- /dev/null +++ b/activity-tracking/bq_dataset_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "bigquery_dataset_check" +} diff --git a/activity-tracking/fw_rule_create/.terraform.lock.hcl b/activity-tracking/fw_rule_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/fw_rule_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/fw_rule_create/README.md b/activity-tracking/fw_rule_create/README.md new file mode 100644 index 0000000..9f6756b --- /dev/null +++ b/activity-tracking/fw_rule_create/README.md @@ -0,0 +1,15 @@ +# Firewall Rule Exists + +Checks if a Firewall Rule exists within a project. + +``` + compute = handles['project_0.ComputeV1'] + fw_rule_name = resources['project_0']['startup_script.fw_rule_name'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] ComputeV1 + diff --git a/activity-tracking/fw_rule_create/stable/main.tf b/activity-tracking/fw_rule_create/stable/main.tf new file mode 100644 index 0000000..8e6e8ca --- /dev/null +++ b/activity-tracking/fw_rule_create/stable/main.tf @@ -0,0 +1,35 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Check if a firewall rule has been defined within the project +def ${var.step_name}(handles:, maximum_score:, resources:) + + compute = handles['project_0.ComputeV1'] + fw_rule_name = resources['project_0']['startup_script.fw_rule_name'] + + # Assessment specific variables + isAvailable = false + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Get the object information + resource_object = compute.get_firewall(fw_rule_name.to_s) || [] + + # Check the object exists + if resource_object + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create a firewall rule.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + return ret_hash +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/fw_rule_create/stable/variable.tf b/activity-tracking/fw_rule_create/stable/variable.tf new file mode 100644 index 0000000..f4350b0 --- /dev/null +++ b/activity-tracking/fw_rule_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "fw_rule_check" +} diff --git a/activity-tracking/gcs_bucket_create/.terraform.lock.hcl b/activity-tracking/gcs_bucket_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/gcs_bucket_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/gcs_bucket_create/README.md b/activity-tracking/gcs_bucket_create/README.md new file mode 100644 index 0000000..7472ef9 --- /dev/null +++ b/activity-tracking/gcs_bucket_create/README.md @@ -0,0 +1,15 @@ +# Cloud Storage Bucket Create + +Checks if a Bucket exists within a project. + +``` + storage = handles['project_0.StorageV1'] + bucket_name = resources['project_0']['startup_script.bucket'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] StorageV1 + diff --git a/activity-tracking/gcs_bucket_create/stable/main.tf b/activity-tracking/gcs_bucket_create/stable/main.tf new file mode 100644 index 0000000..4e91f5b --- /dev/null +++ b/activity-tracking/gcs_bucket_create/stable/main.tf @@ -0,0 +1,35 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Verifies the creation of the bucket +def ${var.step_name}(handles:, maximum_score:, resources:) + + storage = handles['project_0.StorageV1'] + bucket_name = resources['project_0']['startup_script.bucket'] + + # Assessment specific variables + isAvailable = false + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Get the object information + resource_object = storage.get_bucket(bucket_name.to_s) || [] + + # Validate object exists + if resource_object + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create a storage bucket.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + return ret_hash +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/gcs_bucket_create/stable/variable.tf b/activity-tracking/gcs_bucket_create/stable/variable.tf new file mode 100644 index 0000000..a28c379 --- /dev/null +++ b/activity-tracking/gcs_bucket_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "storage_bucket_check" +} diff --git a/activity-tracking/log_sink_create/.terraform.lock.hcl b/activity-tracking/log_sink_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/log_sink_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/log_sink_create/README.md b/activity-tracking/log_sink_create/README.md new file mode 100644 index 0000000..89e4d13 --- /dev/null +++ b/activity-tracking/log_sink_create/README.md @@ -0,0 +1,15 @@ +# Log Sink Create + +Checks if a Log Sink exists within a project. + +``` + log_sink = handles['project_0.LoggingV2'] + log_sink_name = 'projects/' + log_sink.project + '/sinks/' + resources['project_0']['startup_script.log_sink_name'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] LoggingV2 + diff --git a/activity-tracking/log_sink_create/stable/main.tf b/activity-tracking/log_sink_create/stable/main.tf new file mode 100644 index 0000000..39bade1 --- /dev/null +++ b/activity-tracking/log_sink_create/stable/main.tf @@ -0,0 +1,35 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Check if a log sink has been created +def ${var.step_name}(handles:, maximum_score:, resources:) + + log_sink = handles['project_0.LoggingV2'] + log_sink_name = 'projects/' + log_sink.project + '/sinks/' + resources['project_0']['startup_script.log_sink_name'] + + # Assessment specific variables + isAvailable = false + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Get the object information + resource_object = log_sink.get_sink(log_sink_name.to_s) || [] + + # Validate object exists + if resource_object + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create a log sink.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + return ret_hash +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/log_sink_create/stable/variable.tf b/activity-tracking/log_sink_create/stable/variable.tf new file mode 100644 index 0000000..7eaa7d3 --- /dev/null +++ b/activity-tracking/log_sink_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "log_sink_check" +} diff --git a/activity-tracking/pass/dev/assessments/step_one_check.rb b/activity-tracking/pass/dev/assessments/step_one_check.rb deleted file mode 100644 index 3e9681d..0000000 --- a/activity-tracking/pass/dev/assessments/step_one_check.rb +++ /dev/null @@ -1,23 +0,0 @@ -def step_one_check(handles:, maximum_score:, resources:) - - # Service handle initialization - logging = handles['project_0.LoggingV2'] - - # Set parameters - val_param = { - :pass_message => "Congratulations", - :fail_message => "Hmm, not sure that is correct", - :points => maximum_score - } - - # Perform a check - ret_hash = step_one_pass(logging, val_param) - - return ret_hash -end - -def step_one_pass(logging, val_param) - ret_hash = { :done => true, :score => val_param[:points], :message => val_param[:pass_message], :student_message => val_param[:pass_message] } - - return ret_hash -end diff --git a/activity-tracking/pass/dev/main.tf b/activity-tracking/pass/dev/main.tf deleted file mode 100644 index 0e51426..0000000 --- a/activity-tracking/pass/dev/main.tf +++ /dev/null @@ -1,13 +0,0 @@ -# Enable the Googleapi service -resource "google_project_service" "service-api" { - project = var.gcp_project_id - service = var.api_service_name - - timeouts { - create = "30m" - update = "40m" - } - - # State of the api - disable_dependent_services = var.api_service_deny -} diff --git a/activity-tracking/pass/dev/outputs.tf b/activity-tracking/pass/dev/outputs.tf deleted file mode 100644 index f11faef..0000000 --- a/activity-tracking/pass/dev/outputs.tf +++ /dev/null @@ -1,4 +0,0 @@ -## -------------------------------------------------------------- -## Custom variable definitions -## -------------------------------------------------------------- - diff --git a/activity-tracking/pass/dev/runtime.yaml b/activity-tracking/pass/dev/runtime.yaml deleted file mode 100644 index 93b5feb..0000000 --- a/activity-tracking/pass/dev/runtime.yaml +++ /dev/null @@ -1,2 +0,0 @@ -runtime: terraform -version: 1.0.1 diff --git a/activity-tracking/pass/dev/test.tfvars b/activity-tracking/pass/dev/test.tfvars deleted file mode 100644 index b928d47..0000000 --- a/activity-tracking/pass/dev/test.tfvars +++ /dev/null @@ -1,5 +0,0 @@ -gcp_project_id = "qwiklabs-resources" -gcp_region = "us-central1" -gcp_zone = "us-central1-a" -gcp_username = "test-suite@qwiklabs.com" -gce_name = "test-vm" diff --git a/activity-tracking/pass/dev/variables.tf b/activity-tracking/pass/dev/variables.tf deleted file mode 100644 index eb061cf..0000000 --- a/activity-tracking/pass/dev/variables.tf +++ /dev/null @@ -1,38 +0,0 @@ -## -------------------------------------------------------------- -## Mandatory variable definitions -## -------------------------------------------------------------- - -variable "gcp_project_id" { - type = string - description = "The GCP project ID to create resources in." -} - -# Default value passed in -variable "gcp_region" { - type = string - description = "Region to create resources in." -} - -# Default value passed in -variable "gcp_zone" { - type = string - description = "Zone to create resources in." -} - -## -------------------------------------------------------------- -## Output variable definitions - Override from Custom Properties -## -------------------------------------------------------------- - -# Expected custom_properties key to be declared in `qwiklabs.yaml` -# with the same name for any lab that uses this script. -variable "api_service_name" { - type = string - description = "Googleapis service name." -} - -# with the same name for any lab that uses this script. -variable "api_service_deny" { - type = string - description = "Name of Qwiklabs user" - default = false -} diff --git a/activity-tracking/pass_step_check/README.md b/activity-tracking/pass_step_check/README.md new file mode 100644 index 0000000..7c9ea10 --- /dev/null +++ b/activity-tracking/pass_step_check/README.md @@ -0,0 +1,8 @@ +# Pass + +Enables `pass` functionality within a lab. + +## Googleapi + +-[ ] N/A + diff --git a/activity-tracking/pass_step_check/stable/main.tf b/activity-tracking/pass_step_check/stable/main.tf new file mode 100644 index 0000000..1f135b8 --- /dev/null +++ b/activity-tracking/pass_step_check/stable/main.tf @@ -0,0 +1,19 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +def ${var.step_name}(handles:, maximum_score:, resources:) + + # Set parameters + val_param = { + :pass_message => "Congratulations", + :fail_message => "Hmm, not sure that is correct", + :points => maximum_score + } + + # Set defaults to variables + ret_hash = { :done => true, :score => val_param[:points], :message => val_param[:pass_message], :student_message => val_param[:pass_message] } + + return ret_hash +end +EOF + filename = "${var.step_name}.rb" +} diff --git a/activity-tracking/pass_step_check/stable/variables.tf b/activity-tracking/pass_step_check/stable/variables.tf new file mode 100644 index 0000000..a6215b5 --- /dev/null +++ b/activity-tracking/pass_step_check/stable/variables.tf @@ -0,0 +1,9 @@ +## -------------------------------------------------------------- +## Mandatory variable definitions +## -------------------------------------------------------------- + +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "step_pass_check" +} diff --git a/activity-tracking/pubsub_sub_create/.terraform.lock.hcl b/activity-tracking/pubsub_sub_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/pubsub_sub_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/pubsub_sub_create/README.md b/activity-tracking/pubsub_sub_create/README.md new file mode 100644 index 0000000..9f405d5 --- /dev/null +++ b/activity-tracking/pubsub_sub_create/README.md @@ -0,0 +1,15 @@ +# PubSub Subscription Create + +Checks if a PubSub subscription exists within a project. + +``` + pubsub = handles['project_0.PubsubV1'] + sub_name = 'projects/' + pubsub.project + '/subscriptions/' + resources['project_0']['startup_script.pubsub_sub_name'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] PubsubV1 + diff --git a/activity-tracking/pubsub_sub_create/stable/main.tf b/activity-tracking/pubsub_sub_create/stable/main.tf new file mode 100644 index 0000000..817a022 --- /dev/null +++ b/activity-tracking/pubsub_sub_create/stable/main.tf @@ -0,0 +1,34 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Check if the PubSub Subscription exists +def ${var.step_name}(handles:, maximum_score:, resources:) + pubsub = handles['project_0.PubsubV1'] + sub_name = 'projects/' + pubsub.project + '/subscriptions/' + resources['project_0']['startup_script.pubsub_sub_name'] + + # Assessment specific variables + isAvailable = false + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Get the object information + resource_object = pubsub.get_subscription(sub_name.to_s) || [] + + # Check the object exists + if resource_object + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create a PubSub Topic.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + return ret_hash +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/pubsub_sub_create/stable/variable.tf b/activity-tracking/pubsub_sub_create/stable/variable.tf new file mode 100644 index 0000000..71ad234 --- /dev/null +++ b/activity-tracking/pubsub_sub_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "pubsub_sub_check" +} diff --git a/activity-tracking/pubsub_topic_create/.terraform.lock.hcl b/activity-tracking/pubsub_topic_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/pubsub_topic_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/pubsub_topic_create/README.md b/activity-tracking/pubsub_topic_create/README.md new file mode 100644 index 0000000..d2056db --- /dev/null +++ b/activity-tracking/pubsub_topic_create/README.md @@ -0,0 +1,15 @@ +# PubSub Topic Create + +Checks if a PubSub topic exists within a project. + +``` + pubsub = handles['project_0.PubsubV1'] + topic_name = 'projects/' + pubsub.project + '/topics/' + resources['project_0']['startup_script.pubsub_topic_name'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] PubsubV1 + diff --git a/activity-tracking/pubsub_topic_create/stable/main.tf b/activity-tracking/pubsub_topic_create/stable/main.tf new file mode 100644 index 0000000..b9d0c72 --- /dev/null +++ b/activity-tracking/pubsub_topic_create/stable/main.tf @@ -0,0 +1,35 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Check if the Pubsub Topic exists +def ${var.step_name}(handles:, maximum_score:, resources:) + + pubsub = handles['project_0.PubsubV1'] + topic_name = 'projects/' + pubsub.project + '/topics/' + resources['project_0']['startup_script.pubsub_topic_name'] + + # Assessment specific variables + isAvailable = false + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Get the object information + resource_object = pubsub.get_topic(topic_name.to_s) || [] + + # Check the object exists + if resource_object + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create a PubSub Topic.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + return ret_hash +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/pubsub_topic_create/stable/variable.tf b/activity-tracking/pubsub_topic_create/stable/variable.tf new file mode 100644 index 0000000..d20d9b8 --- /dev/null +++ b/activity-tracking/pubsub_topic_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "pubsub_topic_check" +} diff --git a/activity-tracking/source_repo_create/.terraform.lock.hcl b/activity-tracking/source_repo_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/source_repo_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/source_repo_create/README.md b/activity-tracking/source_repo_create/README.md new file mode 100644 index 0000000..8ce4387 --- /dev/null +++ b/activity-tracking/source_repo_create/README.md @@ -0,0 +1,15 @@ +# Source Repository Create + +Checks if a Source Repository exists within a project. + +``` + sourcerepo = handles['project_0.SourcerepoV1'] + repo_name = 'projects/' + resources['project_0']['project_id'] + '/repos/' + resources['project_0']['startup_script.source_repo_name' +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] SourcerepoV1 + diff --git a/activity-tracking/source_repo_create/stable/main.tf b/activity-tracking/source_repo_create/stable/main.tf new file mode 100644 index 0000000..3c771ca --- /dev/null +++ b/activity-tracking/source_repo_create/stable/main.tf @@ -0,0 +1,37 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Verifies the creation of the bucket +def ${var.step_name}(handles:, maximum_score:, resources:) + + # Service handle initialization + sourcerepo = handles['project_0.SourcerepoV1'] + project_id = resources['project_0']['project_id'] + repo_name = 'projects/' + resources['project_0']['project_id'] + '/repos/' + resources['project_0']['startup_script.source_repo_name'] + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Assessment specific variables + isAvailable = false + + # Method: get project repo returns an object + repo = sourcerepo.get_project_repo(repo_name.to_s) || [] + + # Check if the object exists + if repo + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create the source repository.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/source_repo_create/stable/variable.tf b/activity-tracking/source_repo_create/stable/variable.tf new file mode 100644 index 0000000..7e69d88 --- /dev/null +++ b/activity-tracking/source_repo_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "source_repo_check" +} diff --git a/activity-tracking/vpc_network_create/.terraform.lock.hcl b/activity-tracking/vpc_network_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/vpc_network_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/vpc_network_create/README.md b/activity-tracking/vpc_network_create/README.md new file mode 100644 index 0000000..995fe40 --- /dev/null +++ b/activity-tracking/vpc_network_create/README.md @@ -0,0 +1,15 @@ +# VPC Network Create + +Checks if a VPC Network exists within a project. + +``` + compute = handles['project_0.ComputeV1'] + vpc_name = resources['project_0']['startup_script.vpc_network_name'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] ComputeV1 + diff --git a/activity-tracking/vpc_network_create/stable/main.tf b/activity-tracking/vpc_network_create/stable/main.tf new file mode 100644 index 0000000..ea0485e --- /dev/null +++ b/activity-tracking/vpc_network_create/stable/main.tf @@ -0,0 +1,34 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Check if a vpc has been defined within the project +def ${var.step_name}(handles:, maximum_score:, resources:) + + compute = handles['project_0.ComputeV1'] + vpc_name = resources['project_0']['startup_script.vpc_network_name'] + + # Assessment specific variables + isAvailable = false + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Check if the object exists + resource_object = compute.get_network(vpc_name.to_s) || [] + + # Validate object created + if resource_object + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create a VPC network.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/vpc_network_create/stable/variable.tf b/activity-tracking/vpc_network_create/stable/variable.tf new file mode 100644 index 0000000..49a39c3 --- /dev/null +++ b/activity-tracking/vpc_network_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "vpc_network_check" +} diff --git a/activity-tracking/vpc_subnet_create/.terraform.lock.hcl b/activity-tracking/vpc_subnet_create/.terraform.lock.hcl new file mode 100644 index 0000000..62da99d --- /dev/null +++ b/activity-tracking/vpc_subnet_create/.terraform.lock.hcl @@ -0,0 +1,21 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/local" { + version = "2.4.1" + hashes = [ + "h1:FzraUapGrJoH3ZOWiUT2m6QpZAD+HmU+JmqZgM4/o2Y=", + "zh:244b445bf34ddbd167731cc6c6b95bbed231dc4493f8cc34bd6850cfe1f78528", + "zh:3c330bdb626123228a0d1b1daa6c741b4d5d484ab1c7ae5d2f48d4c9885cc5e9", + "zh:5ff5f9b791ddd7557e815449173f2db38d338e674d2d91800ac6e6d808de1d1d", + "zh:70206147104f4bf26ae67d730c995772f85bf23e28c2c2e7612c74f4dae3c46f", + "zh:75029676993accd6bef933c196b2fad51a9ec8a69a847dbbe96ec8ebf7926cdc", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:7d48d5999fe1fcdae9295a7c3448ac1541f5a24c474bd82df6d4fa3732483f2b", + "zh:b766b38b027f0f84028244d1c2f990431a37d4fc3ac645962924554016507e77", + "zh:bfc7ad301dada204cf51c59d8bd6a9a87de5fddb42190b4d6ba157d6e08a1f10", + "zh:c902b527702a8c5e2c25a6637d07bbb1690cb6c1e63917a5f6dc460efd18d43f", + "zh:d68ae0e1070cf429c46586bc87580c3ed113f76241da2b6e4f1a8348126b3c46", + "zh:f4903fd89f7c92a346ae9e666c2d0b6884c4474ae109e9b4bd15e7efaa4bfc29", + ] +} diff --git a/activity-tracking/vpc_subnet_create/README.md b/activity-tracking/vpc_subnet_create/README.md new file mode 100644 index 0000000..8270a4a --- /dev/null +++ b/activity-tracking/vpc_subnet_create/README.md @@ -0,0 +1,15 @@ +# VPC Subnet Create + +Checks if a VPC Subnet exists within a project. + +``` + compute = handles['project_0.ComputeV1'] + subnetwork_name = resources['project_0']['startup_script.vpc_subnetwork_name'] +``` + +In the above code, the resources definition accesses a startup script value. + +## Googleapi + +-[ ] ComputeV1 + diff --git a/activity-tracking/vpc_subnet_create/stable/main.tf b/activity-tracking/vpc_subnet_create/stable/main.tf new file mode 100644 index 0000000..cc226d9 --- /dev/null +++ b/activity-tracking/vpc_subnet_create/stable/main.tf @@ -0,0 +1,36 @@ +resource "local_file" "activity_tracking_step" { + content = <<-EOF +# Objective: Check if a vpc subnetwork has been defined within the project +def ${var.step_name}(handles:, maximum_score:, resources:) + + compute = handles['project_0.ComputeV1'] + subnetwork_name = resources['project_0']['startup_script.vpc_subnetwork_name'] + + # Assessment specific variables + isAvailable = false + + # Assessment score and status checker hash variable + ret_hash = { :score => 0, :message => "", :student_message => ""} + + # Check if the object exists + resource_object = compute.get_subnetwork(subnetwork_name.to_s) || [] + + # Validate object created + if resource_object + isAvailable = true + end + + if isAvailable + ret_hash = { :score => maximum_score, :message => "Assessment completed!", :student_message => "Assessment completed!"} + else + error_message = 'Please create a VPC subnetwork.' + ret_hash[:message] = error_message + ret_hash[:student_message] = error_message + end + return ret_hash + +end +EOF + filename = "${var.step_name}.rb" +} + diff --git a/activity-tracking/vpc_subnet_create/stable/variable.tf b/activity-tracking/vpc_subnet_create/stable/variable.tf new file mode 100644 index 0000000..0c68fb5 --- /dev/null +++ b/activity-tracking/vpc_subnet_create/stable/variable.tf @@ -0,0 +1,5 @@ +variable "step_name" { + type = string + description = "The name of the step to be created" + default = "vpc_subnet_check" +}