generated from kyma-project/template-repository
/
state.go
110 lines (94 loc) · 3.19 KB
/
state.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package iprange
import (
"context"
"strings"
"github.com/kyma-project/cloud-manager/components/kcp/api/cloud-control/v1beta1"
"github.com/kyma-project/cloud-manager/components/kcp/pkg/common/abstractions"
"github.com/kyma-project/cloud-manager/components/kcp/pkg/iprange/types"
gcpclient "github.com/kyma-project/cloud-manager/components/kcp/pkg/provider/gcp/client"
"github.com/kyma-project/cloud-manager/components/kcp/pkg/provider/gcp/iprange/client"
"google.golang.org/api/compute/v1"
"google.golang.org/api/servicenetworking/v1"
)
type State struct {
types.State
inSync bool
ipAddress string
prefix int
ipRanges []string
projectNumber int64
addressOp gcpclient.OperationType
connectionOp gcpclient.OperationType
curState v1beta1.StatusState
address *compute.Address
serviceConnection *servicenetworking.Connection
serviceNetworkingClient client.ServiceNetworkingClient
computeClient client.ComputeClient
}
type StateFactory interface {
NewState(ctx context.Context, ipRangeState types.State) (*State, error)
}
type stateFactory struct {
serviceNetworkingClientProvider gcpclient.ClientProvider[client.ServiceNetworkingClient]
computeClientProvider gcpclient.ClientProvider[client.ComputeClient]
env abstractions.Environment
}
func NewStateFactory(serviceNetworkingClientProvider gcpclient.ClientProvider[client.ServiceNetworkingClient], computeClientProvider gcpclient.ClientProvider[client.ComputeClient], env abstractions.Environment) StateFactory {
return &stateFactory{
serviceNetworkingClientProvider: serviceNetworkingClientProvider,
computeClientProvider: computeClientProvider,
env: env,
}
}
func (f *stateFactory) NewState(ctx context.Context, ipRangeState types.State) (*State, error) {
httpClient, err := gcpclient.GetCachedGcpClient(ctx, f.env.Get("GCP_SA_JSON_KEY_PATH"))
if err != nil {
return nil, err
}
snc, err := f.serviceNetworkingClientProvider(
ctx,
httpClient,
)
if err != nil {
return nil, err
}
cc, err := f.computeClientProvider(
ctx,
httpClient,
)
if err != nil {
return nil, err
}
projectId := ipRangeState.Scope().Spec.Scope.Gcp.Project
projectNumber, err := gcpclient.GetCachedProjectNumber(ctx, projectId, httpClient)
if err != nil {
return nil, err
}
return newState(ipRangeState, snc, cc, projectNumber), nil
}
func newState(ipRangeState types.State, snc client.ServiceNetworkingClient, cc client.ComputeClient, projectNumber int64) *State {
return &State{
State: ipRangeState,
serviceNetworkingClient: snc,
computeClient: cc,
projectNumber: projectNumber,
}
}
func (s State) doesAddressMatch() bool {
vpc := s.Scope().Spec.Scope.Gcp.VpcNetwork
return s.address != nil && s.address.Address == s.ipAddress &&
s.address.PrefixLength == int64(s.prefix) &&
strings.HasSuffix(s.address.Network, vpc)
}
func (s State) doesConnectionIncludeRange() int {
if s.serviceConnection == nil {
return -1
}
rangeName := s.ObjAsIpRange().Spec.RemoteRef.Name
for i, name := range s.serviceConnection.ReservedPeeringRanges {
if rangeName == name {
return i
}
}
return -1
}