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  }