@startuml 

!startsub DEFAULTS
scale max 1024 width

skinparam nodesep 10
skinparam ranksep 10

' defaults
!$NAMESPACE ?= "test-sitecore-master"
!$PROJECT_NAME ?= "k8s"
!$CLUSTER_NAME ?= "aksdc1"
!$NS_KEY_PREFIX ?= "k8s"
!$IS_PROD ?= %true()
!$USE_RENDERINGHOST ?= %true()
!$USE_APPINSIGHTS ?= %true()
!$INCLUDE_INFRASTRUCTURE ?= %false()
!endsub

!startsub IMPORTS
' Azure
!define AzurePuml https://raw.githubusercontent.com/RicardoNiepel/Azure-PlantUML/release/2-1/dist

!include <azure/AzureCommon>
!include <azure/AzureSimplified>

!include AzurePuml/Containers/AzureContainerRegistry.puml
!include AzurePuml/Containers/AzureKubernetesService.puml
!include AzurePuml/Compute/AzureVirtualMachineScaleSet.puml
!include AzurePuml/Databases/AzureCosmosDb.puml
!include AzurePuml/Databases/AzureSqlDatabase.puml
!include AzurePuml/DevOps/AzurePipelines.puml
!include AzurePuml/DevOps/AzureApplicationInsights.puml
!include AzurePuml/Identity/AzureActiveDirectory.puml
!include AzurePuml/Networking/AzureLoadBalancer.puml
!include AzurePuml/Security/AzureKeyVault.puml

' Kubernetes
!define KubernetesPuml https://raw.githubusercontent.com/dcasati/kubernetes-PlantUML/master/dist

!include KubernetesPuml/kubernetes_Common.puml
!include KubernetesPuml/kubernetes_Context.puml
!include KubernetesPuml/kubernetes_Simplified.puml

!include KubernetesPuml/OSS/KubernetesApi.puml
!include KubernetesPuml/OSS/KubernetesIng.puml
!include KubernetesPuml/OSS/KubernetesPod.puml
!include KubernetesPuml/OSS/KubernetesPvc.puml
!include KubernetesPuml/OSS/KubernetesVol.puml

' stdlib
!include <tupadr3/common>
!include <tupadr3/devicons/firefox>

!define KUBERNETES_NS_COLOR black
AzureEntityColoring(DEV_FIREFOX)

!define Namespace_Dashed_Boundary(e_alias, e_label) rectangle "==e_label\n<size:TECHN_FONT_SIZE>[Namespace]</size>" <<namespace_dashed>> as e_alias
skinparam rectangle<<namespace>> {
   BorderColor KUBERNETES_NS_COLOR
 }
skinparam rectangle<<namespace_dashed>> {
    StereotypeFontColor KUBERNETES_FONT_COLOR
    FontColor KUBERNETES_FONT_COLOR
    BorderStyle dashed
    BorderColor KUBERNETES_NS_COLOR
    BackgroundColor KUBERNETES_BACKGROUND_COLOR
    RoundCorner 25
}

!endsub

!startsub AZURE_COMPONENTS

DEV_FIREFOX(browser, "Client Apps")

' Azure Components
AzureContainerRegistry(acr, "ACR\nContainer Registry", AzureRegion)
AzureLoadBalancer(alb, "Load Balancer", AzureRegion)
AzurePipelines(ado_solution, "CI/CD\nAzure Pipelines\nsolution", "Global")

!if ($IS_PROD == %true())
    AzureSqlDatabase(sql, "Azure SQL", AzureRegion)
!endif

!if ($USE_APPINSIGHTS == %true())
AzureApplicationInsights(insights, "Application Insights", " ")
!endif

!endsub


