github.com/gophercloud/gophercloud@v1.11.0/openstack/networking/v2/extensions/agents/testing/requests_test.go (about)

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