forked from Juniper/contrail
/
update.go
106 lines (88 loc) · 2.72 KB
/
update.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
package cloud
import (
"context"
"github.com/Juniper/contrail/pkg/models"
"github.com/Juniper/contrail/pkg/services"
)
func updateIPDetails(ctx context.Context, instances []*instanceData, tfState TerraformState) error {
for _, instance := range instances {
if err := updateIP(ctx, instance, tfState); err != nil {
return err
}
}
return nil
}
func updateIP(ctx context.Context, instance *instanceData, tfState TerraformState) error {
switch {
case instance.isGateway():
return updateGatewayInstanceIP(ctx, instance, tfState)
default:
return updateInstanceIP(ctx, instance, tfState)
}
}
func updateInstanceIP(ctx context.Context, instance *instanceData, tfState TerraformState) error {
privateIP, err := tfState.GetPrivateIP(instance.info.Hostname)
if err != nil {
return err
}
return addIPToNode(ctx, privateIP, instance.info, instance.client)
}
func updateGatewayInstanceIP(ctx context.Context, instance *instanceData, tfState TerraformState) error {
privateIP, err := tfState.GetPrivateIP(instance.info.Hostname)
if err != nil {
return err
}
portObj, err := createPort(ctx, "private", privateIP,
instance.info, instance.client)
if err != nil {
return err
}
if err = addPortToNode(ctx, portObj, instance.info, instance.client); err != nil {
return err
}
publicIP, err := tfState.GetPublicIP(instance.info.Hostname)
if err != nil {
return err
}
return addIPToNode(ctx, publicIP, instance.info, instance.client)
}
func createPort(
ctx context.Context, portName string, ip string, instance *models.Node, client services.Service,
) (*models.Port, error) {
if len(instance.Ports) != 0 {
for _, p := range instance.Ports {
if p.Name == portName && p.IPAddress != ip {
request := &services.UpdatePortRequest{Port: p}
request.Port.IPAddress = ip
portResp, err := client.UpdatePort(ctx, request)
if err != nil {
return nil, err
}
return portResp.GetPort(), err
} else if p.Name == portName && p.IPAddress == ip {
return p, nil
}
}
}
portResp, err := client.CreatePort(ctx, &services.CreatePortRequest{
Port: &models.Port{
Name: portName,
ParentType: models.KindNode,
ParentUUID: instance.UUID,
IPAddress: ip,
},
})
return portResp.GetPort(), err
}
func addPortToNode(ctx context.Context, port *models.Port, instance *models.Node, client services.Service) error {
request := &services.UpdateNodeRequest{Node: instance}
request.Node.AddPort(port)
_, err := client.UpdateNode(ctx, request)
return err
}
func addIPToNode(ctx context.Context, ip string, instance *models.Node, client services.Service) error {
request := &services.UpdateNodeRequest{Node: instance}
request.Node.IPAddress = ip
_, err := client.UpdateNode(ctx, request)
return err
}