Skip to content

Commit cff4218

Browse files
committed
Refactor transit gateway status
1 parent 632a722 commit cff4218

File tree

1 file changed

+90
-125
lines changed

1 file changed

+90
-125
lines changed

cloud/scope/powervs_cluster.go

Lines changed: 90 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -398,13 +398,25 @@ func (s *PowerVSClusterScope) GetServiceInstanceID() string {
398398
return ""
399399
}
400400

401+
// SetTransitGatewayConnectionStatus sets the connection status of Transit gateway.
402+
func (s *PowerVSClusterScope) SetTransitGatewayConnectionStatus(networkType networkConnectionType, resource *infrav1beta2.ResourceReference) {
403+
if s.IBMPowerVSCluster.Status.TransitGateway == nil {
404+
return
405+
}
406+
407+
switch networkType {
408+
case powervsNetworkConnectionType:
409+
s.IBMPowerVSCluster.Status.TransitGateway.PowerVSConnection = resource
410+
case vpcNetworkConnectionType:
411+
s.IBMPowerVSCluster.Status.TransitGateway.VPCConnection = resource
412+
}
413+
}
414+
401415
// SetTransitGatewayStatus sets the status of Transit gateway.
402-
func (s *PowerVSClusterScope) SetTransitGatewayStatus(id *string, controllerCreated *bool, powerVSConnResource, vpcConnResource *infrav1beta2.ResourceReference) {
416+
func (s *PowerVSClusterScope) SetTransitGatewayStatus(id *string, controllerCreated *bool) {
403417
s.IBMPowerVSCluster.Status.TransitGateway = &infrav1beta2.TransitGatewayStatus{
404418
ID: id,
405419
ControllerCreated: controllerCreated,
406-
PowerVSConnection: powerVSConnResource,
407-
VPCConnection: vpcConnResource,
408420
}
409421
}
410422

@@ -1632,7 +1644,7 @@ func (s *PowerVSClusterScope) ReconcileTransitGateway() (bool, error) {
16321644
if err != nil {
16331645
return false, err
16341646
}
1635-
requeue, _, _, err := s.checkAndUpdateTransitGateway(tg, false)
1647+
requeue, err := s.checkAndUpdateTransitGateway(tg)
16361648
if err != nil {
16371649
return false, err
16381650
}
@@ -1647,24 +1659,19 @@ func (s *PowerVSClusterScope) ReconcileTransitGateway() (bool, error) {
16471659

16481660
// check the status and update the transit gateway's connections if they are not proper
16491661
if tg != nil {
1650-
requeue, powerVSConn, vpcConn, err := s.checkAndUpdateTransitGateway(tg, true)
1662+
requeue, err := s.checkAndUpdateTransitGateway(tg)
16511663
if err != nil {
16521664
return false, err
16531665
}
1654-
s.SetTransitGatewayStatus(tg.ID, ptr.To(false), powerVSConn, vpcConn)
16551666
return requeue, nil
16561667
}
16571668

16581669
// create transit gateway
16591670
s.V(3).Info("Creating transit gateway")
1660-
transitGatewayID, powerVSConnID, vpcConnID, err := s.createTransitGateway()
1661-
if err != nil {
1671+
if err := s.createTransitGateway(); err != nil {
16621672
return false, fmt.Errorf("failed to create transit gateway: %v", err)
16631673
}
1664-
if transitGatewayID != nil {
1665-
s.Info("Created transit gateway", "id", transitGatewayID)
1666-
s.SetTransitGatewayStatus(transitGatewayID, ptr.To(true), &infrav1beta2.ResourceReference{ID: powerVSConnID, ControllerCreated: ptr.To(true)}, &infrav1beta2.ResourceReference{ID: vpcConnID, ControllerCreated: ptr.To(true)})
1667-
}
1674+
16681675
return true, nil
16691676
}
16701677

@@ -1691,21 +1698,23 @@ func (s *PowerVSClusterScope) isTransitGatewayExists() (*tgapiv1.TransitGateway,
16911698
return nil, nil
16921699
}
16931700

1701+
s.SetTransitGatewayStatus(transitGateway.ID, ptr.To(false))
1702+
16941703
return transitGateway, nil
16951704
}
16961705

16971706
// checkAndUpdateTransitGateway checks given transit gateway's status and its connections.
16981707
// if update is set to true, it updates the transit gateway connections too if it is not exist already.
1699-
func (s *PowerVSClusterScope) checkAndUpdateTransitGateway(transitGateway *tgapiv1.TransitGateway, update bool) (bool, *infrav1beta2.ResourceReference, *infrav1beta2.ResourceReference, error) {
1708+
func (s *PowerVSClusterScope) checkAndUpdateTransitGateway(transitGateway *tgapiv1.TransitGateway) (bool, error) {
17001709
requeue, err := s.checkTransitGatewayStatus(transitGateway)
17011710
if err != nil {
1702-
return false, nil, nil, err
1711+
return false, err
17031712
}
17041713
if requeue {
1705-
return requeue, nil, nil, nil
1714+
return requeue, nil
17061715
}
17071716

1708-
return s.checkAndUpdateTransitGatewayConnections(transitGateway, update)
1717+
return s.checkAndUpdateTransitGatewayConnections(transitGateway)
17091718
}
17101719

17111720
// checkTransitGatewayStatus checks the state of a transit gateway.
@@ -1727,144 +1736,96 @@ func (s *PowerVSClusterScope) checkTransitGatewayStatus(tg *tgapiv1.TransitGatew
17271736
}
17281737

17291738
// checkAndUpdateTransitGatewayConnections checks given transit gateway's connections status.
1730-
// if update is set to true, it updates the transit gateway connections too if it is not exist already.
1731-
func (s *PowerVSClusterScope) checkAndUpdateTransitGatewayConnections(transitGateway *tgapiv1.TransitGateway, update bool) (bool, *infrav1beta2.ResourceReference, *infrav1beta2.ResourceReference, error) {
1739+
// it also creates the transit gateway connections if it is not exist already.
1740+
func (s *PowerVSClusterScope) checkAndUpdateTransitGatewayConnections(transitGateway *tgapiv1.TransitGateway) (bool, error) {
17321741
tgConnections, _, err := s.TransitGatewayClient.ListTransitGatewayConnections(&tgapiv1.ListTransitGatewayConnectionsOptions{
17331742
TransitGatewayID: transitGateway.ID,
17341743
})
17351744
if err != nil {
1736-
return false, nil, nil, fmt.Errorf("failed to list transit gateway connections: %w", err)
1745+
return false, fmt.Errorf("failed to list transit gateway connections: %w", err)
17371746
}
17381747

17391748
vpcCRN, err := s.fetchVPCCRN()
17401749
if err != nil {
1741-
return false, nil, nil, fmt.Errorf("failed to fetch VPC CRN: %w", err)
1750+
return false, fmt.Errorf("failed to fetch VPC CRN: %w", err)
17421751
}
17431752

17441753
pvsServiceInstanceCRN, err := s.fetchPowerVSServiceInstanceCRN()
17451754
if err != nil {
1746-
return false, nil, nil, fmt.Errorf("failed to fetch PowerVS service instance CRN: %w", err)
1755+
return false, fmt.Errorf("failed to fetch PowerVS service instance CRN: %w", err)
17471756
}
17481757

1749-
var powerVSConnResource, vpcConnResource *infrav1beta2.ResourceReference
1750-
17511758
if len(tgConnections.Connections) == 0 {
1752-
if update {
1753-
s.V(3).Info("Connections not exist on existing transit gateway, creating them")
1754-
powerVSConnID, vpcConnID, err := s.createTransitGatewayConnections(transitGateway, pvsServiceInstanceCRN, vpcCRN)
1755-
if err != nil {
1756-
return false, nil, nil, err
1757-
}
1758-
1759-
powerVSConnResource = &infrav1beta2.ResourceReference{
1760-
ID: powerVSConnID,
1761-
ControllerCreated: ptr.To(true),
1762-
}
1763-
1764-
vpcConnResource = &infrav1beta2.ResourceReference{
1765-
ID: vpcConnID,
1766-
ControllerCreated: ptr.To(true),
1767-
}
1768-
1769-
return true, powerVSConnResource, vpcConnResource, nil
1759+
s.V(3).Info("Connections not exist on transit gateway, creating them")
1760+
if err := s.createTransitGatewayConnections(transitGateway, pvsServiceInstanceCRN, vpcCRN); err != nil {
1761+
return false, err
17701762
}
17711763

1772-
return false, nil, nil, fmt.Errorf("no connections are attached to transit gateway")
1764+
return true, nil
17731765
}
17741766

1775-
requeue, powerVSConnID, vpcConnID, err := s.validateTransitGatewayConnections(tgConnections.Connections, vpcCRN, pvsServiceInstanceCRN)
1767+
requeue, powerVSConnStatus, vpcConnStatus, err := s.validateTransitGatewayConnections(tgConnections.Connections, vpcCRN, pvsServiceInstanceCRN)
17761768
if err != nil {
1777-
return false, nil, nil, err
1769+
return false, err
17781770
} else if requeue {
1779-
return requeue, nil, nil, nil
1771+
return requeue, nil
17801772
}
17811773

17821774
// return when connections are in attached state.
1783-
if powerVSConnID != nil && vpcConnID != nil {
1784-
powerVSConnResource = &infrav1beta2.ResourceReference{
1785-
ID: powerVSConnID,
1786-
ControllerCreated: ptr.To(false),
1787-
}
1788-
1789-
vpcConnResource = &infrav1beta2.ResourceReference{
1790-
ID: vpcConnID,
1791-
ControllerCreated: ptr.To(false),
1792-
}
1793-
1794-
return false, powerVSConnResource, vpcConnResource, nil
1795-
}
1796-
1797-
// return error when any of the connections are not in attached state.
1798-
if (powerVSConnID == nil || vpcConnID == nil) && !update {
1799-
return false, nil, nil, fmt.Errorf("either one of PowerVS or VPC transit gateway connections is not attached, PowerVS: %t VPC: %t", powerVSConnID != nil, vpcConnID != nil)
1775+
if powerVSConnStatus && vpcConnStatus {
1776+
return false, nil
18001777
}
18011778

1802-
// update the connections when update is set to true
1803-
if powerVSConnID == nil {
1779+
// update the connections when connection not exist
1780+
if !powerVSConnStatus {
18041781
s.V(3).Info("Only PowerVS connection not exist in transit gateway, creating it")
1805-
conn, err := s.createTransitGatewayConnection(transitGateway.ID, ptr.To(getTGPowerVSConnectionName(*transitGateway.Name)), ptr.To(string(powervsNetworkConnectionType)), pvsServiceInstanceCRN)
1806-
if err != nil {
1807-
return false, nil, nil, err
1808-
}
1809-
powerVSConnResource = &infrav1beta2.ResourceReference{
1810-
ID: conn.ID,
1811-
ControllerCreated: ptr.To(true),
1812-
}
1813-
} else {
1814-
s.V(3).Info("Using existing PowerVS connection in transit gateway", "id", powerVSConnID)
1815-
powerVSConnResource = &infrav1beta2.ResourceReference{
1816-
ID: powerVSConnID,
1817-
ControllerCreated: ptr.To(false),
1782+
if err := s.createTransitGatewayConnection(transitGateway.ID, ptr.To(getTGPowerVSConnectionName(*transitGateway.Name)), pvsServiceInstanceCRN, powervsNetworkConnectionType); err != nil {
1783+
return false, err
18181784
}
18191785
}
18201786

1821-
if vpcConnID == nil {
1787+
if !vpcConnStatus {
18221788
s.V(3).Info("Only VPC connection not exist in transit gateway, creating it")
1823-
conn, err := s.createTransitGatewayConnection(transitGateway.ID, ptr.To(getTGVPCConnectionName(*transitGateway.Name)), ptr.To(string(vpcNetworkConnectionType)), vpcCRN)
1824-
if err != nil {
1825-
return false, nil, nil, err
1826-
}
1827-
vpcConnResource = &infrav1beta2.ResourceReference{
1828-
ID: conn.ID,
1829-
ControllerCreated: ptr.To(true),
1830-
}
1831-
} else {
1832-
s.V(3).Info("Using existing VPC connection in transit gateway", "id", vpcConnID)
1833-
vpcConnResource = &infrav1beta2.ResourceReference{
1834-
ID: vpcConnID,
1835-
ControllerCreated: ptr.To(false),
1789+
if err := s.createTransitGatewayConnection(transitGateway.ID, ptr.To(getTGVPCConnectionName(*transitGateway.Name)), vpcCRN, vpcNetworkConnectionType); err != nil {
1790+
return false, err
18361791
}
18371792
}
18381793

1839-
return true, powerVSConnResource, vpcConnResource, nil
1794+
return true, nil
18401795
}
18411796

18421797
// validateTransitGatewayConnections validates the existing transit gateway connections.
18431798
// to avoid returning many return values, connection id will be returned and considered that connection is in attached state.
1844-
func (s *PowerVSClusterScope) validateTransitGatewayConnections(connections []tgapiv1.TransitGatewayConnectionCust, vpcCRN, pvsServiceInstanceCRN *string) (bool, *string, *string, error) {
1845-
var powerVSConnID, vpcConnID *string
1799+
func (s *PowerVSClusterScope) validateTransitGatewayConnections(connections []tgapiv1.TransitGatewayConnectionCust, vpcCRN, pvsServiceInstanceCRN *string) (bool, bool, bool, error) {
1800+
var powerVSConnStatus, vpcConnStatus bool
18461801
for _, conn := range connections {
18471802
if *conn.NetworkType == string(vpcNetworkConnectionType) && *conn.NetworkID == *vpcCRN {
18481803
if requeue, err := s.checkTransitGatewayConnectionStatus(conn); err != nil {
1849-
return requeue, nil, nil, err
1804+
return requeue, false, false, err
18501805
} else if requeue {
1851-
return requeue, nil, nil, nil
1806+
return requeue, false, false, nil
1807+
}
1808+
1809+
if s.IBMPowerVSCluster.Status.TransitGateway != nil && s.IBMPowerVSCluster.Status.TransitGateway.VPCConnection == nil {
1810+
s.SetTransitGatewayConnectionStatus(vpcNetworkConnectionType, &infrav1beta2.ResourceReference{ID: conn.ID, ControllerCreated: ptr.To(false)})
18521811
}
1853-
s.V(3).Info("VPC connection in Transit gateway is in attached state", "name", *conn.Name)
1854-
vpcConnID = conn.ID
1812+
vpcConnStatus = true
18551813
}
18561814
if *conn.NetworkType == string(powervsNetworkConnectionType) && *conn.NetworkID == *pvsServiceInstanceCRN {
18571815
if requeue, err := s.checkTransitGatewayConnectionStatus(conn); err != nil {
1858-
return requeue, nil, nil, err
1816+
return requeue, false, false, err
18591817
} else if requeue {
1860-
return requeue, nil, nil, nil
1818+
return requeue, false, false, nil
18611819
}
1862-
s.V(3).Info("PowerVS connection in Transit gateway is in attached state", "name", *conn.Name)
1863-
powerVSConnID = conn.ID
1820+
1821+
if s.IBMPowerVSCluster.Status.TransitGateway != nil && s.IBMPowerVSCluster.Status.TransitGateway.PowerVSConnection == nil {
1822+
s.SetTransitGatewayConnectionStatus(powervsNetworkConnectionType, &infrav1beta2.ResourceReference{ID: conn.ID, ControllerCreated: ptr.To(false)})
1823+
}
1824+
powerVSConnStatus = true
18641825
}
18651826
}
18661827

1867-
return false, powerVSConnID, vpcConnID, nil
1828+
return false, powerVSConnStatus, vpcConnStatus, nil
18681829
}
18691830

18701831
// checkTransitGatewayConnectionStatus checks the state of a transit gateway connection.
@@ -1886,53 +1847,55 @@ func (s *PowerVSClusterScope) checkTransitGatewayConnectionStatus(con tgapiv1.Tr
18861847
}
18871848

18881849
// createTransitGatewayConnection creates transit gateway connection.
1889-
func (s *PowerVSClusterScope) createTransitGatewayConnection(transitGatewayID, connName, networkType, networkID *string) (*tgapiv1.TransitGatewayConnectionCust, error) {
1850+
func (s *PowerVSClusterScope) createTransitGatewayConnection(transitGatewayID, connName, networkID *string, networkType networkConnectionType) error {
18901851
s.V(3).Info("Creating transit gateway connection", "tgID", transitGatewayID, "type", networkType, "name", connName)
18911852
conn, _, err := s.TransitGatewayClient.CreateTransitGatewayConnection(&tgapiv1.CreateTransitGatewayConnectionOptions{
18921853
TransitGatewayID: transitGatewayID,
1893-
NetworkType: networkType,
1854+
NetworkType: ptr.To(string(networkType)),
18941855
NetworkID: networkID,
18951856
Name: connName,
18961857
})
1858+
if err != nil {
1859+
return err
1860+
}
1861+
s.SetTransitGatewayConnectionStatus(networkType, &infrav1beta2.ResourceReference{ID: conn.ID, ControllerCreated: ptr.To(true)})
18971862

1898-
return conn, err
1863+
return nil
18991864
}
19001865

19011866
// createTransitGatewayConnections creates PowerVS and VPC connections in the transit gateway.
1902-
func (s *PowerVSClusterScope) createTransitGatewayConnections(tg *tgapiv1.TransitGateway, pvsServiceInstanceCRN, vpcCRN *string) (*string, *string, error) {
1903-
powerVSConn, err := s.createTransitGatewayConnection(tg.ID, ptr.To(getTGPowerVSConnectionName(*tg.Name)), ptr.To(string(powervsNetworkConnectionType)), pvsServiceInstanceCRN)
1904-
if err != nil {
1905-
return nil, nil, fmt.Errorf("failed to create PowerVS connection in transit gateway: %w", err)
1867+
func (s *PowerVSClusterScope) createTransitGatewayConnections(tg *tgapiv1.TransitGateway, pvsServiceInstanceCRN, vpcCRN *string) error {
1868+
if err := s.createTransitGatewayConnection(tg.ID, ptr.To(getTGPowerVSConnectionName(*tg.Name)), pvsServiceInstanceCRN, powervsNetworkConnectionType); err != nil {
1869+
return fmt.Errorf("failed to create PowerVS connection in transit gateway: %w", err)
19061870
}
19071871

1908-
vpcConn, err := s.createTransitGatewayConnection(tg.ID, ptr.To(getTGVPCConnectionName(*tg.Name)), ptr.To(string(vpcNetworkConnectionType)), vpcCRN)
1909-
if err != nil {
1910-
return nil, nil, fmt.Errorf("failed to create VPC connection in transit gateway: %w", err)
1872+
if err := s.createTransitGatewayConnection(tg.ID, ptr.To(getTGVPCConnectionName(*tg.Name)), vpcCRN, vpcNetworkConnectionType); err != nil {
1873+
return fmt.Errorf("failed to create VPC connection in transit gateway: %w", err)
19111874
}
19121875

1913-
return powerVSConn.ID, vpcConn.ID, nil
1876+
return nil
19141877
}
19151878

19161879
// createTransitGateway create transit gateway.
1917-
func (s *PowerVSClusterScope) createTransitGateway() (*string, *string, *string, error) {
1880+
func (s *PowerVSClusterScope) createTransitGateway() error {
19181881
// TODO(karthik-k-n): Verify that the supplied zone supports PER
19191882
// TODO(karthik-k-n): consider moving to clusterscope
19201883

19211884
// fetch resource group id
19221885
resourceGroupID := s.GetResourceGroupID()
19231886
if resourceGroupID == "" {
1924-
return nil, nil, nil, fmt.Errorf("failed to fetch resource group ID for resource group %v, ID is empty", s.ResourceGroup())
1887+
return fmt.Errorf("failed to fetch resource group ID for resource group %v, ID is empty", s.ResourceGroup())
19251888
}
19261889

19271890
location, globalRouting, err := genUtil.GetTransitGatewayLocationAndRouting(s.Zone(), s.VPC().Region)
19281891
if err != nil {
1929-
return nil, nil, nil, fmt.Errorf("failed to get transit gateway location and routing: %w", err)
1892+
return fmt.Errorf("failed to get transit gateway location and routing: %w", err)
19301893
}
19311894

19321895
// throw error when user tries to use local routing where global routing is required.
19331896
// TODO: Add a webhook validation for below condition.
19341897
if s.IBMPowerVSCluster.Spec.TransitGateway.GlobalRouting != nil && !*s.IBMPowerVSCluster.Spec.TransitGateway.GlobalRouting && *globalRouting {
1935-
return nil, nil, nil, fmt.Errorf("failed to use local routing for transit gateway since powervs and vpc are in different region and requires global routing")
1898+
return fmt.Errorf("failed to use local routing for transit gateway since powervs and vpc are in different region and requires global routing")
19361899
}
19371900
// setting global routing to true when it is set by user.
19381901
if s.IBMPowerVSCluster.Spec.TransitGateway.GlobalRouting != nil && *s.IBMPowerVSCluster.Spec.TransitGateway.GlobalRouting {
@@ -1947,23 +1910,25 @@ func (s *PowerVSClusterScope) createTransitGateway() (*string, *string, *string,
19471910
ResourceGroup: &tgapiv1.ResourceGroupIdentity{ID: ptr.To(resourceGroupID)},
19481911
})
19491912
if err != nil {
1950-
return nil, nil, nil, err
1913+
return err
19511914
}
19521915

1916+
s.SetTransitGatewayStatus(tg.ID, ptr.To(true))
1917+
19531918
vpcCRN, err := s.fetchVPCCRN()
19541919
if err != nil {
1955-
return nil, nil, nil, fmt.Errorf("failed to fetch VPC CRN: %w", err)
1920+
return fmt.Errorf("failed to fetch VPC CRN: %w", err)
19561921
}
19571922
pvsServiceInstanceCRN, err := s.fetchPowerVSServiceInstanceCRN()
19581923
if err != nil {
1959-
return nil, nil, nil, fmt.Errorf("failed to fetch PowerVS service instance CRN: %w", err)
1924+
return fmt.Errorf("failed to fetch PowerVS service instance CRN: %w", err)
19601925
}
19611926

1962-
powerVSConnID, vpcConnID, err := s.createTransitGatewayConnections(tg, pvsServiceInstanceCRN, vpcCRN)
1963-
if err != nil {
1964-
return nil, nil, nil, err
1927+
if err := s.createTransitGatewayConnections(tg, pvsServiceInstanceCRN, vpcCRN); err != nil {
1928+
return err
19651929
}
1966-
return tg.ID, powerVSConnID, vpcConnID, nil
1930+
1931+
return nil
19671932
}
19681933

19691934
// ReconcileLoadBalancers reconcile loadBalancer.

0 commit comments

Comments
 (0)