github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/openstack/networking/v2/extensions/agents/testing/requests_test.go (about)

     1  package testing
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  	"testing"
     8  	"time"
     9  
    10  	fake "github.com/vnpaycloud-console/gophercloud/v2/openstack/networking/v2/common"
    11  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/networking/v2/extensions/agents"
    12  	"github.com/vnpaycloud-console/gophercloud/v2/openstack/networking/v2/extensions/layer3/routers"
    13  	"github.com/vnpaycloud-console/gophercloud/v2/pagination"
    14  	th "github.com/vnpaycloud-console/gophercloud/v2/testhelper"
    15  )
    16  
    17  func TestList(t *testing.T) {
    18  	th.SetupHTTP()
    19  	defer th.TeardownHTTP()
    20  
    21  	th.Mux.HandleFunc("/v2.0/agents", func(w http.ResponseWriter, r *http.Request) {
    22  		th.TestMethod(t, r, "GET")
    23  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
    24  
    25  		w.Header().Add("Content-Type", "application/json")
    26  		w.WriteHeader(http.StatusOK)
    27  
    28  		fmt.Fprint(w, AgentsListResult)
    29  	})
    30  
    31  	count := 0
    32  
    33  	err := agents.List(fake.ServiceClient(), agents.ListOpts{}).EachPage(context.TODO(), func(_ context.Context, page pagination.Page) (bool, error) {
    34  		count++
    35  		actual, err := agents.ExtractAgents(page)
    36  
    37  		if err != nil {
    38  			t.Errorf("Failed to extract agents: %v", err)
    39  			return false, nil
    40  		}
    41  
    42  		expected := []agents.Agent{
    43  			Agent1,
    44  			Agent2,
    45  		}
    46  
    47  		th.CheckDeepEquals(t, expected, actual)
    48  
    49  		return true, nil
    50  	})
    51  	th.AssertNoErr(t, err)
    52  
    53  	if count != 1 {
    54  		t.Errorf("Expected 1 page, got %d", count)
    55  	}
    56  }
    57  
    58  func TestGet(t *testing.T) {
    59  	th.SetupHTTP()
    60  	defer th.TeardownHTTP()
    61  
    62  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a", func(w http.ResponseWriter, r *http.Request) {
    63  		th.TestMethod(t, r, "GET")
    64  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
    65  
    66  		w.Header().Add("Content-Type", "application/json")
    67  		w.WriteHeader(http.StatusOK)
    68  
    69  		fmt.Fprint(w, AgentsGetResult)
    70  	})
    71  
    72  	s, err := agents.Get(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").Extract()
    73  	th.AssertNoErr(t, err)
    74  
    75  	th.AssertEquals(t, s.ID, "43583cf5-472e-4dc8-af5b-6aed4c94ee3a")
    76  	th.AssertEquals(t, s.Binary, "neutron-openvswitch-agent")
    77  	th.AssertEquals(t, s.AdminStateUp, true)
    78  	th.AssertEquals(t, s.Alive, true)
    79  	th.AssertEquals(t, s.Topic, "N/A")
    80  	th.AssertEquals(t, s.Host, "compute3")
    81  	th.AssertEquals(t, s.AgentType, "Open vSwitch agent")
    82  	th.AssertEquals(t, s.HeartbeatTimestamp, time.Date(2019, 1, 9, 11, 43, 01, 0, time.UTC))
    83  	th.AssertEquals(t, s.StartedAt, time.Date(2018, 6, 26, 21, 46, 20, 0, time.UTC))
    84  	th.AssertEquals(t, s.CreatedAt, time.Date(2017, 7, 26, 23, 2, 5, 0, time.UTC))
    85  	th.AssertDeepEquals(t, s.Configurations, map[string]any{
    86  		"ovs_hybrid_plug":            false,
    87  		"datapath_type":              "system",
    88  		"vhostuser_socket_dir":       "/var/run/openvswitch",
    89  		"log_agent_heartbeats":       false,
    90  		"l2_population":              true,
    91  		"enable_distributed_routing": false,
    92  	})
    93  }
    94  
    95  func TestUpdate(t *testing.T) {
    96  	th.SetupHTTP()
    97  	defer th.TeardownHTTP()
    98  
    99  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a", func(w http.ResponseWriter, r *http.Request) {
   100  		th.TestMethod(t, r, "PUT")
   101  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   102  		th.TestHeader(t, r, "Content-Type", "application/json")
   103  		th.TestHeader(t, r, "Accept", "application/json")
   104  		th.TestJSONRequest(t, r, AgentUpdateRequest)
   105  
   106  		w.Header().Add("Content-Type", "application/json")
   107  		w.WriteHeader(http.StatusOK)
   108  
   109  		fmt.Fprint(w, AgentsUpdateResult)
   110  	})
   111  
   112  	iTrue := true
   113  	description := "My OVS agent for OpenStack"
   114  	updateOpts := &agents.UpdateOpts{
   115  		Description:  &description,
   116  		AdminStateUp: &iTrue,
   117  	}
   118  	s, err := agents.Update(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", updateOpts).Extract()
   119  	th.AssertNoErr(t, err)
   120  
   121  	th.AssertDeepEquals(t, *s, Agent)
   122  }
   123  
   124  func TestDelete(t *testing.T) {
   125  	th.SetupHTTP()
   126  	defer th.TeardownHTTP()
   127  
   128  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a", func(w http.ResponseWriter, r *http.Request) {
   129  		th.TestMethod(t, r, "DELETE")
   130  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   131  		th.TestHeader(t, r, "Accept", "application/json")
   132  
   133  		w.Header().Add("Content-Type", "application/json")
   134  		w.WriteHeader(http.StatusNoContent)
   135  	})
   136  
   137  	err := agents.Delete(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").ExtractErr()
   138  	th.AssertNoErr(t, err)
   139  }
   140  
   141  func TestListDHCPNetworks(t *testing.T) {
   142  	th.SetupHTTP()
   143  	defer th.TeardownHTTP()
   144  
   145  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/dhcp-networks", func(w http.ResponseWriter, r *http.Request) {
   146  		th.TestMethod(t, r, "GET")
   147  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   148  
   149  		w.Header().Add("Content-Type", "application/json")
   150  		w.WriteHeader(http.StatusOK)
   151  
   152  		fmt.Fprint(w, AgentDHCPNetworksListResult)
   153  	})
   154  
   155  	s, err := agents.ListDHCPNetworks(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").Extract()
   156  	th.AssertNoErr(t, err)
   157  
   158  	var nilSlice []string
   159  	th.AssertEquals(t, len(s), 1)
   160  	th.AssertEquals(t, s[0].ID, "d32019d3-bc6e-4319-9c1d-6722fc136a22")
   161  	th.AssertEquals(t, s[0].AdminStateUp, true)
   162  	th.AssertEquals(t, s[0].ProjectID, "4fd44f30292945e481c7b8a0c8908869")
   163  	th.AssertEquals(t, s[0].Shared, false)
   164  	th.AssertEquals(t, s[0].Name, "net1")
   165  	th.AssertEquals(t, s[0].Status, "ACTIVE")
   166  	th.AssertDeepEquals(t, s[0].Tags, nilSlice)
   167  	th.AssertEquals(t, s[0].TenantID, "4fd44f30292945e481c7b8a0c8908869")
   168  	th.AssertDeepEquals(t, s[0].AvailabilityZoneHints, []string{})
   169  	th.AssertDeepEquals(t, s[0].Subnets, []string{"54d6f61d-db07-451c-9ab3-b9609b6b6f0b"})
   170  
   171  }
   172  
   173  func TestScheduleDHCPNetwork(t *testing.T) {
   174  	th.SetupHTTP()
   175  	defer th.TeardownHTTP()
   176  
   177  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/dhcp-networks", func(w http.ResponseWriter, r *http.Request) {
   178  		th.TestMethod(t, r, "POST")
   179  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   180  		th.TestHeader(t, r, "Content-Type", "application/json")
   181  		th.TestHeader(t, r, "Accept", "application/json")
   182  		th.TestJSONRequest(t, r, ScheduleDHCPNetworkRequest)
   183  
   184  		w.Header().Add("Content-Type", "application/json")
   185  		w.WriteHeader(http.StatusCreated)
   186  	})
   187  
   188  	opts := &agents.ScheduleDHCPNetworkOpts{
   189  		NetworkID: "1ae075ca-708b-4e66-b4a7-b7698632f05f",
   190  	}
   191  	err := agents.ScheduleDHCPNetwork(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", opts).ExtractErr()
   192  	th.AssertNoErr(t, err)
   193  }
   194  
   195  func TestRemoveDHCPNetwork(t *testing.T) {
   196  	th.SetupHTTP()
   197  	defer th.TeardownHTTP()
   198  
   199  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/dhcp-networks/1ae075ca-708b-4e66-b4a7-b7698632f05f", func(w http.ResponseWriter, r *http.Request) {
   200  		th.TestMethod(t, r, "DELETE")
   201  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   202  		th.TestHeader(t, r, "Accept", "application/json")
   203  
   204  		w.Header().Add("Content-Type", "application/json")
   205  		w.WriteHeader(http.StatusNoContent)
   206  	})
   207  
   208  	err := agents.RemoveDHCPNetwork(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", "1ae075ca-708b-4e66-b4a7-b7698632f05f").ExtractErr()
   209  	th.AssertNoErr(t, err)
   210  }
   211  
   212  func TestListBGPSpeakers(t *testing.T) {
   213  	th.SetupHTTP()
   214  	defer th.TeardownHTTP()
   215  
   216  	agentID := "30d76012-46de-4215-aaa1-a1630d01d891"
   217  
   218  	th.Mux.HandleFunc("/v2.0/agents/"+agentID+"/bgp-drinstances",
   219  		func(w http.ResponseWriter, r *http.Request) {
   220  			th.TestMethod(t, r, "GET")
   221  			th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   222  
   223  			w.Header().Add("Content-Type", "application/json")
   224  			w.WriteHeader(http.StatusOK)
   225  
   226  			fmt.Fprint(w, ListBGPSpeakersResult)
   227  		})
   228  
   229  	count := 0
   230  	err := agents.ListBGPSpeakers(fake.ServiceClient(), agentID).EachPage(
   231  		context.TODO(),
   232  		func(_ context.Context, page pagination.Page) (bool, error) {
   233  			count++
   234  			actual, err := agents.ExtractBGPSpeakers(page)
   235  
   236  			th.AssertNoErr(t, err)
   237  			th.AssertEquals(t, len(actual), 1)
   238  			th.AssertEquals(t, actual[0].ID, "cab00464-284d-4251-9798-2b27db7b1668")
   239  			th.AssertEquals(t, actual[0].Name, "gophercloud-testing-speaker")
   240  			th.AssertEquals(t, actual[0].LocalAS, 12345)
   241  			th.AssertEquals(t, actual[0].IPVersion, 4)
   242  			return true, nil
   243  		})
   244  	th.AssertNoErr(t, err)
   245  	if count != 1 {
   246  		t.Errorf("Expected 1 page, got %d", count)
   247  	}
   248  }
   249  
   250  func TestScheduleBGPSpeaker(t *testing.T) {
   251  	th.SetupHTTP()
   252  	defer th.TeardownHTTP()
   253  
   254  	agentID := "30d76012-46de-4215-aaa1-a1630d01d891"
   255  	speakerID := "8edb2c68-0654-49a9-b3fe-030f92e3ddf6"
   256  
   257  	th.Mux.HandleFunc("/v2.0/agents/"+agentID+"/bgp-drinstances",
   258  		func(w http.ResponseWriter, r *http.Request) {
   259  			th.TestMethod(t, r, "POST")
   260  			th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   261  			th.TestHeader(t, r, "Content-Type", "application/json")
   262  			th.TestHeader(t, r, "Accept", "application/json")
   263  			th.TestJSONRequest(t, r, ScheduleBGPSpeakerRequest)
   264  
   265  			w.Header().Add("Content-Type", "application/json")
   266  			w.WriteHeader(http.StatusCreated)
   267  		})
   268  
   269  	var opts agents.ScheduleBGPSpeakerOpts
   270  	opts.SpeakerID = speakerID
   271  	err := agents.ScheduleBGPSpeaker(context.TODO(), fake.ServiceClient(), agentID, opts).ExtractErr()
   272  	th.AssertNoErr(t, err)
   273  }
   274  
   275  func TestRemoveBGPSpeaker(t *testing.T) {
   276  	th.SetupHTTP()
   277  	defer th.TeardownHTTP()
   278  
   279  	agentID := "30d76012-46de-4215-aaa1-a1630d01d891"
   280  	speakerID := "8edb2c68-0654-49a9-b3fe-030f92e3ddf6"
   281  
   282  	th.Mux.HandleFunc("/v2.0/agents/"+agentID+"/bgp-drinstances/"+speakerID,
   283  		func(w http.ResponseWriter, r *http.Request) {
   284  			th.TestMethod(t, r, "DELETE")
   285  			th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   286  			th.TestHeader(t, r, "Accept", "application/json")
   287  
   288  			w.Header().Add("Content-Type", "application/json")
   289  			w.WriteHeader(http.StatusNoContent)
   290  		})
   291  
   292  	err := agents.RemoveBGPSpeaker(context.TODO(), fake.ServiceClient(), agentID, speakerID).ExtractErr()
   293  	th.AssertNoErr(t, err)
   294  }
   295  
   296  func TestListDRAgentHostingBGPSpeakers(t *testing.T) {
   297  	th.SetupHTTP()
   298  	defer th.TeardownHTTP()
   299  
   300  	speakerID := "3f511b1b-d541-45f1-aa98-2e44e8183d4c"
   301  	th.Mux.HandleFunc("/v2.0/bgp-speakers/"+speakerID+"/bgp-dragents",
   302  		func(w http.ResponseWriter, r *http.Request) {
   303  			th.TestMethod(t, r, "GET")
   304  			th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   305  
   306  			w.Header().Add("Content-Type", "application/json")
   307  			w.WriteHeader(http.StatusOK)
   308  			fmt.Fprint(w, ListDRAgentHostingBGPSpeakersResult)
   309  		})
   310  
   311  	count := 0
   312  	err := agents.ListDRAgentHostingBGPSpeakers(fake.ServiceClient(), speakerID).EachPage(
   313  		context.TODO(),
   314  		func(_ context.Context, page pagination.Page) (bool, error) {
   315  			count++
   316  			actual, err := agents.ExtractAgents(page)
   317  
   318  			if err != nil {
   319  				t.Errorf("Failed to extract agents: %v", err)
   320  				return false, nil
   321  			}
   322  
   323  			expected := []agents.Agent{BGPAgent1, BGPAgent2}
   324  			th.CheckDeepEquals(t, expected, actual)
   325  			return true, nil
   326  		})
   327  	th.AssertNoErr(t, err)
   328  
   329  	if count != 1 {
   330  		t.Errorf("Expected 1 page, got %d", count)
   331  	}
   332  }
   333  
   334  func TestListL3Routers(t *testing.T) {
   335  	th.SetupHTTP()
   336  	defer th.TeardownHTTP()
   337  
   338  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/l3-routers", func(w http.ResponseWriter, r *http.Request) {
   339  		th.TestMethod(t, r, "GET")
   340  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   341  
   342  		w.Header().Add("Content-Type", "application/json")
   343  		w.WriteHeader(http.StatusOK)
   344  
   345  		fmt.Fprint(w, AgentL3RoutersListResult)
   346  	})
   347  
   348  	s, err := agents.ListL3Routers(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a").Extract()
   349  	th.AssertNoErr(t, err)
   350  
   351  	routes := []routers.Route{
   352  		{
   353  			NextHop:         "172.24.3.99",
   354  			DestinationCIDR: "179.24.1.0/24",
   355  		},
   356  	}
   357  
   358  	var snat bool = true
   359  	gw := routers.GatewayInfo{
   360  		EnableSNAT: &snat,
   361  		NetworkID:  "ae34051f-aa6c-4c75-abf5-50dc9ac99ef3",
   362  		ExternalFixedIPs: []routers.ExternalFixedIP{
   363  			{
   364  				IPAddress: "172.24.4.3",
   365  				SubnetID:  "b930d7f6-ceb7-40a0-8b81-a425dd994ccf",
   366  			},
   367  
   368  			{
   369  				IPAddress: "2001:db8::c",
   370  				SubnetID:  "0c56df5d-ace5-46c8-8f4c-45fa4e334d18",
   371  			},
   372  		},
   373  	}
   374  
   375  	var nilSlice []string
   376  	th.AssertEquals(t, len(s), 2)
   377  	th.AssertEquals(t, s[0].ID, "915a14a6-867b-4af7-83d1-70efceb146f9")
   378  	th.AssertEquals(t, s[0].AdminStateUp, true)
   379  	th.AssertEquals(t, s[0].ProjectID, "0bd18306d801447bb457a46252d82d13")
   380  	th.AssertEquals(t, s[0].Name, "router2")
   381  	th.AssertEquals(t, s[0].Status, "ACTIVE")
   382  	th.AssertEquals(t, s[0].TenantID, "0bd18306d801447bb457a46252d82d13")
   383  	th.AssertDeepEquals(t, s[0].AvailabilityZoneHints, []string{})
   384  	th.AssertDeepEquals(t, s[0].Routes, routes)
   385  	th.AssertDeepEquals(t, s[0].GatewayInfo, gw)
   386  	th.AssertDeepEquals(t, s[0].Tags, nilSlice)
   387  	th.AssertEquals(t, s[1].ID, "f8a44de0-fc8e-45df-93c7-f79bf3b01c95")
   388  	th.AssertEquals(t, s[1].Name, "router1")
   389  
   390  }
   391  
   392  func TestScheduleL3Router(t *testing.T) {
   393  	th.SetupHTTP()
   394  	defer th.TeardownHTTP()
   395  
   396  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/l3-routers", func(w http.ResponseWriter, r *http.Request) {
   397  		th.TestMethod(t, r, "POST")
   398  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   399  		th.TestHeader(t, r, "Content-Type", "application/json")
   400  		th.TestHeader(t, r, "Accept", "application/json")
   401  		th.TestJSONRequest(t, r, ScheduleL3RouterRequest)
   402  
   403  		w.Header().Add("Content-Type", "application/json")
   404  		w.WriteHeader(http.StatusCreated)
   405  	})
   406  
   407  	opts := &agents.ScheduleL3RouterOpts{
   408  		RouterID: "43e66290-79a4-415d-9eb9-7ff7919839e1",
   409  	}
   410  	err := agents.ScheduleL3Router(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", opts).ExtractErr()
   411  	th.AssertNoErr(t, err)
   412  }
   413  
   414  func TestRemoveL3Router(t *testing.T) {
   415  	th.SetupHTTP()
   416  	defer th.TeardownHTTP()
   417  
   418  	th.Mux.HandleFunc("/v2.0/agents/43583cf5-472e-4dc8-af5b-6aed4c94ee3a/l3-routers/43e66290-79a4-415d-9eb9-7ff7919839e1", func(w http.ResponseWriter, r *http.Request) {
   419  		th.TestMethod(t, r, "DELETE")
   420  		th.TestHeader(t, r, "X-Auth-Token", fake.TokenID)
   421  		th.TestHeader(t, r, "Accept", "application/json")
   422  
   423  		w.Header().Add("Content-Type", "application/json")
   424  		w.WriteHeader(http.StatusNoContent)
   425  	})
   426  
   427  	err := agents.RemoveL3Router(context.TODO(), fake.ServiceClient(), "43583cf5-472e-4dc8-af5b-6aed4c94ee3a", "43e66290-79a4-415d-9eb9-7ff7919839e1").ExtractErr()
   428  	th.AssertNoErr(t, err)
   429  }