Feature/33 api fails when no pilots or logbook entries (#35)
* api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * api no longer fails when no pilots or logbook entries * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * Refactoring * refactoring * refactoring * refactoring * refactoring * adding test environment * adding test environment
This commit was merged in pull request #35.
This commit is contained in:
4
infrastructure/config.tf
Normal file
4
infrastructure/config.tf
Normal file
@@ -0,0 +1,4 @@
|
||||
module "environment" {
|
||||
source = "./config"
|
||||
environment = var.WORKSPACE
|
||||
}
|
||||
61
infrastructure/config/main.tf
Normal file
61
infrastructure/config/main.tf
Normal file
@@ -0,0 +1,61 @@
|
||||
locals {
|
||||
container_app_app_name = {
|
||||
test = "flying-app-test"
|
||||
prod = "flying-app-prod"
|
||||
}
|
||||
|
||||
container_app_app_container_image = {
|
||||
test = "noahspan/flying-app:v0.0.1"
|
||||
prod = "noahspan/flying-app:v0.0.1"
|
||||
}
|
||||
|
||||
container_app_app_container_name = {
|
||||
test = "flying-app-test"
|
||||
prod = "flying-app-prod"
|
||||
}
|
||||
|
||||
container_app_api_name = {
|
||||
test = "flying-api-test"
|
||||
prod = "flying-api-prod"
|
||||
}
|
||||
|
||||
container_app_api_container_image = {
|
||||
test = "noahspan/flying-api:v0.0.1"
|
||||
prod = "noahspan/flying-api:v0.0.1"
|
||||
}
|
||||
|
||||
container_app_api_container_name = {
|
||||
test = "flying-api-test"
|
||||
prod = "flying-api-prod"
|
||||
}
|
||||
|
||||
container_app_api_dapr_app_id = {
|
||||
test = "flyingapitest"
|
||||
prod = "flyingpapiprod"
|
||||
}
|
||||
|
||||
container_app_environment_name = {
|
||||
test = "flying-test"
|
||||
prod = "flying-prod"
|
||||
}
|
||||
|
||||
logbook_feature_flag_active = {
|
||||
test = "true"
|
||||
prod = "true"
|
||||
}
|
||||
|
||||
log_analytics_workspace_name = {
|
||||
test = "flying-log-analytics-workspace-test"
|
||||
prod = "flying-log-analytics-workspace-prod"
|
||||
}
|
||||
|
||||
pilots_feature_flag_active = {
|
||||
test = "true"
|
||||
prod = "true"
|
||||
}
|
||||
|
||||
storage_account_name = {
|
||||
test = "noahspanflyingtest"
|
||||
prod = "noahspanflyingprod"
|
||||
}
|
||||
}
|
||||
47
infrastructure/config/outputs.tf
Normal file
47
infrastructure/config/outputs.tf
Normal file
@@ -0,0 +1,47 @@
|
||||
output "container_app_app_name" {
|
||||
value = local.container_app_app_name[var.environment]
|
||||
}
|
||||
|
||||
output "container_app_app_container_image" {
|
||||
value = local.container_app_app_container_image[var.environment]
|
||||
}
|
||||
|
||||
output "container_app_app_container_name" {
|
||||
value = local.container_app_app_container_name[var.environment]
|
||||
}
|
||||
|
||||
output "container_app_api_name" {
|
||||
value = local.container_app_api_name[var.environment]
|
||||
}
|
||||
|
||||
output "container_app_api_container_image" {
|
||||
value = local.container_app_api_container_image[var.environment]
|
||||
}
|
||||
|
||||
output "container_app_api_container_name" {
|
||||
value = local.container_app_api_container_name[var.environment]
|
||||
}
|
||||
|
||||
output "container_app_api_dapr_app_id" {
|
||||
value = local.container_app_api_dapr_app_id[var.environment]
|
||||
}
|
||||
|
||||
output "container_app_environment_name" {
|
||||
value = local.container_app_environment_name[var.environment]
|
||||
}
|
||||
|
||||
output "logbook_feature_flag_active" {
|
||||
value = local.logbook_feature_flag_active[var.environment]
|
||||
}
|
||||
|
||||
output "log_analytics_workspace_name" {
|
||||
value = local.log_analytics_workspace_name[var.environment]
|
||||
}
|
||||
|
||||
output "pilots_feature_flag_active" {
|
||||
value = local.pilots_feature_flag_active[var.environment]
|
||||
}
|
||||
|
||||
output "storage_account_name" {
|
||||
value = local.storage_account_name[var.environment]
|
||||
}
|
||||
1
infrastructure/config/variables.tf
Normal file
1
infrastructure/config/variables.tf
Normal file
@@ -0,0 +1 @@
|
||||
variable "environment" {}
|
||||
@@ -1,91 +0,0 @@
|
||||
resource "azurerm_container_app" "container_app_dev" {
|
||||
name = "flying-api"
|
||||
container_app_environment_id = azurerm_container_app_environment.container_app_environment_dev.id
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
revision_mode = "Single"
|
||||
|
||||
registry {
|
||||
server = "index.docker.io"
|
||||
username = var.DOCKER_IO_USERNAME
|
||||
password_secret_name = "docker-io-password"
|
||||
}
|
||||
|
||||
template {
|
||||
min_replicas = 0
|
||||
max_replicas = 1
|
||||
|
||||
container {
|
||||
name = "flying-api-dev"
|
||||
image = "noahspan/flying-api:v0.0.1"
|
||||
cpu = 0.25
|
||||
memory = "0.5Gi"
|
||||
|
||||
env {
|
||||
name = "APP_CONFIG_URL"
|
||||
value = "https://noahspann-appconfig.azconfig.io"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "AZURE_STORAGE_ACCOUNT_KEY"
|
||||
secret_name = "azure-storage-account-key"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "AZURE_STORAGE_ACCOUNT_NAME"
|
||||
value = "noahspanflyingdev"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "AZURE_STROAGE_ACCOUNT_URL"
|
||||
value = "https://noahspanflyingdev.table.core.windows.net/"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "CLIENT_ID"
|
||||
secret_name = "client-id"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "CLIENT_SECRET"
|
||||
secret_name = "client-secret"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "TENANT_ID"
|
||||
value = "0f23652e-4b15-420f-991e-3d6fc769a31d"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ingress {
|
||||
allow_insecure_connections = false
|
||||
external_enabled = true
|
||||
target_port = 80
|
||||
transport = "auto"
|
||||
|
||||
traffic_weight {
|
||||
latest_revision = true
|
||||
percentage = 100
|
||||
}
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "azure-storage-account-key"
|
||||
value = var.AZURE_STORAGE_ACCOUNT_KEY
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "client-id"
|
||||
value = var.CLIENT_ID
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "client-secret"
|
||||
value = var.CLIENT_SECRET
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "docker-io-password"
|
||||
value = var.DOCKER_IO_PASSWORD
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
resource "azurerm_log_analytics_workspace" "log_analytics_workspace" {
|
||||
name = "noahspan-flying-log-analytics-workspace"
|
||||
location = data.azurerm_resource_group.resource_group.location
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
sku = "PerGB2018"
|
||||
retention_in_days = 30
|
||||
}
|
||||
|
||||
resource "azurerm_container_app_environment" "container_app_environment_dev" {
|
||||
name = "flying-dev"
|
||||
location = data.azurerm_resource_group.resource_group.location
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
log_analytics_workspace_id = azurerm_log_analytics_workspace.log_analytics_workspace.id
|
||||
}
|
||||
@@ -1,4 +1,15 @@
|
||||
data "azurerm_dns_zone" "dns_zone" {
|
||||
name = var.DOMAIN_NAME
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
}
|
||||
}
|
||||
|
||||
# resource "azurerm_dns_txt_record" "dns_txt_record" {
|
||||
# name = "asuid.${var.APP_SUBDOMAIN_NAME}"
|
||||
# resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
# zone_name = data.azurerm_dns_zone.dns_zone.name
|
||||
# ttl = 14400
|
||||
|
||||
# record {
|
||||
# value = azurerm_container_app.container_app_app.custom_domain_verification_id
|
||||
# }
|
||||
# }
|
||||
@@ -1,23 +1,158 @@
|
||||
resource "azurerm_static_web_app" "static_web_app" {
|
||||
name = var.STATIC_WEB_APP_NAME
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
location = var.REGION
|
||||
sku_size = "Free"
|
||||
sku_tier = "Free"
|
||||
data "azurerm_client_config" "current" {
|
||||
}
|
||||
|
||||
resource "azurerm_dns_cname_record" "dns_cname_record_app" {
|
||||
name = var.APP_SUBDOMAIN_NAME
|
||||
zone_name = data.azurerm_dns_zone.dns_zone.name
|
||||
resource "azurerm_log_analytics_workspace" "log_analytics_workspace" {
|
||||
name = module.environment.log_analytics_workspace_name
|
||||
location = data.azurerm_resource_group.resource_group.location
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
ttl = 14400
|
||||
record = azurerm_static_web_app.static_web_app.default_host_name
|
||||
sku = "PerGB2018"
|
||||
retention_in_days = 30
|
||||
}
|
||||
|
||||
resource "azurerm_static_web_app_custom_domain" "static_web_app_custom_domain" {
|
||||
static_web_app_id = azurerm_static_web_app.static_web_app.id
|
||||
domain_name = "${var.APP_SUBDOMAIN_NAME}.${var.DOMAIN_NAME}"
|
||||
validation_type = "cname-delegation"
|
||||
resource "azurerm_container_app_environment" "container_app_environment" {
|
||||
name = module.environment.container_app_environment_name
|
||||
location = data.azurerm_resource_group.resource_group.location
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
log_analytics_workspace_id = azurerm_log_analytics_workspace.log_analytics_workspace.id
|
||||
}
|
||||
|
||||
depends_on = [ azurerm_dns_cname_record.dns_cname_record_app ]
|
||||
}
|
||||
resource "azurerm_container_app" "container_app_api" {
|
||||
name = module.environment.container_app_api_name
|
||||
container_app_environment_id = azurerm_container_app_environment.container_app_environment.id
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
revision_mode = "Single"
|
||||
|
||||
registry {
|
||||
server = "index.docker.io"
|
||||
username = var.DOCKER_IO_USERNAME
|
||||
password_secret_name = "docker-io-password"
|
||||
}
|
||||
|
||||
template {
|
||||
min_replicas = 0
|
||||
max_replicas = 2
|
||||
|
||||
container {
|
||||
name = module.environment.container_app_api_container_name
|
||||
image = module.environment.container_app_api_container_image
|
||||
cpu = 0.25
|
||||
memory = "0.5Gi"
|
||||
|
||||
env {
|
||||
name = "AZURE_STORAGE_CONNECTION_STRING"
|
||||
secret_name = "azure-storage-connection-string"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "CLIENT_ID"
|
||||
secret_name = "client-id"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "CLIENT_SECRET"
|
||||
secret_name = "client-secret"
|
||||
}
|
||||
|
||||
env {
|
||||
name = "TENANT_ID"
|
||||
secret_name = "tenant-id"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ingress {
|
||||
allow_insecure_connections = false
|
||||
external_enabled = true
|
||||
target_port = 3000
|
||||
transport = "auto"
|
||||
|
||||
traffic_weight {
|
||||
latest_revision = true
|
||||
percentage = 100
|
||||
}
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "docker-io-password"
|
||||
value = var.DOCKER_IO_PASSWORD
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "azure-storage-connection-string"
|
||||
value = azurerm_storage_account.storage_account.primary_connection_string
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "client-id"
|
||||
value = var.CLIENT_ID
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "client-secret"
|
||||
value = var.CLIENT_SECRET
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "tenant-id"
|
||||
value = var.TENANT_ID
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
ignore_changes = [ template[0].container[0].image ]
|
||||
}
|
||||
}
|
||||
|
||||
resource "azurerm_container_app" "container_app_app" {
|
||||
name = module.environment.container_app_app_name
|
||||
container_app_environment_id = azurerm_container_app_environment.container_app_environment.id
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
revision_mode = "Single"
|
||||
|
||||
registry {
|
||||
server = "index.docker.io"
|
||||
username = var.DOCKER_IO_USERNAME
|
||||
password_secret_name = "docker-io-password"
|
||||
}
|
||||
|
||||
template {
|
||||
min_replicas = 0
|
||||
max_replicas = 2
|
||||
|
||||
container {
|
||||
name = module.environment.container_app_app_container_name
|
||||
image = module.environment.container_app_app_container_image
|
||||
cpu = 0.25
|
||||
memory = "0.5Gi"
|
||||
}
|
||||
}
|
||||
|
||||
ingress {
|
||||
allow_insecure_connections = false
|
||||
external_enabled = true
|
||||
target_port = 8080
|
||||
transport = "auto"
|
||||
|
||||
traffic_weight {
|
||||
latest_revision = true
|
||||
percentage = 100
|
||||
}
|
||||
}
|
||||
|
||||
secret {
|
||||
name = "docker-io-password"
|
||||
value = var.DOCKER_IO_PASSWORD
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
ignore_changes = [ template[0].container[0].image ]
|
||||
}
|
||||
}
|
||||
|
||||
# resource "azurerm_container_app_custom_domain" "custom_domain" {
|
||||
# name = trimsuffix(trimprefix(azurerm_dns_txt_record.dns_txt_record.fqdn, "asuid."), ".")
|
||||
# container_app_id = azurerm_container_app.container_app_app.id
|
||||
|
||||
# lifecycle {
|
||||
# ignore_changes = [ certificate_binding_type, container_app_environment_certificate_id ]
|
||||
# }
|
||||
# }
|
||||
@@ -1,8 +0,0 @@
|
||||
output "api_key" {
|
||||
value = azurerm_static_web_app.static_web_app.api_key
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
output "default_host_name" {
|
||||
value = azurerm_static_web_app.static_web_app.default_host_name
|
||||
}
|
||||
@@ -1,23 +1,44 @@
|
||||
resource "azurerm_storage_account" "storage_account_dev" {
|
||||
name = "${var.STORAGE_ACCOUNT_NAME}dev"
|
||||
resource "azurerm_storage_account" "storage_account" {
|
||||
name = module.environment.storage_account_name
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
location = data.azurerm_resource_group.resource_group.location
|
||||
account_tier = "Standard"
|
||||
account_replication_type = "LRS"
|
||||
}
|
||||
|
||||
resource "azurerm_storage_account" "storage_account_staging" {
|
||||
name = "${var.STORAGE_ACCOUNT_NAME}staging"
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
location = data.azurerm_resource_group.resource_group.location
|
||||
account_tier = "Standard"
|
||||
account_replication_type = "LRS"
|
||||
resource "azurerm_storage_table" "logs_table" {
|
||||
name = "logs"
|
||||
storage_account_name = azurerm_storage_account.storage_account.name
|
||||
}
|
||||
|
||||
resource "azurerm_storage_account" "storage_account_prod" {
|
||||
name = "${var.STORAGE_ACCOUNT_NAME}prod"
|
||||
resource_group_name = data.azurerm_resource_group.resource_group.name
|
||||
location = data.azurerm_resource_group.resource_group.location
|
||||
account_tier = "Standard"
|
||||
account_replication_type = "LRS"
|
||||
resource "azurerm_storage_table" "pilot_table" {
|
||||
name = "pilots"
|
||||
storage_account_name = azurerm_storage_account.storage_account.name
|
||||
}
|
||||
|
||||
resource "azurerm_storage_table" "feature_flags_table" {
|
||||
name = "featureFlags"
|
||||
storage_account_name = azurerm_storage_account.storage_account.name
|
||||
}
|
||||
|
||||
resource "azurerm_storage_table_entity" "logbook_feature_flag_entity" {
|
||||
storage_table_id = azurerm_storage_table.feature_flags_table.id
|
||||
|
||||
partition_key = "featureFlag"
|
||||
row_key = "logbook"
|
||||
|
||||
entity = {
|
||||
active = module.environment.logbook_feature_flag_active
|
||||
}
|
||||
}
|
||||
|
||||
resource "azurerm_storage_table_entity" "pilots_feature_flag_entity" {
|
||||
storage_table_id = azurerm_storage_table.feature_flags_table.id
|
||||
|
||||
partition_key = "featureFlag"
|
||||
row_key = "pilots"
|
||||
|
||||
entity = {
|
||||
active = module.environment.pilots_feature_flag_active
|
||||
}
|
||||
}
|
||||
@@ -6,11 +6,6 @@ variable "APP_SUBDOMAIN_NAME" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "AZURE_STORAGE_ACCOUNT_KEY" {
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
variable "CLIENT_ID" {
|
||||
type = string
|
||||
}
|
||||
@@ -33,10 +28,6 @@ variable "DOMAIN_NAME" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "CUSTOM_DOMAIN_NAME_COUNT" {
|
||||
type = number
|
||||
}
|
||||
|
||||
variable "REGION" {
|
||||
type = string
|
||||
}
|
||||
@@ -45,14 +36,6 @@ variable "RESOURCE_GROUP_NAME" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "STATIC_WEB_APP_NAME" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "STORAGE_ACCOUNT_NAME" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "TENANT_ID" {
|
||||
type = string
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user