@startuml kubernetes
footer Phenom k8s infrastructure
scale max 1480 width

skinparam nodesep 10
skinparam ranksep 10

' 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/KubernetesSvc.puml
!include KubernetesPuml/OSS/KubernetesIng.puml
!include KubernetesPuml/OSS/KubernetesPod.puml
!include KubernetesPuml/OSS/KubernetesRs.puml
!include KubernetesPuml/OSS/KubernetesDeploy.puml
!include KubernetesPuml/OSS/KubernetesHpa.puml
!include KubernetesPuml/OSS/KubernetesCm.puml


!define KUBERNETES_CLUSTER_COLOR #326CE5
!define KUBERNETES_NODE_COLOR #096B24
!define KUBERNETES_POD_COLOR #09E508
!define KUBERNETES_SERVICE_COLOR #FCC133
!define KUBERNETES_FONT_COLOR #000000
!define KUBERNETES_BACKGROUND_COLOR #FFFFFF

' Aws
!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v10.0/dist

!include AWSPuml/AWSCommon.puml
!include AWSPuml/Containers/ElasticContainerRegistry.puml
!include AWSPuml/BusinessApplications/all.puml
!include AWSPuml/Storage/SimpleStorageService.puml
!include AWSPuml/ApplicationIntegration/SimpleNotificationService.puml
!include AWSPuml/ApplicationIntegration/SimpleQueueService.puml
!include AWSPuml/Database/AuroraPostgreSQLInstance.puml
!include AWSPuml/Database/ElastiCacheElastiCacheforRedis.puml
'!include AWSPuml/Containers/ElasticKubernetesServices.puml
!include AWSPuml/NetworkingContentDelivery/Route53HostedZone.puml
'!include AWSPuml/AWSSimplified.puml

' hindawi theme
' !include https://gitlab.com/hindawi/phenom-commons/-/raw/master/puml-theme-hindawi.puml
!include ./../../puml-theme-hindawi.puml

left to right direction

skinparam component<<AWS_STACK>> {
  BackgroundColor white
  BorderColor cyan
}

together k8s_stuff {

  together vpcs {
    cloud VPC_DEV as "VPC" {
      Cluster_Boundary(cluster_dev, "Development K8s Cluster") {
          Namespace_Boundary(ns_qa, "Qa") {
            node mynode2 [
                  K8s Charts
                  ====
                  review
                  ....
                  invoicing
                  ....
                  screening
                  ....
                     ...
                ]
          }
          Namespace_Boundary(ns_demo, "Demo") {
            node mynode3 [
                  K8s Charts
                  ====
                  review
                  ....
                  invoicing
                  ....
                  screening
                  ....
                      ...
                ]
          }
          Namespace_Boundary(ns_next, "...") {
                  node mynode4 [
                        K8s Charts
                        ====
                        review
                        ....
                        invoicing
                        ....
                        screening
                        ....
                            ...
                      ]
                }
      }
    }

    cloud VPC_PROD as "VPC" {
      Cluster_Boundary(cluster_prod, "Production K8s Cluster") {

        Namespace_Boundary(ns_prod, "Prod") {
          node mynode1 [
            K8s Charts
            ====
            review
            ....
            invoicing
            ....
            screening
            ....
              ...
          ]
        }

        Namespace_Boundary(ns_prod_gsw, "Prod-GSW") {
            node mynode0 [
              K8s Charts
              ====
              review
              ....
              invoicing
              ....
              screening
              ....
                ...
            ]
        }

        Namespace_Boundary(ns_prod_next, "...") {
            node mynode6 [
              K8s Charts
              ====
              review
              ....
              invoicing
              ....
              screening
              ....
                ...
            ]
        }
      }
    }
  }

  Namespace_Boundary(ns_details, "Prod") {
    package microservice_chart as "Review k8s chart" {
          KubernetesIng(ingress, "review.phenom.pub", ""){

          }

          KubernetesSvc(svc, "service", "")
          KubernetesPod(pod1, "pod1", "")
          KubernetesPod(pod2, "pod2", "")
          KubernetesPod(pod3, "pod3", "")

          KubernetesRs(rs,"replica set","")
          KubernetesDeploy(deploy,"deployment","")


          rectangle envCms as "Environment specific config maps"{
            KubernetesCm(cm1, "Db cm", "")
            KubernetesCm(cm2, "Topic cm", "")
            KubernetesCm(cm2, "Topic cm", "")
            KubernetesCm(cm3, "...", "")
            }
          rectangle appCms as "Application specific config maps"{
            KubernetesCm(cm4, "Queue cm", "")
            KubernetesCm(cm5, "Buckets cm", "")
            KubernetesCm(cm6, "...", "")
            }

          KubernetesHpa(hpa, "autoscaler", "")
    }
  }
}

