cloud-foundation-fabric/modules/billing-account/factory.tf

99 lines
3.2 KiB
HCL

/**
* Copyright 2023 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
locals {
_factory_data = {
for f in fileset("${local._factory_path}", "**/*.yaml") :
trimsuffix(f, ".yaml") => yamldecode(file("${local._factory_path}/${f}"))
}
_factory_path = try(pathexpand(var.factories_config.budgets_data_path), "")
factory_budgets = {
for k, v in local._factory_data : k => merge(v, {
amount = merge(
{
currency_code = null
nanos = null
units = null
use_last_period = null
},
try(v.amount, {})
)
display_name = try(v.display_name, null)
filter = try(v.filter, null) == null ? null : {
credit_types_treatment = (
try(v.filter.credit_types_treatment, null) == null
? null
: merge(
{ exclude_all = null, include_specified = null },
v.filter.credit_types_treatment
)
)
label = try(v.filter.label, null)
projects = try(v.filter.projects, null)
resource_ancestors = try(v.filter.resource_ancestors, null)
services = try(v.filter.services, null)
subaccounts = try(v.filter.subaccounts, null)
}
threshold_rules = [
for vv in try(v.threshold_rules, []) : merge({
percent = null
forecasted_spend = null
}, vv)
]
update_rules = {
for kk, vv in try(v.update_rules, {}) : kk => merge({
disable_default_iam_recipients = null
monitoring_notification_channels = null
pubsub_topic = null
}, vv)
}
})
}
}
# check data coming from the factory as it bypasses variable validation rules
check "factory_budgets" {
assert {
condition = alltrue([
for k, v in local.factory_budgets : v.amount != null && (
try(v.amount.use_last_period, null) == true ||
try(v.amount.units, null) != null
)
])
error_message = "Factory budgets need either amount units or last period set."
}
assert {
condition = alltrue([
for k, v in local.factory_budgets :
v.threshold_rules == null || try(v.threshold_rules.percent, null) != null
])
error_message = "Threshold rules need percent set."
}
assert {
condition = alltrue(flatten([
for k, v in local.factory_budgets : [
for kk, vv in v.update_rules : [
vv.monitoring_notification_channels != null
||
vv.pubsub_topic != null
]
]
]))
error_message = "Notification rules need either a pubsub topic or monitoring channels defined."
}
}