Add uml diagrams as reference for original implementation complexity
Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
parent
4aa54423b6
commit
3cc8acb31a
|
|
@ -0,0 +1,367 @@
|
||||||
|
@startuml "Helmfile Commands Flow"
|
||||||
|
|
||||||
|
' Color scheme - eye-friendly colors with darker headers
|
||||||
|
skinparam {
|
||||||
|
ClassBackgroundColor #E8F4F9
|
||||||
|
ClassHeaderBackgroundColor #5D8AA8
|
||||||
|
ClassFontColor #000000
|
||||||
|
ClassStereotypeFontColor #FFFFFF
|
||||||
|
ClassAttributeFontColor #000000
|
||||||
|
ClassFontStyle bold
|
||||||
|
|
||||||
|
PackageBackgroundColor #F5F5F5
|
||||||
|
PackageBorderColor #DDDDDD
|
||||||
|
|
||||||
|
NoteBackgroundColor #FFF8DC
|
||||||
|
NoteBorderColor #DCDCAA
|
||||||
|
|
||||||
|
ArrowColor #5D8AA8
|
||||||
|
}
|
||||||
|
|
||||||
|
package "cmd" {
|
||||||
|
class "RootCmd" as RootCmd {
|
||||||
|
+Execute(): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "DiffCmd" as DiffCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "ApplyCmd" as ApplyCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "SyncCmd" as SyncCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "TemplateCmd" as TemplateCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "LintCmd" as LintCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "StatusCmd" as StatusCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "DeleteCmd" as DeleteCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "TestCmd" as TestCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "FetchCmd" as FetchCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
|
||||||
|
class "WriteValuesCmd" as WriteValuesCmd {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/config" {
|
||||||
|
interface "ConfigProvider" as ConfigProvider {
|
||||||
|
+KubeContext(): string
|
||||||
|
+HelmBinary(): string
|
||||||
|
+Logger(): *zap.SugaredLogger
|
||||||
|
+Args(): string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "DiffConfigProvider" as DiffConfigProvider {
|
||||||
|
+DiffArgs(): string
|
||||||
|
+DetailedExitcode(): bool
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "ApplyConfigProvider" as ApplyConfigProvider {
|
||||||
|
+SyncArgs(): string
|
||||||
|
+Wait(): bool
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "SyncConfigProvider" as SyncConfigProvider {
|
||||||
|
+SyncArgs(): string
|
||||||
|
+Wait(): bool
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "TemplateConfigProvider" as TemplateConfigProvider {
|
||||||
|
+OutputDir(): string
|
||||||
|
+IncludeCRDs(): bool
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "LintConfigProvider" as LintConfigProvider {
|
||||||
|
+Values(): []string
|
||||||
|
+Set(): []string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "StatusesConfigProvider" as StatusesConfigProvider {
|
||||||
|
+Args(): string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "DestroyConfigProvider" as DestroyConfigProvider {
|
||||||
|
+Args(): string
|
||||||
|
+Cascade(): string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "TestConfigProvider" as TestConfigProvider {
|
||||||
|
+Cleanup(): bool
|
||||||
|
+Logs(): bool
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "FetchConfigProvider" as FetchConfigProvider {
|
||||||
|
+OutputDir(): string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "WriteValuesConfigProvider" as WriteValuesConfigProvider {
|
||||||
|
+OutputFileTemplate(): string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "GlobalImpl" as GlobalImpl {
|
||||||
|
+GlobalOptions: *GlobalOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "DiffImpl" as DiffImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+DiffOptions: *DiffOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "ApplyImpl" as ApplyImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+ApplyOptions: *ApplyOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "SyncImpl" as SyncImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+SyncOptions: *SyncOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "TemplateImpl" as TemplateImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+TemplateOptions: *TemplateOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "LintImpl" as LintImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+LintOptions: *LintOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "StatusImpl" as StatusImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+StatusOptions: *StatusOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "DestroyImpl" as DestroyImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+DestroyOptions: *DestroyOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "TestImpl" as TestImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+TestOptions: *TestOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "FetchImpl" as FetchImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+FetchOptions: *FetchOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "WriteValuesImpl" as WriteValuesImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+WriteValuesOptions: *WriteValuesOptions
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/app" {
|
||||||
|
class "App" as App {
|
||||||
|
+OverrideKubeContext: string
|
||||||
|
+OverrideHelmBinary: string
|
||||||
|
+Logger: *zap.SugaredLogger
|
||||||
|
+...
|
||||||
|
+New(conf ConfigProvider): *App
|
||||||
|
+Diff(c DiffConfigProvider): error
|
||||||
|
+Apply(c ApplyConfigProvider): error
|
||||||
|
+Sync(c SyncConfigProvider): error
|
||||||
|
+Template(c TemplateConfigProvider): error
|
||||||
|
+Lint(c LintConfigProvider): error
|
||||||
|
+Status(c StatusesConfigProvider): error
|
||||||
|
+Destroy(c DestroyConfigProvider): error
|
||||||
|
+Test(c TestConfigProvider): error
|
||||||
|
+Fetch(c FetchConfigProvider): error
|
||||||
|
+WriteValues(c WriteValuesConfigProvider): error
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "Run" as Run {
|
||||||
|
+state: *state.HelmState
|
||||||
|
+helm: helmexec.Interface
|
||||||
|
+ctx: Context
|
||||||
|
+ReleaseToChart: map[state.PrepareChartKey]string
|
||||||
|
+...
|
||||||
|
+diff(...): (...)
|
||||||
|
+withPreparedCharts(...): error
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/state" {
|
||||||
|
class "HelmState" as HelmState {
|
||||||
|
+FilePath: string
|
||||||
|
+Releases: []ReleaseSpec
|
||||||
|
+...
|
||||||
|
+DiffReleases(...): ([]ReleaseSpec, []error)
|
||||||
|
+SyncReleases(...): []error
|
||||||
|
+TemplateReleases(...): []error
|
||||||
|
+LintReleases(...): []error
|
||||||
|
+ReleaseStatuses(...): []error
|
||||||
|
+DeleteReleases(...): []error
|
||||||
|
+TestReleases(...): []error
|
||||||
|
+WriteReleasesValues(...): []error
|
||||||
|
+PrepareCharts(...): (map[PrepareChartKey]string, []error)
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/helmexec" {
|
||||||
|
interface "Interface" as HelmExec {
|
||||||
|
+SetExtraArgs(...string)
|
||||||
|
+DiffRelease(...): error
|
||||||
|
+SyncRelease(...): error
|
||||||
|
+TemplateRelease(...): error
|
||||||
|
+Lint(...): error
|
||||||
|
+ReleaseStatus(...): error
|
||||||
|
+DeleteRelease(...): error
|
||||||
|
+TestRelease(...): error
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
' Root command relationships
|
||||||
|
RootCmd --> DiffCmd : adds subcommand
|
||||||
|
RootCmd --> ApplyCmd : adds subcommand
|
||||||
|
RootCmd --> SyncCmd : adds subcommand
|
||||||
|
RootCmd --> TemplateCmd : adds subcommand
|
||||||
|
RootCmd --> LintCmd : adds subcommand
|
||||||
|
RootCmd --> StatusCmd : adds subcommand
|
||||||
|
RootCmd --> DeleteCmd : adds subcommand
|
||||||
|
RootCmd --> TestCmd : adds subcommand
|
||||||
|
RootCmd --> FetchCmd : adds subcommand
|
||||||
|
RootCmd --> WriteValuesCmd : adds subcommand
|
||||||
|
|
||||||
|
' Command to Config Impl relationships
|
||||||
|
DiffCmd --> DiffImpl : creates
|
||||||
|
ApplyCmd --> ApplyImpl : creates
|
||||||
|
SyncCmd --> SyncImpl : creates
|
||||||
|
TemplateCmd --> TemplateImpl : creates
|
||||||
|
LintCmd --> LintImpl : creates
|
||||||
|
StatusCmd --> StatusImpl : creates
|
||||||
|
DeleteCmd --> DestroyImpl : creates
|
||||||
|
TestCmd --> TestImpl : creates
|
||||||
|
FetchCmd --> FetchImpl : creates
|
||||||
|
WriteValuesCmd --> WriteValuesImpl : creates
|
||||||
|
|
||||||
|
' Command to App relationships
|
||||||
|
DiffCmd --> App : creates and uses
|
||||||
|
ApplyCmd --> App : creates and uses
|
||||||
|
SyncCmd --> App : creates and uses
|
||||||
|
TemplateCmd --> App : creates and uses
|
||||||
|
LintCmd --> App : creates and uses
|
||||||
|
StatusCmd --> App : creates and uses
|
||||||
|
DeleteCmd --> App : creates and uses
|
||||||
|
TestCmd --> App : creates and uses
|
||||||
|
FetchCmd --> App : creates and uses
|
||||||
|
WriteValuesCmd --> App : creates and uses
|
||||||
|
|
||||||
|
' Config interface implementations
|
||||||
|
DiffConfigProvider <|.. DiffImpl : implements
|
||||||
|
ApplyConfigProvider <|.. ApplyImpl : implements
|
||||||
|
SyncConfigProvider <|.. SyncImpl : implements
|
||||||
|
TemplateConfigProvider <|.. TemplateImpl : implements
|
||||||
|
LintConfigProvider <|.. LintImpl : implements
|
||||||
|
StatusesConfigProvider <|.. StatusImpl : implements
|
||||||
|
DestroyConfigProvider <|.. DestroyImpl : implements
|
||||||
|
TestConfigProvider <|.. TestImpl : implements
|
||||||
|
FetchConfigProvider <|.. FetchImpl : implements
|
||||||
|
WriteValuesConfigProvider <|.. WriteValuesImpl : implements
|
||||||
|
|
||||||
|
ConfigProvider <|.. GlobalImpl : implements
|
||||||
|
GlobalImpl <-- DiffImpl : contains
|
||||||
|
GlobalImpl <-- ApplyImpl : contains
|
||||||
|
GlobalImpl <-- SyncImpl : contains
|
||||||
|
GlobalImpl <-- TemplateImpl : contains
|
||||||
|
GlobalImpl <-- LintImpl : contains
|
||||||
|
GlobalImpl <-- StatusImpl : contains
|
||||||
|
GlobalImpl <-- DestroyImpl : contains
|
||||||
|
GlobalImpl <-- TestImpl : contains
|
||||||
|
GlobalImpl <-- FetchImpl : contains
|
||||||
|
GlobalImpl <-- WriteValuesImpl : contains
|
||||||
|
|
||||||
|
' App relationships
|
||||||
|
App --> Run : creates and uses
|
||||||
|
App ..> DiffConfigProvider : uses for Diff()
|
||||||
|
App ..> ApplyConfigProvider : uses for Apply()
|
||||||
|
App ..> SyncConfigProvider : uses for Sync()
|
||||||
|
App ..> TemplateConfigProvider : uses for Template()
|
||||||
|
App ..> LintConfigProvider : uses for Lint()
|
||||||
|
App ..> StatusesConfigProvider : uses for Status()
|
||||||
|
App ..> DestroyConfigProvider : uses for Destroy()
|
||||||
|
App ..> TestConfigProvider : uses for Test()
|
||||||
|
App ..> FetchConfigProvider : uses for Fetch()
|
||||||
|
App ..> WriteValuesConfigProvider : uses for WriteValues()
|
||||||
|
|
||||||
|
' Run relationships
|
||||||
|
Run --> HelmState : operates on
|
||||||
|
Run --> HelmExec : executes helm commands
|
||||||
|
|
||||||
|
' State relationships
|
||||||
|
HelmState ..> HelmExec : uses for helm operations
|
||||||
|
|
||||||
|
note right of RootCmd
|
||||||
|
Command Flow:
|
||||||
|
1. Root command adds subcommands
|
||||||
|
2. Each subcommand parses flags into its Config implementation
|
||||||
|
3. Creates App with Config implementation
|
||||||
|
4. Calls corresponding App method
|
||||||
|
end note
|
||||||
|
|
||||||
|
note right of App
|
||||||
|
App Flow:
|
||||||
|
1. ForEachState() loads state files
|
||||||
|
2. Creates Run instances
|
||||||
|
3. Calls appropriate Run methods
|
||||||
|
4. Run methods use HelmState for operations
|
||||||
|
end note
|
||||||
|
|
||||||
|
note right of Run
|
||||||
|
Run Flow:
|
||||||
|
1. withPreparedCharts() prepares charts
|
||||||
|
2. Command-specific methods execute operations
|
||||||
|
3. Uses HelmState for actual operations
|
||||||
|
4. HelmState uses helmexec interface
|
||||||
|
end note
|
||||||
|
|
||||||
|
@enduml
|
||||||
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 137 KiB |
|
|
@ -0,0 +1,156 @@
|
||||||
|
@startuml "Helmfile Command Flow - Diff"
|
||||||
|
|
||||||
|
' Color scheme - eye-friendly colors with darker headers
|
||||||
|
skinparam {
|
||||||
|
ClassBackgroundColor #E8F4F9
|
||||||
|
ClassHeaderBackgroundColor #5D8AA8
|
||||||
|
ClassFontColor #000000
|
||||||
|
ClassStereotypeFontColor #FFFFFF
|
||||||
|
ClassAttributeFontColor #000000
|
||||||
|
ClassFontStyle bold
|
||||||
|
|
||||||
|
PackageBackgroundColor #F5F5F5
|
||||||
|
PackageBorderColor #DDDDDD
|
||||||
|
|
||||||
|
NoteBackgroundColor #FFF8DC
|
||||||
|
NoteBorderColor #DCDCAA
|
||||||
|
|
||||||
|
ArrowColor #5D8AA8
|
||||||
|
}
|
||||||
|
|
||||||
|
package "cmd" {
|
||||||
|
class "Command (e.g. DiffCmd)" as Command {
|
||||||
|
+RunE(cmd *cobra.Command, args []string): error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/config" {
|
||||||
|
interface "ConfigProvider" as ConfigProvider {
|
||||||
|
+KubeContext(): string
|
||||||
|
+HelmBinary(): string
|
||||||
|
+Logger(): *zap.SugaredLogger
|
||||||
|
+Args(): string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface "DiffConfigProvider" as DiffConfigProvider {
|
||||||
|
+DiffArgs(): string
|
||||||
|
+DetailedExitcode(): bool
|
||||||
|
+IncludeTests(): bool
|
||||||
|
+SkipDiffOnInstall(): bool
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "DiffImpl" as DiffImpl {
|
||||||
|
+GlobalImpl: *GlobalImpl
|
||||||
|
+DiffOptions: *DiffOptions
|
||||||
|
+Concurrency(): int
|
||||||
|
+IncludeNeeds(): bool
|
||||||
|
+Set(): []string
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/app" {
|
||||||
|
class "App" as App {
|
||||||
|
+OverrideKubeContext: string
|
||||||
|
+OverrideHelmBinary: string
|
||||||
|
+Logger: *zap.SugaredLogger
|
||||||
|
+...
|
||||||
|
+New(conf ConfigProvider): *App
|
||||||
|
+Diff(c DiffConfigProvider): error
|
||||||
|
+Apply(c ApplyConfigProvider): error
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "Run" as Run {
|
||||||
|
+state: *state.HelmState
|
||||||
|
+helm: helmexec.Interface
|
||||||
|
+ctx: Context
|
||||||
|
+ReleaseToChart: map[state.PrepareChartKey]string
|
||||||
|
+...
|
||||||
|
+diff(triggerCleanupEvent bool, detailedExitCode bool, c DiffConfigProvider, diffOpts *state.DiffOpts): (*string, map[string]state.ReleaseSpec, map[string]state.ReleaseSpec, []error)
|
||||||
|
+withPreparedCharts(helmfileCommand string, opts state.ChartPrepareOptions, f func()): error
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/state" {
|
||||||
|
class "HelmState" as HelmState {
|
||||||
|
+FilePath: string
|
||||||
|
+Releases: []ReleaseSpec
|
||||||
|
+...
|
||||||
|
+DiffReleases(helm helmexec.Interface, additionalValues []string, workerLimit int, ...): ([]ReleaseSpec, []error)
|
||||||
|
+PrepareCharts(helm helmexec.Interface, dir string, concurrency int, ...): (map[PrepareChartKey]string, []error)
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
|
||||||
|
class "DiffOpts" as DiffOpts {
|
||||||
|
+Context: int
|
||||||
|
+Output: string
|
||||||
|
+Color: bool
|
||||||
|
+NoColor: bool
|
||||||
|
+Set: []string
|
||||||
|
+...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package "pkg/helmexec" {
|
||||||
|
interface "Interface" as HelmExec {
|
||||||
|
+SetExtraArgs(...string)
|
||||||
|
+DiffRelease(context HelmContext, name, chart, namespace string, suppressDiff bool, flags ...string): error
|
||||||
|
+SyncRelease(context HelmContext, name, chart, namespace string, flags ...string): error
|
||||||
|
+...()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
' Command flow
|
||||||
|
Command --> DiffImpl : creates
|
||||||
|
Command --> App : creates and uses
|
||||||
|
|
||||||
|
' Config relationships
|
||||||
|
DiffConfigProvider <|.. DiffImpl : implements
|
||||||
|
ConfigProvider <|.. DiffImpl : implements
|
||||||
|
|
||||||
|
' App relationships
|
||||||
|
App --> Run : creates and uses
|
||||||
|
App ..> DiffConfigProvider : uses
|
||||||
|
|
||||||
|
' Run relationships
|
||||||
|
Run --> HelmState : operates on
|
||||||
|
Run --> HelmExec : executes helm commands
|
||||||
|
Run ..> DiffOpts : configures diff options
|
||||||
|
|
||||||
|
' State relationships
|
||||||
|
HelmState ..> HelmExec : uses for helm operations
|
||||||
|
HelmState ..> DiffOpts : uses for diff configuration
|
||||||
|
|
||||||
|
note right of Command
|
||||||
|
Command Flow:
|
||||||
|
1. Parse flags into DiffImpl
|
||||||
|
2. Create App with DiffImpl
|
||||||
|
3. Call App.Diff()
|
||||||
|
end note
|
||||||
|
|
||||||
|
note right of App
|
||||||
|
App Flow:
|
||||||
|
1. ForEachState() loads state files
|
||||||
|
2. Creates Run instances
|
||||||
|
3. Calls Run.diff()
|
||||||
|
end note
|
||||||
|
|
||||||
|
note right of Run
|
||||||
|
Run Flow:
|
||||||
|
1. withPreparedCharts() prepares charts
|
||||||
|
2. diff() plans and executes diff operation
|
||||||
|
3. Uses HelmState.DiffReleases() for actual diff
|
||||||
|
end note
|
||||||
|
|
||||||
|
note right of HelmState
|
||||||
|
HelmState Flow:
|
||||||
|
1. prepareDiffReleases() prepares flags and options
|
||||||
|
2. DiffReleases() executes helm diff via helmexec
|
||||||
|
3. Returns affected releases and errors
|
||||||
|
end note
|
||||||
|
|
||||||
|
@enduml
|
||||||
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 43 KiB |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 958 KiB |
Loading…
Reference in New Issue