Skip to content

Commit

Permalink
Add new gcp cluster scripts; refactor run to be somewhat modularized
Browse files Browse the repository at this point in the history
  • Loading branch information
stephen-vakil committed Sep 20, 2024
1 parent 4aec94f commit c1ca1da
Show file tree
Hide file tree
Showing 6 changed files with 187 additions and 145 deletions.
4 changes: 4 additions & 0 deletions cnab/app/app-discovery.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
function Get-AppName() {
$app = 'opserver'
return $app
}
31 changes: 31 additions & 0 deletions cnab/app/container-registry-discovery.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
function Find-ContainerRegistry([string]$imageTag) {
Write-MinorStep "Finding Container Registry for tag: $imageTag"
# PR container images are located in `cr-dev` in CloudSmith. As opposed to `cr` which we use for release builds.
$isPr = IsPr $imageTag
if ($isPr) {
$containerRegistryUrl = 'cr.stackoverflow.software'
$pullSecretName = 'cloudsmith-cr-prod'
$forceUpgrade = @('--force') # This'll force pods to be recreated with freshly-pulled images
}
else {
$containerRegistryUrl = 'cr.stackoverflow.software'
$pullSecretName = 'cloudsmith-cr-prod'
$forceUpgrade = @()
}

$containerRegistryDetails = new-object psobject -property @{
Url = $containerRegistryUrl
PullSecretName = $pullSecretName
ForceUpgrade = $forceUpgrade
}
Write-MinorStep "Registry Details: $($containerRegistryDetails | ConvertTo-Json)"

return $containerRegistryDetails
}

function IsPr([string]$imageTag) {
$isPr = $imageTag -match '(^pr-[0-9]+(-[0-9]+)?$)|([0-9\.]*-pr?$)'
Write-MinorStep "Is PR: $isPr"
return $isPr
}

