Skip to content

Commit 5d01497

Browse files
mandreMaysaMacedo
authored andcommitted
Create API and Ingress ports and attach FIPs when available
1 parent 560cd09 commit 5d01497

File tree

1 file changed

+66
-6
lines changed

1 file changed

+66
-6
lines changed

pkg/infrastructure/openstack/clusterapi/clusterapi.go

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import (
77
capo "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
88
"sigs.k8s.io/controller-runtime/pkg/client"
99

10+
"github.com/gophercloud/gophercloud"
11+
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/attributestags"
12+
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
1013
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
1114
"github.com/openshift/installer/pkg/asset/manifests/capiutils"
1215
"github.com/openshift/installer/pkg/infrastructure/clusterapi"
@@ -37,20 +40,77 @@ func (p Provider) ControlPlaneAvailable(in clusterapi.ControlPlaneAvailableInput
3740
return err
3841
}
3942

40-
createOtps := ports.CreateOpts{
41-
Name: "CAPO test",
42-
NetworkID: ospCluster.Status.Network.ID,
43+
apiPort, err := createPort(networkClient, "api", in.InfraID, ospCluster.Status.Network.ID)
44+
if err != nil {
45+
return err
46+
}
47+
if in.InstallConfig.Config.OpenStack.APIFloatingIP != "" {
48+
err = assignFIP(networkClient, in.InstallConfig.Config.OpenStack.APIFloatingIP, apiPort)
49+
if err != nil {
50+
return err
51+
}
4352
}
4453

45-
_, err = ports.Create(networkClient, createOtps).Extract()
54+
ingressPort, err := createPort(networkClient, "ingress", in.InfraID, ospCluster.Status.Network.ID)
4655
if err != nil {
4756
return err
4857
}
58+
if in.InstallConfig.Config.OpenStack.IngressFloatingIP != "" {
59+
err = assignFIP(networkClient, in.InstallConfig.Config.OpenStack.IngressFloatingIP, ingressPort)
60+
if err != nil {
61+
return err
62+
}
63+
}
64+
65+
return nil
66+
}
4967

50-
_, err = ports.Create(networkClient, createOtps).Extract()
68+
func createPort(client *gophercloud.ServiceClient, role, infraID, networkID string) (*ports.Port, error) {
69+
createOtps := ports.CreateOpts{
70+
Name: fmt.Sprintf("%s-%s-port", infraID, role),
71+
NetworkID: networkID,
72+
Description: "Created By OpenShift Installer",
73+
}
74+
75+
port, err := ports.Create(client, createOtps).Extract()
5176
if err != nil {
52-
return err
77+
return nil, err
5378
}
5479

80+
tag := fmt.Sprintf("openshiftClusterID=%s", infraID)
81+
err = attributestags.Add(client, "ports", port.ID, tag).ExtractErr()
82+
if err != nil {
83+
return nil, err
84+
}
85+
return port, err
86+
}
87+
88+
func assignFIP(client *gophercloud.ServiceClient, address string, port *ports.Port) error {
89+
listOpts := floatingips.ListOpts{
90+
FloatingIP: address,
91+
}
92+
allPages, err := floatingips.List(client, listOpts).AllPages()
93+
if err != nil {
94+
return fmt.Errorf("failed to list floating IPs: %w", err)
95+
}
96+
allFIPs, err := floatingips.ExtractFloatingIPs(allPages)
97+
if err != nil {
98+
return fmt.Errorf("failed to extract floating IPs: %w", err)
99+
}
100+
101+
if len(allFIPs) != 1 {
102+
return fmt.Errorf("could not find FIP: %s", address)
103+
}
104+
105+
fip := allFIPs[0]
106+
107+
updateOpts := floatingips.UpdateOpts{
108+
PortID: &port.ID,
109+
}
110+
111+
_, err = floatingips.Update(client, fip.ID, updateOpts).Extract()
112+
if err != nil {
113+
return fmt.Errorf("failed to attach floating IP to port: %w", err)
114+
}
55115
return nil
56116
}

0 commit comments

Comments
 (0)