func (command *commandList) Execute(resource *handler.Resource) { opts := resource.Params.(*paramsList).opts allPages := resource.Params.(*paramsList).allPages pager := securityGroupRules.List(command.Ctx.ServiceClient, *opts) if allPages { pages, err := pager.AllPages() if err != nil { resource.Err = err return } info, err := osSecurityGroupRules.ExtractRules(pages) if err != nil { resource.Err = err return } result := make([]map[string]interface{}, len(info)) for j, rule := range info { result[j] = securityGroupRuleSingle(&rule) } resource.Result = result } else { limit := opts.Limit err := pager.EachPage(func(page pagination.Page) (bool, error) { info, err := osSecurityGroupRules.ExtractRules(page) if err != nil { return false, err } result := make([]map[string]interface{}, len(info)) for j, rule := range info { result[j] = securityGroupRuleSingle(&rule) } resource.Result = result if len(info) >= limit { return false, nil } limit -= len(info) command.Ctx.WaitGroup.Add(1) command.Ctx.Results <- resource return true, nil }) if err != nil { resource.Err = err return } } }
func TestList(t *testing.T) { th.SetupHTTP() defer th.TeardownHTTP() th.Mux.HandleFunc("/v2.0/security-group-rules", func(w http.ResponseWriter, r *http.Request) { th.TestMethod(t, r, "GET") th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) w.Header().Add("Content-Type", "application/json") w.WriteHeader(http.StatusOK) fmt.Fprintf(w, ` { "security_group_rules": [ { "direction": "egress", "ethertype": "IPv6", "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff", "port_range_max": null, "port_range_min": null, "protocol": null, "remote_group_id": null, "remote_ip_prefix": null, "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5", "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550" }, { "direction": "egress", "ethertype": "IPv4", "id": "93aa42e5-80db-4581-9391-3a608bd0e448", "port_range_max": null, "port_range_min": null, "protocol": null, "remote_group_id": null, "remote_ip_prefix": null, "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5", "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550" } ] } `) }) count := 0 List(fake.ServiceClient(), osRules.ListOpts{}).EachPage(func(page pagination.Page) (bool, error) { count++ actual, err := osRules.ExtractRules(page) if err != nil { t.Errorf("Failed to extract secrules: %v", err) return false, err } expected := []osRules.SecGroupRule{ osRules.SecGroupRule{ Direction: "egress", EtherType: "IPv6", ID: "3c0e45ff-adaf-4124-b083-bf390e5482ff", PortRangeMax: 0, PortRangeMin: 0, Protocol: "", RemoteGroupID: "", RemoteIPPrefix: "", SecGroupID: "85cc3048-abc3-43cc-89b3-377341426ac5", TenantID: "e4f50856753b4dc6afee5fa6b9b6c550", }, osRules.SecGroupRule{ Direction: "egress", EtherType: "IPv4", ID: "93aa42e5-80db-4581-9391-3a608bd0e448", PortRangeMax: 0, PortRangeMin: 0, Protocol: "", RemoteGroupID: "", RemoteIPPrefix: "", SecGroupID: "85cc3048-abc3-43cc-89b3-377341426ac5", TenantID: "e4f50856753b4dc6afee5fa6b9b6c550", }, } th.CheckDeepEquals(t, expected, actual) return true, nil }) if count != 1 { t.Errorf("Expected 1 page, got %d", count) } }