4 changes: 2 additions & 2 deletions cnab/app/gcp-cluster-discovery.ps1
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
function FindDeploymentGroup([string]$filter) {
function Find-DeploymentGroup([string]$filter) {
Write-MinorStep "Finding GCP deployment group (project) using filter: $filter"
$projects = (gcloud projects list --filter=$filter --format=json | ConvertFrom-Json)
if ($null -eq $projects -Or $projects.Count -eq 0) {
Expand All @@ -14,7 +14,7 @@ function FindDeploymentGroup([string]$filter) {
return $project
}

function FindDeploymentTarget([string]$filter, [string]$deploymentGroup) {
function Find-DeploymentTarget([string]$filter, [string]$deploymentGroup) {
Write-MinorStep "Finding GCP deployment target (cluster) using filter: $filter and deployment group (project): $deploymentGroup"

$clusters = (gcloud container clusters list --project=$deploymentGroup --format=json | ConvertFrom-Json)
Expand Down
85 changes: 85 additions & 0 deletions cnab/app/generate-values.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
function Generate-Values() {
Write-MajorStep "Generating Helm values"
$values = @{
tier = $environment
replicaCount = $vars.vars.replicaCount
aspnetcoreEnvironment = $vars.vars.aspnetcoreEnvironment
exceptionalDbName = $vars.vars.exceptionalDbName;
product = "pubplat"

images = @{
containerRegistry = "$containerRegistryUrl"
opserver = @{
tag = $releaseTag
}
}

requests = @{
cpu = $vars.vars.requestsCPU
memory = $vars.vars.requestsMemory
}

limits = @{
memory = $vars.vars.limitsMemory
}

podDisruptionBudget = @{
minAvailable = $vars.vars.podDisruptionBudgetMinAvailable
}

exceptional = @{
store = @{
type = $vars.vars.exceptionalStoreType
}
}

datadog = @{
agentHost = $vars.vars.datadogAgentHost
agentPort = $vars.vars.datadogAgentPort
}

kestrel = @{
endPoints = @{
http = @{
url = "http://0.0.0.0:8080/"
containerPort = "8080"
}
}
}

secretStore = @{
fake = $vars.runtime.local
}

image = @{
pullSecretName = $pullSecretName
}

ingress = @{
className = "nginx-internal"
certIssuer = "letsencrypt-dns-prod"
host = $vars.vars.opserverSettings.hostUrl
enabled = $vars.vars.includeIngress
secretName = "opserver-tls"
createTlsCert = $true
}

sqlExternalSecret = @{
storeRefName = $vars.vars.secretStore
}

opserverExternalSecret = @{
storeRefName = $vars.vars.secretStore
}

opserverSettings = $vars.vars.opserverSettings

adminRolebindingGroupId = $vars.vars.adminRolebindingGroupId
}

# Helm expects a YAML file but YAML is also a superset of JSON, so we can use ConvertTo-Json here
$valuesFileContent = $values | ConvertTo-Json -Depth 100
Write-Output "Populated Helm values:"
Write-Output $valuesFileContent
return $valuesFileContent
}
119 changes: 17 additions & 102 deletions cnab/app/run.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,14 @@ trap {
break
}

Write-Output "$($PSStyle.Bold)Installing opserver...$($PSStyle.BoldOff)"
. $PSScriptRoot/app-discovery.ps1
. $PSScriptRoot/generate-values.ps1
. $PSScriptRoot/container-registry-discovery.ps1
. $PSScriptRoot/utils.ps1


$app = Get-AppName
Write-Output "$($PSStyle.Bold)Installing $app...$($PSStyle.BoldOff)"

$action = $env:CNAB_ACTION

Expand All @@ -29,7 +36,7 @@ if (-not $env:INSTALLATION_METADATA) {

Write-Verbose "INSTALLATION_METADATA is set to '$env:INSTALLATION_METADATA'"
$vars = (Get-Content $env:INSTALLATION_METADATA | ConvertFrom-Json)
. $PSScriptRoot/utils.ps1
Initialize-Logging

if ($runAsContainer) {
Write-Output "Running as container"
Expand All @@ -44,18 +51,10 @@ $project = $vars.pipeline.project

$releaseTag = $vars.pipeline.releaseTag

# PR container images are located in `cr-dev` in CloudSmith. As opposed to `cr` which we use for release builds.
$isPr = $releaseTag -match '^pr-[0-9]+$'
if ($isPr) {
$containerRegistryUrl = 'cr.stackoverflow.software'
$pullSecretName = 'cloudsmith-cr-prod'
$forceUpgrade = @('--force') # This'll force pods to be recreated with freshly-pulled images
}
else {
$containerRegistryUrl = 'cr.stackoverflow.software'
$pullSecretName = 'cloudsmith-cr-prod'
$forceUpgrade = @()
}
$containerRegistryDetails = Find-ContainerRegistry $releaseTag
$containerRegistryUrl = $containerRegistryDetails.Url
$pullSecretName = $containerRegistryDetails.PullSecretName
$forceUpgrade = $containerRegistryDetails.ForceUpgrade

Write-Output "Container registry: $containerRegistryUrl"
Write-Output "Pull secret name: $pullSecretName"
Expand All @@ -79,9 +78,9 @@ Write-MajorStep "Running $action for Tenant: $tenant - Environment: $environment

if ($vars.runtime.name -eq "GCP") {
. $PSScriptRoot/gcp-cluster-discovery.ps1
Write-MajorStep "Finding GCP deployment instance (project) and cluster"
$deploymentGroup = FindDeploymentGroup "labels.env=dev AND labels.project=base AND labels.product=pubplat AND labels.instance=ascn-dev"
$deploymentTarget = FindDeploymentTarget "deployment_target=true" $deploymentGroup
Write-MajorStep "Finding Deployment Group and Deployment Targetr"
$deploymentGroup = Find-DeploymentGroup "labels.env=dev AND labels.project=base AND labels.product=pubplat AND labels.instance=ascn-dev"
$deploymentTarget = Find-DeploymentTarget "deployment_target=true" $deploymentGroup

if ($runAsContainer) {
Write-MajorStep "Setting GCP cluster credentials"
Expand All @@ -94,8 +93,6 @@ if ($vars.runtime.name -eq "GCP") {

# Get cluster credentials
Start-Process gcloud -ArgumentList $clusterCredArgs -NoNewWindow -Wait

exit 2
}
}

Expand All @@ -104,89 +101,7 @@ switch ($action) {
"install" {
Write-MajorStep "Install action"

$app = 'opserver'

$values = @{
tier = $environment
replicaCount = $vars.vars.replicaCount
aspnetcoreEnvironment = $vars.vars.aspnetcoreEnvironment
exceptionalDbName = $vars.vars.exceptionalDbName;
product = "pubplat"

images = @{
containerRegistry = "$containerRegistryUrl"
opserver = @{
tag = $releaseTag
}
}

requests = @{
cpu = $vars.vars.requestsCPU
memory = $vars.vars.requestsMemory
}

limits = @{
memory = $vars.vars.limitsMemory
}

podDisruptionBudget = @{
minAvailable = $vars.vars.podDisruptionBudgetMinAvailable
}

exceptional = @{
store = @{
type = $vars.vars.exceptionalStoreType
}
}

datadog = @{
agentHost = $vars.vars.datadogAgentHost
agentPort = $vars.vars.datadogAgentPort
}

kestrel = @{
endPoints = @{
http = @{
url = "http://0.0.0.0:8080/"
containerPort = "8080"
}
}
}

secretStore = @{
fake = $vars.runtime.local
}

image = @{
pullSecretName = $pullSecretName
}

ingress = @{
className = "nginx-internal"
certIssuer = "letsencrypt-dns-prod"
host = $vars.vars.opserverSettings.hostUrl
enabled = $vars.vars.includeIngress
secretName = "opserver-tls"
createTlsCert = $true
}

sqlExternalSecret = @{
storeRefName = $vars.vars.secretStore
}

opserverExternalSecret = @{
storeRefName = $vars.vars.secretStore
}

opserverSettings = $vars.vars.opserverSettings

adminRolebindingGroupId = $vars.vars.adminRolebindingGroupId
}

# Helm expects a YAML file but YAML is also a superset of JSON, so we can use ConvertTo-Json here
$valuesFileContent = $values | ConvertTo-Json -Depth 100
Write-Output "Populated Helm values:"
Write-Output $valuesFileContent
$valuesFileContent = Generate-Values

$tmpDir = [System.IO.Directory]::CreateTempSubdirectory($app + '-')
$valuesFilePath = (Join-Path $tmpDir.FullName 'populated-values.yml')
Expand Down
Loading

0 comments on commit c1ca1da

Please sign in to comment.