' Kubernetes Components
Cluster_Boundary(cluster, "Azure Kubernetes Cluster") {
    AzureKubernetesService(aksdc1, "$CLUSTER_NAME", "Azure Kubernetes Cluster") {
        KubernetesApi(KubernetesApi, "Kubernetes API", "")

        Namespace($NS_KEY_PREFIX##_ns, "$NAMESPACE") {

            !startsub NS_SECTION
            KubernetesIng($NS_KEY_PREFIX##_ingress, "ingress", "")

            KubernetesPod($NS_KEY_PREFIX##_cm, "sitecore-cm", "Content Management")
            KubernetesPod($NS_KEY_PREFIX##_cd, "sitecore-cd", "Content Delivery")
            KubernetesPod($NS_KEY_PREFIX##_solr, "sitecore-solr", "")
            KubernetesPvc($NS_KEY_PREFIX##_solrpvc, "solr-pvc", "Persisted Volume Claim")
            Rel($NS_KEY_PREFIX##_solr, $NS_KEY_PREFIX##_solrpvc, " ")
            KubernetesVol($NS_KEY_PREFIX##_solrpv, "solr-pv", "Persisted Volume")
            Rel($NS_KEY_PREFIX##_solrpvc, $NS_KEY_PREFIX##_solrpv, " ")
            
            !if ($IS_PROD == %false())
                KubernetesPod($NS_KEY_PREFIX##_sql, "sitecore-sql", "")
                KubernetesPvc($NS_KEY_PREFIX##_sqlpvc, "sql-pvc", "Persisted Volume")
                Rel($NS_KEY_PREFIX##_sql, $NS_KEY_PREFIX##_sqlpvc, " ")
                KubernetesVol($NS_KEY_PREFIX##_sqlpv, "sql-pv", "Persisted Volume")
                Rel($NS_KEY_PREFIX##_sqlpvc, $NS_KEY_PREFIX##_sqlpv, " ")
            !endif

            !if ($USE_RENDERINGHOST == %true())
                KubernetesPod($NS_KEY_PREFIX##_www, "sitecore-www", "Rendering host")
                Rel($NS_KEY_PREFIX##_ingress, $NS_KEY_PREFIX##_www, " ")
                Rel($NS_KEY_PREFIX##_www, $NS_KEY_PREFIX##_cd, "Layout\nservice")
                Rel_U($NS_KEY_PREFIX##_cm, $NS_KEY_PREFIX##_www, "Editing\nmode")
            !else
                Rel($NS_KEY_PREFIX##_ingress, $NS_KEY_PREFIX##_cd, " ")
            !endif

            Rel_D(alb, $NS_KEY_PREFIX##_ingress, " ", "HTTP")
            Rel($NS_KEY_PREFIX##_ingress, $NS_KEY_PREFIX##_cm, " ")

            Rel_D($NS_KEY_PREFIX##_cm, $NS_KEY_PREFIX##_solr, " ")
            Rel_D($NS_KEY_PREFIX##_cd, $NS_KEY_PREFIX##_solr, " ")

            !if ($IS_PROD == %true())
                Rel_R($NS_KEY_PREFIX##_cm, sql, " ")
                Rel_R($NS_KEY_PREFIX##_cd, sql, " ")
            !else
                Rel($NS_KEY_PREFIX##_cm, $NS_KEY_PREFIX##_sql, " ")
                Rel($NS_KEY_PREFIX##_cd, $NS_KEY_PREFIX##_sql, " ")

            !endif

            !if ($USE_APPINSIGHTS == %true())
                $NS_KEY_PREFIX##_ns -down.-.-> insights : "Logs"
            !endif

            !endsub
        }
    }
}

!startsub AZURE_COMPONENTS_RELATIONS
    Rel_U(ado_solution, KubernetesApi, " ")

    Rel_D(browser, alb, " ", "HTTP")

    Rel_U(ado_solution, acr, "docker push")
    Rel_D(KubernetesApi, acr, "docker pull")
!endsub

' Infrastructure pipeline
!if ($INCLUDE_INFRASTRUCTURE == %true())
!startsub INFRASTRUCTURE_PIPELINE
    AzureVirtualMachineScaleSet(aks_pool_win, "Windows servers", "ScaleSet")
    AzureVirtualMachineScaleSet(aks_pool_linux, "Linux servers", "ScaleSet")
    AzurePipelines(ado_infrastructure, "CI/CD\nAzure Pipelines\ninfrastruktur", "Global")
    ' Rel_U(ado_infrastructure, acr, "Create \nresources")
    Rel(ado_infrastructure, cluster, "Create \nresources")
    Rel(ado_infrastructure, aks_pool_win, "Create \nresources\n")
    Rel(ado_infrastructure, aks_pool_linux, "Create \nresources\n")
    cluster -up.-> aks_pool_win: "Runs on"
    cluster -up.-> aks_pool_linux: "Runs on"

    !if ($USE_APPINSIGHTS == %true())
        Rel(ado_infrastructure, insights, "Create\nresource")
    !endif
!endsub
!endif

@enduml