github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/migrations/firewallrules.go (about) 1 // Copyright 2019 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package migrations 5 6 import ( 7 "github.com/juju/description/v5" 8 "github.com/juju/errors" 9 10 "github.com/juju/juju/core/network/firewall" 11 ) 12 13 // MigrationFirewallRule represents a state.FirewallRule 14 // Point of use interface to enable better encapsulation. 15 type MigrationFirewallRule interface { 16 ID() string 17 WellKnownService() firewall.WellKnownServiceType 18 WhitelistCIDRs() []string 19 } 20 21 // FirewallRuleSource defines an inplace usage for reading all the remote 22 // entities. 23 type FirewallRuleSource interface { 24 AllFirewallRules() ([]MigrationFirewallRule, error) 25 } 26 27 // FirewallRulesModel defines an inplace usage for adding a remote entity 28 // to a model. 29 type FirewallRulesModel interface { 30 AddFirewallRule(args description.FirewallRuleArgs) description.FirewallRule 31 } 32 33 // ExportFirewallRules describes a way to execute a migration for exporting 34 // firewall rules. 35 type ExportFirewallRules struct{} 36 37 // Execute the migration of the remote entities using typed interfaces, to 38 // ensure we don't loose any type safety. 39 // This doesn't conform to an interface because go doesn't have generics, but 40 // when this does arrive this would be an execellent place to use them. 41 func (ExportFirewallRules) Execute(src FirewallRuleSource, dst FirewallRulesModel) error { 42 firewallRules, err := src.AllFirewallRules() 43 if err != nil { 44 return errors.Trace(err) 45 } 46 for _, firewallRule := range firewallRules { 47 dst.AddFirewallRule(description.FirewallRuleArgs{ 48 ID: firewallRule.ID(), 49 WellKnownService: string(firewallRule.WellKnownService()), 50 WhitelistCIDRs: firewallRule.WhitelistCIDRs(), 51 }) 52 } 53 return nil 54 }