-
Notifications
You must be signed in to change notification settings - Fork 0
/
results.go
124 lines (107 loc) · 3.95 KB
/
results.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package routers
import (
"fmt"
edgecloud "github.com/Edge-Center/edgecentercloud-go"
"github.com/Edge-Center/edgecentercloud-go/edgecenter/instance/v1/instances"
"github.com/Edge-Center/edgecentercloud-go/edgecenter/subnet/v1/subnets"
"github.com/Edge-Center/edgecentercloud-go/edgecenter/task/v1/tasks"
"github.com/Edge-Center/edgecentercloud-go/pagination"
)
type commonResult struct {
edgecloud.Result
}
// Extract is a function that accepts a result and extracts a router resource.
func (r commonResult) Extract() (*Router, error) {
var s Router
err := r.ExtractInto(&s)
return &s, err
}
func (r commonResult) ExtractInto(v interface{}) error {
return r.Result.ExtractIntoStructPtr(v, "")
}
// GetResult represents the result of a get operation. Call its Extract
// method to interpret it as a router.
type GetResult struct {
commonResult
}
// UpdateResult represents the result of an update operation. Call its Extract
// method to interpret it as a router.
type UpdateResult struct {
commonResult
}
// ExternalFixedIP is the IP address and subnet ID of the external gateway of a
// router.
type ExtFixedIPs struct {
IPAddress string `json:"ip_address"`
SubnetID string `json:"subnet_id"`
}
// GatewayInfo represents the information of an external gateway for any
// particular network router.
type ExtGatewayInfo struct {
EnableSNat bool `json:"enable_snat"`
ExternalFixedIPs []ExtFixedIPs `json:"external_fixed_ips"`
NetworkID string `json:"network_id"`
}
// Router represents a router structure.
type Router struct {
ID string `json:"id"`
Name string `json:"name"`
Status string `json:"status"`
ExternalGatewayInfo ExtGatewayInfo `json:"external_gateway_info"`
Routes []subnets.HostRoute `json:"routes"`
Interfaces []instances.Interface `json:"interfaces"`
TaskID string `json:"task_id"`
CreatorTaskID string `json:"creator_task_id"`
ProjectID int `json:"project_id"`
RegionID int `json:"region_id"`
CreatedAt edgecloud.JSONRFC3339Z `json:"created_at"`
UpdatedAt edgecloud.JSONRFC3339Z `json:"updated_at"`
}
// RouterPage is the page returned by a pager when traversing over a
// collection of routers.
type RouterPage struct {
pagination.LinkedPageBase
}
// NextPageURL is invoked when a paginated collection of routers has reached
// the end of a page and the pager seeks to traverse over a new one. In order
// to do this, it needs to construct the next page's URL.
func (r RouterPage) NextPageURL() (string, error) {
var s struct {
Links []edgecloud.Link `json:"links"`
}
err := r.ExtractInto(&s)
if err != nil {
return "", err
}
return edgecloud.ExtractNextURL(s.Links)
}
// IsEmpty checks whether a RouterPage struct is empty.
func (r RouterPage) IsEmpty() (bool, error) {
is, err := ExtractRouters(r)
return len(is) == 0, err
}
// ExtractRouter accepts a Page struct, specifically a RouterPage struct,
// and extracts the elements into a slice of Router structs. In other words,
// a generic collection is mapped into a relevant slice.
func ExtractRouters(r pagination.Page) ([]Router, error) {
var s []Router
err := ExtractRoutersInto(r, &s)
return s, err
}
func ExtractRoutersInto(r pagination.Page, v interface{}) error {
return r.(RouterPage).Result.ExtractIntoSlicePtr(v, "results")
}
type RouterTaskResult struct {
Routers []string `json:"routers"`
}
func ExtractRouterIDFromTask(task *tasks.Task) (string, error) {
var result RouterTaskResult
err := edgecloud.NativeMapToStruct(task.CreatedResources, &result)
if err != nil {
return "", fmt.Errorf("cannot decode router information in task structure: %w", err)
}
if len(result.Routers) == 0 {
return "", fmt.Errorf("cannot decode router information in task structure: %w", err)
}
return result.Routers[0], nil
}