diff --git a/.gitignore b/.gitignore index ce93bea..550832d 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,7 @@ secrets/** !secrets/template-* !secrets/.keep !secrets/README.md +!secrets/load-ncp-cred-env.sh # Ignore container volumes container-volume/ \ No newline at end of file diff --git a/api/docs.go b/api/docs.go index 83be514..778c103 100644 --- a/api/docs.go +++ b/api/docs.go @@ -925,8 +925,8 @@ const docTemplate = `{ } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/model.Response" } diff --git a/api/swagger.json b/api/swagger.json index 6be9923..0fecf19 100644 --- a/api/swagger.json +++ b/api/swagger.json @@ -919,8 +919,8 @@ } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { "$ref": "#/definitions/model.Response" } diff --git a/api/swagger.yaml b/api/swagger.yaml index 64f1531..265750b 100644 --- a/api/swagger.yaml +++ b/api/swagger.yaml @@ -897,8 +897,8 @@ paths: produces: - application/json responses: - "201": - description: Created + "200": + description: OK schema: $ref: '#/definitions/model.Response' "400": diff --git a/docker-compose.yaml b/docker-compose.yaml index 4be84be..89db378 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -4,7 +4,7 @@ networks: services: mc-terrarium: - image: cloudbaristaorg/mc-terrarium:0.0.10 + image: cloudbaristaorg/mc-terrarium:0.0.16 container_name: mc-terrarium build: context: . @@ -18,6 +18,7 @@ services: env_file: - ./secrets/credentials # AWS credentials - ./secrets/credential-azure.env # Azure credentials + - ./secrets/credential-ncp.env # NCP credentials volumes: - ./secrets:/app/secrets:ro # GCP credentials - ./container-volume/mc-terrarium-container/.terrarium:/app/.terrarium diff --git a/pkg/api/rest/handler/sql-db.go b/pkg/api/rest/handler/sql-db.go index cf57f26..456cd0f 100644 --- a/pkg/api/rest/handler/sql-db.go +++ b/pkg/api/rest/handler/sql-db.go @@ -75,7 +75,7 @@ func InitEnvForSqlDb(c echo.Context) error { } if !validProvidersForSqlDb[provider] { - err := fmt.Errorf("invalid request, provider must be one of [aws, azure, gcp, ncp]") + err := fmt.Errorf("invalid request, provider must be one of [aws, azure, gcp, ncpvpc]") log.Warn().Msg(err.Error()) res := model.Response{ Success: false, @@ -396,7 +396,7 @@ func CheckInfracodeForSqlDb(c echo.Context) error { // subcommand: plan ret, err := tofu.ExecuteTofuCommand(trId, reqId, "-chdir="+workingDir, "plan") if err != nil { - err2 := fmt.Errorf("encountered an issue during the infracode checking process") + err2 := fmt.Errorf("returned: %s", ret) log.Error().Err(err).Msg(err2.Error()) // error res := model.Response{ Success: false, @@ -424,7 +424,7 @@ func CheckInfracodeForSqlDb(c echo.Context) error { // @Produce json // @Param trId path string true "Terrarium ID" default(tr01) // @Param x-request-id header string false "Custom request ID" -// @Success 201 {object} model.Response "Created" +// @Success 200 {object} model.Response "OK" // @Failure 400 {object} model.Response "Bad Request" // @Failure 500 {object} model.Response "Internal Server Error" // @Failure 503 {object} model.Response "Service Unavailable" @@ -469,7 +469,7 @@ func CreateSqlDb(c echo.Context) error { // global option to set working dir: -chdir=/home/ubuntu/dev/cloud-barista/mc-terrarium/.terrarium/{trId}/vpn/gcp-aws // subcommand: apply - ret, err := tofu.ExecuteTofuCommandAsync(trId, reqId, "-chdir="+workingDir, "apply", "-auto-approve") + _, err = tofu.ExecuteTofuCommand(trId, reqId, "-chdir="+workingDir, "apply", "-auto-approve") if err != nil { err2 := fmt.Errorf("failed, previous request in progress") log.Error().Err(err).Msg(err2.Error()) // error @@ -479,15 +479,39 @@ func CreateSqlDb(c echo.Context) error { } return c.JSON(http.StatusInternalServerError, res) } + + // global option to set working dir: -chdir=/home/ubuntu/dev/cloud-barista/mc-terrarium/.terrarium/{trId}/sql-db + // show: subcommand + ret, err := tofu.ExecuteTofuCommand(trId, reqId, "-chdir="+workingDir, "output", "-json", "sql_db_info") + if err != nil { + err2 := fmt.Errorf("failed to read resource info (detail: %s) specified as 'output' in the state file", "refined") + log.Error().Err(err).Msg(err2.Error()) + res := model.Response{ + Success: false, + Message: err2.Error(), + } + return c.JSON(http.StatusInternalServerError, res) + } + + var resourceInfo map[string]interface{} + err = json.Unmarshal([]byte(ret), &resourceInfo) + if err != nil { + log.Error().Err(err).Msg("") // error + res := model.Response{ + Success: false, + Message: "failed to unmarshal resource info", + } + return c.JSON(http.StatusInternalServerError, res) + } + res := model.Response{ Success: true, - Message: "the request (id: " + reqId + ") is successfully accepted and still deploying resource", - Detail: ret, + Message: "refined read resource info (map)", + Object: resourceInfo, } - log.Debug().Msgf("%+v", res) // debug - return c.JSON(http.StatusCreated, res) + return c.JSON(http.StatusOK, res) } // GetResourceInfoOfSqlDb godoc diff --git a/pkg/api/rest/model/sql-db.go b/pkg/api/rest/model/sql-db.go index b13893c..18c50af 100644 --- a/pkg/api/rest/model/sql-db.go +++ b/pkg/api/rest/model/sql-db.go @@ -11,8 +11,8 @@ type TfVarsSqlDb struct { DBEnginePort int `json:"db_engine_port,omitempty" example:"3306"` IngressCIDRBlock string `json:"ingress_cidr_block,omitempty" example:"0.0.0.0/0"` EgressCIDRBlock string `json:"egress_cidr_block,omitempty" example:"0.0.0.0/0"` - DBEngineVersion string `json:"db_engine_version" example:"8.0.39"` - DBInstanceSpec string `json:"db_instance_spec" example:"db.t3.micro"` + DBEngineVersion string `json:"db_engine_version,omitempty" example:"8.0.39"` + DBInstanceSpec string `json:"db_instance_spec,omitempty" example:"db.t3.micro"` DBAdminUsername string `json:"db_admin_username" example:"mydbadmin"` DBAdminPassword string `json:"db_admin_password" example:"Password1234!"` // DBInstanceID string `json:"db_instance_identifier" example:"mydbinstance"` diff --git a/pkg/tofu/tofu.go b/pkg/tofu/tofu.go index 39ebb12..eca7df3 100644 --- a/pkg/tofu/tofu.go +++ b/pkg/tofu/tofu.go @@ -142,7 +142,7 @@ func ExecuteTofuCommand(trId, reqId string, args ...string) (string, error) { if err != nil { log.Error().Msgf("Command execution failed: %v", err) setRunningStatus(trId, "Failed") - return "", err + return output, err } // log.Debug().Msgf("Command output: %s", output) setRunningStatus(trId, "Success") diff --git a/secrets/load-ncp-cred-env.sh b/secrets/load-ncp-cred-env.sh new file mode 100755 index 0000000..8561ca0 --- /dev/null +++ b/secrets/load-ncp-cred-env.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# Find the script directory +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENV_FILE="$SCRIPT_DIR/credential-ncp.env" + +# Check if .env file exists +if [[ -f "$ENV_FILE" ]]; then + while IFS= read -r line; do + if [[ -n "$line" && ! "$line" =~ ^# ]]; then + eval export "$line" + fi + done < "$ENV_FILE" + echo "successfully loaded the NCP credential environment variables" +else + echo "error: dose not exist file, $ENV_FILE" +fi \ No newline at end of file diff --git a/secrets/template-credential-ncp b/secrets/template-credential-ncp deleted file mode 100644 index 587ef3f..0000000 --- a/secrets/template-credential-ncp +++ /dev/null @@ -1,2 +0,0 @@ -export NCLOUD_ACCESS_KEY="YOUR_ACCESS_KEY" -export NCLOUD_SECRET_KEY="YOUR_SECRET_KEY" \ No newline at end of file diff --git a/secrets/template-credential-ncp.env b/secrets/template-credential-ncp.env new file mode 100644 index 0000000..f81b029 --- /dev/null +++ b/secrets/template-credential-ncp.env @@ -0,0 +1,2 @@ +NCLOUD_ACCESS_KEY="YOUR_ACCESS_KEY" +NCLOUD_SECRET_KEY="YOUR_SECRET_KEY" \ No newline at end of file diff --git a/templates/sql-db/gcp/sql-db.tf b/templates/sql-db/gcp/sql-db.tf index ef0be38..06f39ef 100644 --- a/templates/sql-db/gcp/sql-db.tf +++ b/templates/sql-db/gcp/sql-db.tf @@ -8,7 +8,7 @@ resource "google_sql_database_instance" "instance" { tier = var.db_instance_spec # Set the instance type, such as db-f1-micro } - # deletion_protection = false # Disable deletion protection + deletion_protection = false # Disable deletion protection } # Create database diff --git a/templates/sql-db/ncp/providers.tf b/templates/sql-db/ncp/providers.tf index 23fd7c9..9540e28 100644 --- a/templates/sql-db/ncp/providers.tf +++ b/templates/sql-db/ncp/providers.tf @@ -14,8 +14,8 @@ terraform { provider "ncloud" { access_key = var.ncloud_access_key secret_key = var.ncloud_secret_key - region = var.csp_region # Set the desired region (e.g., "KR", "JP", etc.) - support_vpc = true # Enable VPC support + region = upper(var.csp_region) # Set the desired region (e.g., "KR", "JP", etc.) + support_vpc = true # Enable VPC support } # Declare variables diff --git a/templates/sql-db/ncp/sql-db.tf b/templates/sql-db/ncp/sql-db.tf index 6336003..2710f1a 100644 --- a/templates/sql-db/ncp/sql-db.tf +++ b/templates/sql-db/ncp/sql-db.tf @@ -2,10 +2,10 @@ # Create MySQL RDS Instance resource "ncloud_mysql" "mysql" { subnet_no = var.csp_subnet1_id - service_name = "${var.terrarium_id}-db-instance" # Service name: Only English alphabets, numbers, dash ( - ) and Korean letters can be entered. Min: 3, Max: 30 - server_name_prefix = "svr-name-prefix" # Server name prefix: In order to prevent overlapping host names, random text is added. Min: 3, Max: 20 - user_name = var.db_admin_username # Master username - user_password = var.db_admin_password # Master password - host_ip = "%" # Host IP: "%" For overall access (use cautiously), specific IPs permitted: 1.1.1.1, IP band connection permitted: 1.1.1.% - database_name = "${var.terrarium_id}-db" # Initial database name + service_name = "${var.terrarium_id}-svc" # Service name: Only English alphabets, numbers, dash ( - ) and Korean letters can be entered. Min: 3, Max: 30 + server_name_prefix = "svr-name-prefix" # Server name prefix: In order to prevent overlapping host names, random text is added. Min: 3, Max: 20 + user_name = var.db_admin_username # Master username + user_password = var.db_admin_password # Master password + host_ip = "%" # Host IP: "%" For overall access (use cautiously), specific IPs permitted: 1.1.1.1, IP band connection permitted: 1.1.1.% + database_name = "${var.terrarium_id}-db" # Initial database name } diff --git a/templates/sql-db/ncp/variables.tf b/templates/sql-db/ncp/variables.tf index 34ee00a..91fb7d0 100644 --- a/templates/sql-db/ncp/variables.tf +++ b/templates/sql-db/ncp/variables.tf @@ -40,6 +40,11 @@ variable "csp_region" { variable "csp_subnet1_id" { type = string description = "The subnet ID in NCP." + + validation { + condition = can(regex("^[0-9]+$", var.csp_subnet1_id)) + error_message = "The csp_subnet1_id must only contain digits (e.g, 123456)." + } } # variable "csp_subnet2_id" {