...

Source file src/edge-infra.dev/pkg/sds/remoteaccess/wireguard/vpn/vpn.go

Documentation: edge-infra.dev/pkg/sds/remoteaccess/wireguard/vpn

     1  package vpn
     2  
     3  import (
     4  	"context"
     5  
     6  	ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
     7  
     8  	v1cluster "edge-infra.dev/pkg/edge/apis/cluster/v1alpha1"
     9  	"edge-infra.dev/pkg/sds/remoteaccess/constants"
    10  	v1vpnconfig "edge-infra.dev/pkg/sds/remoteaccess/k8s/apis/vpnconfigs/v1"
    11  	"edge-infra.dev/pkg/sds/remoteaccess/wireguard/client"
    12  	"edge-infra.dev/pkg/sds/remoteaccess/wireguard/relay"
    13  	"edge-infra.dev/pkg/sds/remoteaccess/wireguard/store"
    14  )
    15  
    16  var vpnConfigMapKey = ctrlclient.ObjectKey{
    17  	Namespace: constants.VPNNamespace,
    18  	Name:      constants.VPNConfigMapName,
    19  }
    20  
    21  type VPN struct {
    22  	SubnetCIDR             string
    23  	AvailableIPAddressPool IPAddressPool
    24  
    25  	relay  *relay.Relay
    26  	client *client.Client
    27  
    28  	stores map[string]*store.Store // map of cluster edge id's to store config
    29  }
    30  
    31  func New() (*VPN, error) {
    32  	return &VPN{
    33  		SubnetCIDR:             "",
    34  		AvailableIPAddressPool: nil,
    35  		relay:                  nil,
    36  		client:                 nil,
    37  		stores:                 map[string]*store.Store{},
    38  	}, nil
    39  }
    40  
    41  // The banners subnet, configured by a ConfigMap
    42  func (v *VPN) GetSubnetCIDR() string {
    43  	return v.SubnetCIDR
    44  }
    45  
    46  // Wireguard relay configuration object
    47  func (v *VPN) Relay() *relay.Relay {
    48  	return v.relay
    49  }
    50  
    51  func (v *VPN) Client() *client.Client {
    52  	return v.client
    53  }
    54  
    55  // The store configuration objects
    56  func (v *VPN) Stores() map[string]*store.Store {
    57  	return v.stores
    58  }
    59  
    60  // The store configuration object with a given cluster ID
    61  func (v *VPN) Store(clusterEdgeID string) *store.Store {
    62  	return v.stores[clusterEdgeID]
    63  }
    64  
    65  // Checks if the banner has a store with a given cluster ID
    66  func (v *VPN) HasStore(clusterEdgeID string) bool {
    67  	_, ok := v.stores[clusterEdgeID]
    68  	return ok
    69  }
    70  
    71  // Attempts to get the relay instance from its associated K8s secret.
    72  // A new instance will be created if the K8s secret does not exist.
    73  func (v *VPN) UpdateRelay(ctx context.Context, c ctrlclient.Client) error {
    74  	relayWG, err := relay.Get(ctx, c)
    75  	if err != nil {
    76  		return err
    77  	}
    78  	v.relay = relayWG
    79  	return nil
    80  }
    81  
    82  // Attempts to get the client instance from its associated K8s secret.
    83  // A new instance will be created if the K8s secret does not exist.
    84  func (v *VPN) UpdateClient(ctx context.Context, c ctrlclient.Client) error {
    85  	clientWG, err := client.Get(ctx, c)
    86  	if err != nil {
    87  		return err
    88  	}
    89  	v.client = clientWG
    90  	return nil
    91  }
    92  
    93  func (v *VPN) UpdateStore(ctx context.Context, c ctrlclient.Client, vpnConfig *v1vpnconfig.VPNConfig, cluster *v1cluster.Cluster) error {
    94  	storeWG, err := store.Get(ctx, c, vpnConfig, cluster)
    95  	if err != nil {
    96  		return err
    97  	}
    98  	v.stores[vpnConfig.ClusterEdgeID()] = storeWG
    99  
   100  	v.Store(vpnConfig.ClusterEdgeID()).SetEnabled(vpnConfig.IsEnabled())
   101  	return v.Store(vpnConfig.ClusterEdgeID()).UpdateIPAddress(ctx, c, constants.StoreName, cluster.ObjectMeta.Name, vpnConfig.IP())
   102  }
   103  
   104  // Removes a store with given IP address from the banner
   105  func (v *VPN) RemoveStore(clusterEdgeID string) {
   106  	if v.HasStore(clusterEdgeID) {
   107  		store := v.Store(clusterEdgeID)
   108  		delete(v.stores, clusterEdgeID)
   109  		v.setIPAddressAvailable(store.GetIPAddress())
   110  	}
   111  }
   112  

View as plain text