@startuml

title WP4 - Infrastructure As Code Layer \n Architecture Overview

skinparam fixCircleLabelOverlapping true 
skinparam defaultFontSize 20

'reference to WP3
component "SODALITE IDE" as cSIDE #PaleGreen
component "Ansible Support" as cAnsible
cSIDE*-r-cAnsible

'Modelling Layer APIs
interface "SemanticReasonerAPI"  as repoEndpoint #PaleGreen

'security APIs
interface "Secret\nVaultAPI" as VaultAPI #LightSlateGrey
interface "IAM\nServiceAPI" as iIAM #LightSlateGrey

'Runtime Layer APIs
interface "OrchestratorAPI"  as orchEndpoint #LightBlue

'WP4 components and packages
package "Deployment\nPreparation" as pDP {
    component [Abstract\nModel\nParser] as cAbstractModelParser
    component [IaC\nBlueprint\nbuilder] as cIaCBlueprintBuilder
    cIaCBlueprintBuilder -r-> cAbstractModelParser:use
    interface "Deployment\nPreparationAPI"  as iBluePrintGeneratorAPI
    cIaCBlueprintBuilder -u- iBluePrintGeneratorAPI    
}

package "Image Builder" {
    component [Runtime\nImage\nBuilder] as cRuntimeImageBuilder
    component [Concrete\nImage\nBuilder] as cConcreteImageBuilder
    interface "Image\nBuilderAPI"  as iRuntimeImageBuilder
    database "Image\nRegistry" as dIR
    interface "Image\nRegistryAPI" as iIRDataAccess
    cRuntimeImageBuilder -r- iRuntimeImageBuilder
    cRuntimeImageBuilder -u-> cConcreteImageBuilder:use
    dIR -- iIRDataAccess
    cRuntimeImageBuilder -l-( iIRDataAccess
}

package "IaC Verification" as pIV {
    component [IaC Verifier] as cIaCVerifier
    interface "IaCVerificationAPI"  as iIaCVerifier
    cIaCVerifier -r- iIaCVerifier
    component [Verification\nModel\nBuilder] as cVerificationModelBuilder
    component [Topology\nVerifier] as cTopologyVerifier
    component [Provisioning\nWorkflow\nVerifier] as cProvisioningWorkflowVerifier
    cIaCVerifier -d-> cVerificationModelBuilder:use
    cIaCVerifier -d-> cTopologyVerifier:use
    cIaCVerifier -u-> cProvisioningWorkflowVerifier:use
}

package "Defect Prediction\nand Correction" as pDPC {
    component [Bug Predictor\nand Fixer ] as cBugPredictorAndFixer
    interface "DefectPrediction\nCorrectionAPI"  as iBugPredictorAndFixer
    cBugPredictorAndFixer -u- iBugPredictorAndFixer
    component [Predictive\nModel\nBuilder] as cPredictiveModelBuilder
    component [IaC Quality\nAssessor] as cIaCQualityAssessor
    cBugPredictorAndFixer --> cIaCQualityAssessor:use
    cBugPredictorAndFixer --> cPredictiveModelBuilder:use
}

package "Performance\nOptimisation" as packagePO {
    component "Application\nOptimiser" as cApplicationOptimiser
    interface "Application\nOptimiserAPI"  as iApplicationOptimiser
    cApplicationOptimiser -r- iApplicationOptimiser
}


package "Platform\nDiscovery" as packagePD {
    component "Platform\nDiscovery" as cPlatformDiscovery
    interface "Platform\nDiscoveryAPI"  as iPlatformDiscovery
    cPlatformDiscovery -u- iPlatformDiscovery
}

cSIDE -d-( iBluePrintGeneratorAPI
cSIDE -d-( iIaCVerifier
cSIDE -d-( iBugPredictorAndFixer
cSIDE -d-( iPlatformDiscovery
cSIDE -d-( iIAM
cSIDE -d-( VaultAPI

cIaCBlueprintBuilder -d-( iApplicationOptimiser
cSIDE -u-( iRuntimeImageBuilder

cPredictiveModelBuilder -d-( repoEndpoint
cVerificationModelBuilder -d-( repoEndpoint
cApplicationOptimiser -d-( repoEndpoint
cPlatformDiscovery -d-( repoEndpoint

cPlatformDiscovery -u-( iIAM
cPlatformDiscovery -u-( VaultAPI
cIaCBlueprintBuilder -u-( iIAM
cIaCBlueprintBuilder -u-( VaultAPI
cIaCBlueprintBuilder -d-( orchEndpoint
@enduml
