app/services/Config.scala (237 lines of code) (raw):
package services
import java.util.Properties
import com.amazonaws.services.s3.model.GetObjectRequest
import scala.jdk.CollectionConverters._
object Config extends AwsInstanceTags {
lazy val conf = readTag("Stage") match {
case Some("PROD") => new ProdConfig
case Some("CODE") => new CodeConfig
// If in AWS and we don't know our stage, fail fast to avoid ending up running an instance with dev config in PROD!
case other if instanceId.nonEmpty => throw new IllegalStateException(s"Unable to read Stage tag: $other")
case _ => new DevConfig
}
def apply() = {
conf
}
}
sealed trait Config {
import services.Config._
private val remoteConfiguration: Map[String, String] = loadConfiguration
def capiUrl: String = getRequiredStringProperty("capi.url")
def capiKey: String = getRequiredStringProperty("capi.key")
def capiPreviewIAMUrl: String = getRequiredStringProperty("capi.preview.iamUrl")
def capiPreviewRole: String = getRequiredStringProperty("capi.preview.role")
def hmacSecret: String = getRequiredStringProperty("hmac.secret")
def pathManagerUrl: String = getRequiredStringProperty("pathmanager.url")
def getRequiredStringProperty(key: String): String = {
remoteConfiguration.getOrElse(key, {
throw new IllegalArgumentException(s"Property '$key' not configured")
})
}
object aws {
lazy val stack = readTag("Stack") getOrElse "flexible"
lazy val stage = readTag("Stage") getOrElse "DEV"
lazy val app = readTag("App") getOrElse "tag-manager"
lazy val region = remoteConfiguration.getOrElse("aws.region", "eu-west-1")
}
private def loadConfiguration = {
val bucketName = s"guconf-${aws.stack}"
def loadPropertiesFromS3(propertiesKey: String, props: Properties): Unit = {
val s3Properties = AWS.S3Client.getObject(new GetObjectRequest(bucketName, propertiesKey))
val propertyInputStream = s3Properties.getObjectContent
try {
props.load(propertyInputStream)
} finally {
try {propertyInputStream.close()} catch {case _: Throwable => /*ignore*/}
}
}
val props = new Properties()
loadPropertiesFromS3(s"${aws.app}/global.properties", props)
loadPropertiesFromS3(s"${aws.app}/${aws.stage}.properties", props)
props.asScala.toMap
}
lazy val permissionsStage: String = readTag("Stage") match {
case Some("DEV") => "CODE"
case Some(stage) => stage
case _ => "CODE"
}
def tagsTableName: String
def sectionsTableName: String
def sponsorshipTableName: String
def sequenceTableName: String
def jobTableName: String
def tagAuditTableName: String
def sectionAuditTableName: String
def clusterStatusTableName: String
def pillarsTableName: String
def pillarsAuditTableName: String
def referencesTypeTableName: String
def tagUpdateStreamName: String
def sectionUpdateStreamName: String
def taggingOperationsStreamName: String
def taggingOperationsReIndexStreamName: String
def pillarUpdateStreamName: String
def commercialExpiryStreamName: String
def auditingStreamName: String
def reindexTagsStreamName: String
def reindexTagsBatchSize: Int
def reindexSectionsStreamName: String
def reindexPillarsStreamName: String
def reindexProgressTableName: String
def appAuditTableName: String
def jobQueueName: String
def logShippingStreamName: Option[String] = None
def pandaDomain: String
val pandaSystemIdentifier: String = "tagmanager"
val pandaBucketName: String = "pan-domain-auth-settings"
def pandaSettingsFileKey: String
def pandaAuthCallback: String
def composerDomain: String
def targetingDomain: String
def workflowDomain: String
def campaignCentralDomain: String
def corsableDomains: Seq[String]
def corsablePostDomains: Seq[String]
def frontendBucketWriteRole: Option[String] = None
def tagSearchPageSize = 25
}
class DevConfig extends Config {
override def tagsTableName: String = "tag-manager-tags-DEV"
override def sectionsTableName: String = "tag-manager-sections-DEV"
override def sponsorshipTableName: String = "tag-manager-sponsorships-dev"
override def sequenceTableName: String = "tag-manager-sequences-dev"
override def referencesTypeTableName: String = "tag-manager-reference-type-dev"
override def pillarsTableName: String = "tag-manager-pillars-DEV"
override def pillarsAuditTableName: String = "tag-manager-pillars-audit-DEV"
override def jobTableName: String = "tag-manager-background-jobs-dev"
override def tagAuditTableName: String = "tag-manager-tag-audit-dev"
override def sectionAuditTableName: String = "tag-manager-section-audit-dev"
override def clusterStatusTableName: String = "tag-manager-cluster-status-dev"
override def tagUpdateStreamName: String = "tag-update-stream-dev"
override def sectionUpdateStreamName: String = "section-update-stream-dev"
override def taggingOperationsStreamName: String = "tagging-operations-stream-dev"
override def taggingOperationsReIndexStreamName: String = "tagging-reindex-operations-stream-dev"
override def commercialExpiryStreamName: String = "commercial-expiry-stream-DEV-KELVIN"
override def auditingStreamName: String = "auditing-CODE"
override def pillarUpdateStreamName: String = "pillar-update-stream-CODE"
override def reindexTagsStreamName: String = "tag-reindex-dev"
override def reindexTagsBatchSize: Int = 500
override def reindexSectionsStreamName: String = "section-reindex-dev"
override def reindexPillarsStreamName: String = "pillar-reindex-CODE"
override def reindexProgressTableName: String = "tag-manager-reindex-progress-DEV"
override def appAuditTableName: String = "tag-manager-app-audit-dev"
override def jobQueueName: String = "tag-manager-job-queue-dev"
override def logShippingStreamName = Some("elk-CODE-KinesisStream-M03ERGK5PVD9")
override def pandaDomain: String = "local.dev-gutools.co.uk"
override def pandaSettingsFileKey: String = "local.dev-gutools.co.uk.settings"
override def pandaAuthCallback: String = "https://tagmanager.local.dev-gutools.co.uk/oauthCallback"
override def composerDomain: String = "https://composer.local.dev-gutools.co.uk"
override def targetingDomain: String = "https://targeting.local.dev-gutools.co.uk"
override def campaignCentralDomain: String = "https://campaign-central.local.dev-gutools.co.uk"
override def workflowDomain: String = "https://workflow.local.dev-gutools.co.uk"
override def corsableDomains: Seq[String] = Seq(
composerDomain,
targetingDomain,
campaignCentralDomain,
workflowDomain
)
override def corsablePostDomains: Seq[String] = Seq(
targetingDomain
)
}
class CodeConfig extends Config {
override def tagsTableName: String = "tag-manager-tags-CODE"
override def sectionsTableName: String = "tag-manager-sections-CODE"
override def sponsorshipTableName: String = "tag-manager-sponsorships-CODE"
override def sequenceTableName: String = "tag-manager-sequences-CODE"
override def referencesTypeTableName: String = "tag-manager-reference-type-CODE"
override def pillarsTableName: String = "tag-manager-pillars-CODE"
override def pillarsAuditTableName: String = "tag-manager-pillars-audit-CODE"
override def jobTableName: String = "tag-manager-background-jobs-CODE"
override def tagAuditTableName: String = "tag-manager-tag-audit-CODE"
override def sectionAuditTableName: String = "tag-manager-section-audit-CODE"
override def clusterStatusTableName: String = "tag-manager-cluster-status-CODE"
override def tagUpdateStreamName: String = "tag-update-stream-CODE"
override def sectionUpdateStreamName: String = "section-update-stream-CODE"
override def taggingOperationsStreamName: String = "tagging-operations-stream-CODE"
override def taggingOperationsReIndexStreamName: String = "tagging-reindex-operations-stream-CODE"
override def commercialExpiryStreamName: String = "commercial-expiry-stream-CODE"
override def auditingStreamName: String = "auditing-CODE"
override def pillarUpdateStreamName: String = "pillar-update-stream-CODE"
override def reindexTagsStreamName: String = "tag-reindex-CODE"
override def reindexTagsBatchSize: Int = 500
override def reindexSectionsStreamName: String = "section-reindex-CODE"
override def reindexPillarsStreamName: String = "pillar-reindex-CODE"
override def reindexProgressTableName: String = "tag-manager-reindex-progress-CODE"
override def appAuditTableName: String = "tag-manager-app-audit-CODE"
override def jobQueueName: String = "tag-manager-job-queue-CODE"
override def logShippingStreamName = Some("elk-PROD-KinesisStream-1PYU4KS1UEQA")
override def pandaDomain: String = "code.dev-gutools.co.uk"
override def pandaSettingsFileKey: String = "code.dev-gutools.co.uk.settings"
override def pandaAuthCallback: String = "https://tagmanager.code.dev-gutools.co.uk/oauthCallback"
override def composerDomain: String = "https://composer.code.dev-gutools.co.uk"
override def targetingDomain: String = "https://targeting.code.dev-gutools.co.uk"
override def campaignCentralDomain: String = "https://campaign-central.code.dev-gutools.co.uk"
override def workflowDomain: String = "https://workflow.code.dev-gutools.co.uk"
override def corsableDomains: Seq[String] = Seq(
composerDomain,
"https://composer-secondary.code.dev-gutools.co.uk",
"https://composer.local.dev-gutools.co.uk",
targetingDomain,
"https://targeting.local.dev-gutools.co.uk",
campaignCentralDomain,
"https://campaign-central.local.dev-gutools.co.uk",
workflowDomain,
"https://workflow.local.dev-gutools.co.uk"
)
override def frontendBucketWriteRole: Option[String] = Some("arn:aws:iam::642631414762:role/composerWriteToStaticBucket")
override def corsablePostDomains: Seq[String] = Seq(
targetingDomain,
"https://targeting.local.dev-gutools.co.uk"
)
}
class ProdConfig extends Config {
override def tagsTableName: String = "tag-manager-tags-PROD"
override def sectionsTableName: String = "tag-manager-sections-PROD"
override def sponsorshipTableName: String = "tag-manager-sponsorships-PROD"
override def sequenceTableName: String = "tag-manager-sequences-PROD"
override def referencesTypeTableName: String = "tag-manager-reference-type-PROD"
override def pillarsTableName: String = "tag-manager-pillars-PROD"
override def pillarsAuditTableName: String = "tag-manager-pillars-audit-CODE"
override def jobTableName: String = "tag-manager-background-jobs-PROD"
override def tagAuditTableName: String = "tag-manager-tag-audit-PROD"
override def sectionAuditTableName: String = "tag-manager-section-audit-PROD"
override def clusterStatusTableName: String = "tag-manager-cluster-status-PROD"
override def auditingStreamName: String = "auditing-PROD"
override def pillarUpdateStreamName: String = "pillar-update-stream-PROD"
override def tagUpdateStreamName: String = "tag-update-stream-PROD"
override def sectionUpdateStreamName: String = "section-update-stream-PROD"
override def taggingOperationsStreamName: String = "tagging-operations-stream-PROD"
override def taggingOperationsReIndexStreamName: String = "tagging-reindex-operations-stream-PROD"
override def commercialExpiryStreamName: String = "commercial-expiry-stream-PROD"
override def reindexTagsStreamName: String = "tag-reindex-PROD"
override def reindexTagsBatchSize: Int = 500
override def reindexSectionsStreamName: String = "section-reindex-PROD"
override def reindexPillarsStreamName: String = "pillar-reindex-PROD"
override def reindexProgressTableName: String = "tag-manager-reindex-progress-PROD"
override def appAuditTableName: String = "tag-manager-app-audit-PROD"
override def jobQueueName: String = "tag-manager-job-queue-PROD"
override def logShippingStreamName = Some("elk-PROD-KinesisStream-1PYU4KS1UEQA")
override def pandaDomain: String = "gutools.co.uk"
override def pandaSettingsFileKey: String = "gutools.co.uk.settings"
override def pandaAuthCallback: String = "https://tagmanager.gutools.co.uk/oauthCallback"
override def composerDomain: String = "https://composer.gutools.co.uk"
override def targetingDomain: String = "https://targeting.gutools.co.uk"
override def campaignCentralDomain: String = "https://campaign-central.gutools.co.uk"
override def workflowDomain: String = "https://workflow.gutools.co.uk"
override def corsableDomains: Seq[String] = Seq(
composerDomain,
targetingDomain,
campaignCentralDomain,
workflowDomain,
"https://composer-secondary.gutools.co.uk"
)
override def frontendBucketWriteRole: Option[String] = Some("arn:aws:iam::642631414762:role/composerWriteToStaticBucket")
override def corsablePostDomains: Seq[String] = Seq(
targetingDomain
)
}