...
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
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
42 func (v *VPN) GetSubnetCIDR() string {
43 return v.SubnetCIDR
44 }
45
46
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
56 func (v *VPN) Stores() map[string]*store.Store {
57 return v.stores
58 }
59
60
61 func (v *VPN) Store(clusterEdgeID string) *store.Store {
62 return v.stores[clusterEdgeID]
63 }
64
65
66 func (v *VPN) HasStore(clusterEdgeID string) bool {
67 _, ok := v.stores[clusterEdgeID]
68 return ok
69 }
70
71
72
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
83
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
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