rectangle "aws account" as aws_account {

   component core_stack as "core stack"

   component env_stacks {
     component qa_env_stack as "qa-env stack"
     component demo_env_stack as "demo-env stack"
    }

   component app_stacks {
     component review_qa_stack as "review_qa stack"
     component invoicing_qa_stack as "invoicing_qa stack"
     component review_demo_stack as "review_demo stack"
     component invoicing_demo_stack as "invoicing_demo stack"
     component next_stack as ".......... stack"
      invoicing_qa_stack -[hidden] review_qa_stack
      invoicing_demo_stack -[hidden] review_demo_stack
    }

'    qa_env_stack -[hidden] demo_env_stack
    core_stack -[hidden]down-env_stacks
    env_stacks -[hidden]down-app_stacks

}

component core_stack_details{
      ElasticContainerRegistry(ecr1, "ECR","review_repository","")
      ElasticContainerRegistry(ecr2, "ECR","invoicing_repository","")
      ElasticContainerRegistry(ecr3, "ECR","...","")
      ecr1-->ecr2
      ecr2-->ecr3
  core_stack -left-> core_stack_details
}

component env_stack_details {
  SimpleStorageService(s3_qa, "S3", "large events bucket", "")
  SimpleNotificationService(sns_qa, "SNS", "Phenom qa topic", "")
  AuroraPostgreSQLInstance(db_qa, "Db", "qa database")
  Route53HostedZone(zone, "Route53", "hosted zone")

  s3_qa --[hidden] sns_qa
  s3_qa ---[hidden] db_qa
  db_qa --[hidden] zone


 qa_env_stack -down--> env_stack_details
}

component app_stack_details {
   SimpleStorageService(s3_env3, "S3", "bucket", "")
   SimpleQueueService(sqs_qa, "SQS", "queue", "")
   ElastiCacheElastiCacheforRedis(redis, "Redis", "Redis")

   s3_env3 -[hidden]- sqs_qa
   sqs_qa --[hidden] redis
   sqs_qa .> sns_qa :subscribe


   review_qa_stack -down--> app_stack_details
}

k8s_stuff -[hidden]left-> aws_account
vpcs ----[hidden] ns_details

ns_prod --[hidden] ns_prod_gsw
ns_prod_gsw --[hidden] ns_prod_next

ns_qa --[hidden] ns_demo
ns_demo --[hidden] ns_next

ns_prod -[hidden] ns_qa
ns_prod_next -->ns_details

Rel(ingress,svc," ")
Rel(svc,pod1," ")
Rel(svc,pod2," ")
Rel(svc,pod3," ")

cm1 --[hidden] cm2
cm2 --[hidden] cm3
cm4 --[hidden] cm5
cm5 --[hidden] cm6

appCms -[hidden] envCms
appCms -left-> deploy

'Rel(cm1,deploy," ")


Rel_U(rs,pod1," ")
Rel_U(rs,pod2," ")
Rel_U(rs,pod3," ")
Rel_U(deploy,rs, " ")
Rel_U(hpa,deploy, " ")

@enduml
