github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_l2_vpn_tunnel_test.go (about)

     1  //go:build network || nsxt || functional || openapi || ALL
     2  
     3  package govcd
     4  
     5  import (
     6  	"fmt"
     7  
     8  	"github.com/vmware/go-vcloud-director/v2/types/v56"
     9  	. "gopkg.in/check.v1"
    10  )
    11  
    12  // Test_NsxtL2VpnTunnel tests NSX-T Edge Gateway L2 VPN Tunnels.
    13  // 1. It creates/gets/updates/deletes a SERVER type Tunnel, also the peer code (encoded configuration of the tunnel)
    14  // is saved for creation of CLIENT type tunnel.
    15  // 2. Creates/gets/updates/deletes a CLIENT type Tunnel
    16  func (vcd *TestVCD) Test_NsxtL2VpnTunnel(check *C) {
    17  	skipNoNsxtConfiguration(vcd, check)
    18  	skipOpenApiEndpointTest(vcd, check, types.OpenApiPathVersion1_0_0+types.OpenApiEndpointEdgeGatewayL2VpnTunnel)
    19  	vcd.skipIfNotSysAdmin(check)
    20  
    21  	org, err := vcd.client.GetOrgByName(vcd.config.VCD.Org)
    22  	check.Assert(err, IsNil)
    23  
    24  	nsxtVdc, err := org.GetVDCByName(vcd.config.VCD.Nsxt.Vdc, false)
    25  	check.Assert(err, IsNil)
    26  
    27  	edge, err := nsxtVdc.GetNsxtEdgeGatewayByName(vcd.config.VCD.Nsxt.EdgeGateway)
    28  	check.Assert(err, IsNil)
    29  
    30  	network, err := nsxtVdc.GetOrgVdcNetworkByName(vcd.config.VCD.Nsxt.RoutedNetwork, false)
    31  	check.Assert(err, IsNil)
    32  
    33  	// Get the auto-allocated IP of the Edge Gateway
    34  	localEndpointIp, err := edge.GetUsedIpAddresses(nil)
    35  	check.Assert(err, IsNil)
    36  
    37  	// SERVER Tunnel part
    38  	serverTunnelParams := &types.NsxtL2VpnTunnel{
    39  		Name:                    check.TestName(),
    40  		Description:             check.TestName(),
    41  		SessionMode:             "SERVER",
    42  		Enabled:                 true,
    43  		LocalEndpointIp:         localEndpointIp[0].IPAddress,
    44  		RemoteEndpointIp:        "1.1.1.1",
    45  		TunnelInterface:         "",
    46  		ConnectorInitiationMode: "ON_DEMAND",
    47  		PreSharedKey:            check.TestName(),
    48  		StretchedNetworks: []types.EdgeL2VpnStretchedNetwork{
    49  			{
    50  				NetworkRef: types.OpenApiReference{
    51  					Name: network.OrgVDCNetwork.Name,
    52  					ID:   network.OrgVDCNetwork.ID,
    53  				},
    54  			},
    55  		},
    56  		Logging: false,
    57  	}
    58  
    59  	serverTunnel, err := edge.CreateL2VpnTunnel(serverTunnelParams)
    60  	check.Assert(err, IsNil)
    61  	check.Assert(serverTunnel, NotNil)
    62  	AddToCleanupListOpenApi(serverTunnel.NsxtL2VpnTunnel.ID, check.TestName(),
    63  		fmt.Sprintf(types.OpenApiPathVersion1_0_0+
    64  			types.OpenApiEndpointEdgeGatewayL2VpnTunnel+
    65  			serverTunnel.NsxtL2VpnTunnel.ID, edge.EdgeGateway.ID))
    66  
    67  	// Save the peer code to create a Client tunnel for testing
    68  	peerCode := serverTunnel.NsxtL2VpnTunnel.PeerCode
    69  
    70  	check.Assert(serverTunnel.NsxtL2VpnTunnel.Name, Equals, check.TestName())
    71  	check.Assert(serverTunnel.NsxtL2VpnTunnel.Description, Equals, check.TestName())
    72  	check.Assert(serverTunnel.NsxtL2VpnTunnel.SessionMode, Equals, "SERVER")
    73  	check.Assert(serverTunnel.NsxtL2VpnTunnel.Enabled, Equals, true)
    74  	check.Assert(serverTunnel.NsxtL2VpnTunnel.LocalEndpointIp, Equals, localEndpointIp[0].IPAddress)
    75  	check.Assert(serverTunnel.NsxtL2VpnTunnel.RemoteEndpointIp, Equals, "1.1.1.1")
    76  	check.Assert(serverTunnel.NsxtL2VpnTunnel.ConnectorInitiationMode, Equals, "ON_DEMAND")
    77  	check.Assert(serverTunnel.NsxtL2VpnTunnel.PreSharedKey, Equals, check.TestName())
    78  
    79  	fetchedServerTunnel, err := edge.GetL2VpnTunnelById(serverTunnel.NsxtL2VpnTunnel.ID)
    80  	check.Assert(err, IsNil)
    81  	check.Assert(fetchedServerTunnel, DeepEquals, serverTunnel)
    82  
    83  	updatedServerTunnelParams := serverTunnelParams
    84  	updatedServerTunnelParams.ConnectorInitiationMode = "INITIATOR"
    85  	updatedServerTunnelParams.RemoteEndpointIp = "2.2.2.2"
    86  	updatedServerTunnelParams.TunnelInterface = "192.168.0.1/24"
    87  
    88  	updatedServerTunnel, err := serverTunnel.Update(updatedServerTunnelParams)
    89  	check.Assert(err, IsNil)
    90  	check.Assert(updatedServerTunnel, NotNil)
    91  
    92  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.Name, Equals, check.TestName())
    93  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.Description, Equals, check.TestName())
    94  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.SessionMode, Equals, "SERVER")
    95  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.Enabled, Equals, true)
    96  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.LocalEndpointIp, Equals, localEndpointIp[0].IPAddress)
    97  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.RemoteEndpointIp, Equals, "2.2.2.2")
    98  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.TunnelInterface, Equals, "192.168.0.1/24")
    99  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.ConnectorInitiationMode, Equals, "INITIATOR")
   100  	check.Assert(updatedServerTunnel.NsxtL2VpnTunnel.PreSharedKey, Equals, check.TestName())
   101  
   102  	tunnelByName, err := edge.GetL2VpnTunnelByName(serverTunnel.NsxtL2VpnTunnel.Name)
   103  	check.Assert(err, IsNil)
   104  	check.Assert(tunnelByName.NsxtL2VpnTunnel.ID, Equals, serverTunnel.NsxtL2VpnTunnel.ID)
   105  
   106  	nonexistentTunnel, err := edge.GetL2VpnTunnelByName("nonexistent-tunnel")
   107  	check.Assert(err, NotNil)
   108  	check.Assert(nonexistentTunnel, IsNil)
   109  
   110  	err = updatedServerTunnel.Delete()
   111  	check.Assert(err, IsNil)
   112  
   113  	deletedServerTunnel, err := edge.GetL2VpnTunnelById(serverTunnel.NsxtL2VpnTunnel.ID)
   114  	check.Assert(err, NotNil)
   115  	check.Assert(deletedServerTunnel, IsNil)
   116  
   117  	// CLIENT Tunnel part
   118  	clientTunnelParams := &types.NsxtL2VpnTunnel{
   119  		Name:             check.TestName(),
   120  		Description:      check.TestName(),
   121  		SessionMode:      "CLIENT",
   122  		Enabled:          true,
   123  		LocalEndpointIp:  localEndpointIp[0].IPAddress,
   124  		RemoteEndpointIp: "1.1.1.1",
   125  		PreSharedKey:     check.TestName(),
   126  		PeerCode:         peerCode,
   127  		StretchedNetworks: []types.EdgeL2VpnStretchedNetwork{
   128  			{
   129  				NetworkRef: types.OpenApiReference{
   130  					Name: network.OrgVDCNetwork.Name,
   131  					ID:   network.OrgVDCNetwork.ID,
   132  				},
   133  				TunnelID: 1,
   134  			},
   135  		},
   136  		Logging: false,
   137  	}
   138  
   139  	clientTunnel, err := edge.CreateL2VpnTunnel(clientTunnelParams)
   140  	check.Assert(err, IsNil)
   141  	check.Assert(clientTunnel, NotNil)
   142  	AddToCleanupListOpenApi(clientTunnel.NsxtL2VpnTunnel.ID, check.TestName(),
   143  		fmt.Sprintf(types.OpenApiPathVersion1_0_0+
   144  			types.OpenApiEndpointEdgeGatewayL2VpnTunnel+
   145  			clientTunnel.NsxtL2VpnTunnel.ID, edge.EdgeGateway.ID))
   146  
   147  	check.Assert(clientTunnel.NsxtL2VpnTunnel.Name, Equals, check.TestName())
   148  	check.Assert(clientTunnel.NsxtL2VpnTunnel.Description, Equals, check.TestName())
   149  	check.Assert(clientTunnel.NsxtL2VpnTunnel.SessionMode, Equals, "CLIENT")
   150  	check.Assert(clientTunnel.NsxtL2VpnTunnel.Enabled, Equals, true)
   151  	check.Assert(clientTunnel.NsxtL2VpnTunnel.LocalEndpointIp, Equals, localEndpointIp[0].IPAddress)
   152  	check.Assert(clientTunnel.NsxtL2VpnTunnel.RemoteEndpointIp, Equals, "1.1.1.1")
   153  	check.Assert(clientTunnel.NsxtL2VpnTunnel.PreSharedKey, Equals, check.TestName())
   154  
   155  	fetchedClientTunnel, err := edge.GetL2VpnTunnelById(clientTunnel.NsxtL2VpnTunnel.ID)
   156  	check.Assert(err, IsNil)
   157  	check.Assert(fetchedClientTunnel, DeepEquals, clientTunnel)
   158  
   159  	updatedClientTunnelParams := clientTunnelParams
   160  	updatedClientTunnelParams.RemoteEndpointIp = "2.2.2.2"
   161  
   162  	updatedClientTunnel, err := clientTunnel.Update(updatedClientTunnelParams)
   163  	check.Assert(err, IsNil)
   164  	check.Assert(updatedClientTunnel, NotNil)
   165  
   166  	check.Assert(updatedClientTunnel.NsxtL2VpnTunnel.Name, Equals, check.TestName())
   167  	check.Assert(updatedClientTunnel.NsxtL2VpnTunnel.Description, Equals, check.TestName())
   168  	check.Assert(updatedClientTunnel.NsxtL2VpnTunnel.SessionMode, Equals, "CLIENT")
   169  	check.Assert(updatedClientTunnel.NsxtL2VpnTunnel.Enabled, Equals, true)
   170  	check.Assert(updatedClientTunnel.NsxtL2VpnTunnel.LocalEndpointIp, Equals, localEndpointIp[0].IPAddress)
   171  	check.Assert(updatedClientTunnel.NsxtL2VpnTunnel.RemoteEndpointIp, Equals, "2.2.2.2")
   172  
   173  	// Check if the bug exists in versions above 38.0, so the testsuite would let us adjust the
   174  	// version constraint in Update()
   175  	if vcd.client.Client.APIVCDMaxVersionIs("> 38.0") {
   176  		disabledClientTunnelParams := updatedClientTunnelParams
   177  		disabledClientTunnelParams.Enabled = false
   178  		disabledClientTunnel, err := updatedClientTunnel.Update(disabledClientTunnelParams)
   179  		check.Assert(err, IsNil)
   180  		check.Assert(disabledClientTunnel.NsxtL2VpnTunnel.Enabled, Equals, false)
   181  	}
   182  
   183  	// There is a bug in all versions up to 10.5.0, it happens
   184  	// when a L2 VPN Tunnel is created in CLIENT mode, has at least one Org VDC
   185  	// network attached, and is updated in any way. After that, to delete the tunnel
   186  	// one needs to de-attach all the networks
   187  	// or call Delete() the amount of times the object was updated
   188  	if vcd.client.Client.APIVCDMaxVersionIs("<= 38.0") {
   189  		updatedClientTunnelParams.StretchedNetworks = nil
   190  		updatedClientTunnel, err = updatedClientTunnel.Update(updatedClientTunnelParams)
   191  		check.Assert(err, IsNil)
   192  	}
   193  
   194  	err = updatedClientTunnel.Delete()
   195  	check.Assert(err, IsNil)
   196  
   197  	deletedClientTunnel, err := edge.GetL2VpnTunnelById(clientTunnel.NsxtL2VpnTunnel.ID)
   198  	check.Assert(err, NotNil)
   199  	check.Assert(deletedClientTunnel, IsNil)
   200  }