github.com/fastly/go-fastly@v1.18.0/fastly/health_check.go (about) 1 package fastly 2 3 import ( 4 "fmt" 5 "net/url" 6 "sort" 7 "time" 8 ) 9 10 // HealthCheck represents a health check response from the Fastly API. 11 type HealthCheck struct { 12 ServiceID string `mapstructure:"service_id"` 13 Version int `mapstructure:"version"` 14 15 Name string `mapstructure:"name"` 16 Comment string `mapstructure:"comment"` 17 Method string `mapstructure:"method"` 18 Host string `mapstructure:"host"` 19 Path string `mapstructure:"path"` 20 HTTPVersion string `mapstructure:"http_version"` 21 Timeout uint `mapstructure:"timeout"` 22 CheckInterval uint `mapstructure:"check_interval"` 23 ExpectedResponse uint `mapstructure:"expected_response"` 24 Window uint `mapstructure:"window"` 25 Threshold uint `mapstructure:"threshold"` 26 Initial uint `mapstructure:"initial"` 27 CreatedAt *time.Time `mapstructure:"created_at"` 28 UpdatedAt *time.Time `mapstructure:"updated_at"` 29 DeletedAt *time.Time `mapstructure:"deleted_at"` 30 } 31 32 // healthChecksByName is a sortable list of health checks. 33 type healthChecksByName []*HealthCheck 34 35 // Len, Swap, and Less implement the sortable interface. 36 func (s healthChecksByName) Len() int { return len(s) } 37 func (s healthChecksByName) Swap(i, j int) { s[i], s[j] = s[j], s[i] } 38 func (s healthChecksByName) Less(i, j int) bool { 39 return s[i].Name < s[j].Name 40 } 41 42 // ListHealthChecksInput is used as input to the ListHealthChecks function. 43 type ListHealthChecksInput struct { 44 // Service is the ID of the service (required). 45 Service string 46 47 // Version is the specific configuration version (required). 48 Version int 49 } 50 51 // ListHealthChecks returns the list of health checks for the configuration 52 // version. 53 func (c *Client) ListHealthChecks(i *ListHealthChecksInput) ([]*HealthCheck, error) { 54 if i.Service == "" { 55 return nil, ErrMissingService 56 } 57 58 if i.Version == 0 { 59 return nil, ErrMissingVersion 60 } 61 62 path := fmt.Sprintf("/service/%s/version/%d/healthcheck", i.Service, i.Version) 63 resp, err := c.Get(path, nil) 64 if err != nil { 65 return nil, err 66 } 67 68 var hcs []*HealthCheck 69 if err := decodeBodyMap(resp.Body, &hcs); err != nil { 70 return nil, err 71 } 72 sort.Stable(healthChecksByName(hcs)) 73 return hcs, nil 74 } 75 76 // CreateHealthCheckInput is used as input to the CreateHealthCheck function. 77 type CreateHealthCheckInput struct { 78 // Service is the ID of the service. Version is the specific configuration 79 // version. Both fields are required. 80 Service string 81 Version int 82 83 Name string `form:"name,omitempty"` 84 Comment string `form:"comment,omitempty"` 85 Method string `form:"method,omitempty"` 86 Host string `form:"host,omitempty"` 87 Path string `form:"path,omitempty"` 88 HTTPVersion string `form:"http_version,omitempty"` 89 Timeout uint `form:"timeout,omitempty"` 90 CheckInterval uint `form:"check_interval,omitempty"` 91 ExpectedResponse uint `form:"expected_response,omitempty"` 92 Window uint `form:"window,omitempty"` 93 Threshold uint `form:"threshold,omitempty"` 94 Initial uint `form:"initial,omitempty"` 95 } 96 97 // CreateHealthCheck creates a new Fastly health check. 98 func (c *Client) CreateHealthCheck(i *CreateHealthCheckInput) (*HealthCheck, error) { 99 if i.Service == "" { 100 return nil, ErrMissingService 101 } 102 103 if i.Version == 0 { 104 return nil, ErrMissingVersion 105 } 106 107 path := fmt.Sprintf("/service/%s/version/%d/healthcheck", i.Service, i.Version) 108 resp, err := c.PostForm(path, i, nil) 109 if err != nil { 110 return nil, err 111 } 112 113 var h *HealthCheck 114 if err := decodeBodyMap(resp.Body, &h); err != nil { 115 return nil, err 116 } 117 return h, nil 118 } 119 120 // GetHealthCheckInput is used as input to the GetHealthCheck function. 121 type GetHealthCheckInput struct { 122 // Service is the ID of the service. Version is the specific configuration 123 // version. Both fields are required. 124 Service string 125 Version int 126 127 // Name is the name of the health check to fetch. 128 Name string 129 } 130 131 // GetHealthCheck gets the health check configuration with the given parameters. 132 func (c *Client) GetHealthCheck(i *GetHealthCheckInput) (*HealthCheck, error) { 133 if i.Service == "" { 134 return nil, ErrMissingService 135 } 136 137 if i.Version == 0 { 138 return nil, ErrMissingVersion 139 } 140 141 if i.Name == "" { 142 return nil, ErrMissingName 143 } 144 145 path := fmt.Sprintf("/service/%s/version/%d/healthcheck/%s", i.Service, i.Version, url.PathEscape(i.Name)) 146 resp, err := c.Get(path, nil) 147 if err != nil { 148 return nil, err 149 } 150 151 var h *HealthCheck 152 if err := decodeBodyMap(resp.Body, &h); err != nil { 153 return nil, err 154 } 155 return h, nil 156 } 157 158 // UpdateHealthCheckInput is used as input to the UpdateHealthCheck function. 159 type UpdateHealthCheckInput struct { 160 // Service is the ID of the service. Version is the specific configuration 161 // version. Both fields are required. 162 Service string 163 Version int 164 165 // Name is the name of the health check to update. 166 Name string 167 168 NewName string `form:"name,omitempty"` 169 Comment string `form:"comment,omitempty"` 170 Method string `form:"method,omitempty"` 171 Host string `form:"host,omitempty"` 172 Path string `form:"path,omitempty"` 173 HTTPVersion string `form:"http_version,omitempty"` 174 Timeout uint `form:"timeout,omitempty"` 175 CheckInterval uint `form:"check_interval,omitempty"` 176 ExpectedResponse uint `form:"expected_response,omitempty"` 177 Window uint `form:"window,omitempty"` 178 Threshold uint `form:"threshold,omitempty"` 179 Initial uint `form:"initial,omitempty"` 180 } 181 182 // UpdateHealthCheck updates a specific health check. 183 func (c *Client) UpdateHealthCheck(i *UpdateHealthCheckInput) (*HealthCheck, error) { 184 if i.Service == "" { 185 return nil, ErrMissingService 186 } 187 188 if i.Version == 0 { 189 return nil, ErrMissingVersion 190 } 191 192 if i.Name == "" { 193 return nil, ErrMissingName 194 } 195 196 path := fmt.Sprintf("/service/%s/version/%d/healthcheck/%s", i.Service, i.Version, url.PathEscape(i.Name)) 197 resp, err := c.PutForm(path, i, nil) 198 if err != nil { 199 return nil, err 200 } 201 202 var h *HealthCheck 203 if err := decodeBodyMap(resp.Body, &h); err != nil { 204 return nil, err 205 } 206 return h, nil 207 } 208 209 // DeleteHealthCheckInput is the input parameter to DeleteHealthCheck. 210 type DeleteHealthCheckInput struct { 211 // Service is the ID of the service. Version is the specific configuration 212 // version. Both fields are required. 213 Service string 214 Version int 215 216 // Name is the name of the health check to delete (required). 217 Name string 218 } 219 220 // DeleteHealthCheck deletes the given health check. 221 func (c *Client) DeleteHealthCheck(i *DeleteHealthCheckInput) error { 222 if i.Service == "" { 223 return ErrMissingService 224 } 225 226 if i.Version == 0 { 227 return ErrMissingVersion 228 } 229 230 if i.Name == "" { 231 return ErrMissingName 232 } 233 234 path := fmt.Sprintf("/service/%s/version/%d/healthcheck/%s", i.Service, i.Version, url.PathEscape(i.Name)) 235 resp, err := c.Delete(path, nil) 236 if err != nil { 237 return err 238 } 239 240 var r *statusResp 241 if err := decodeBodyMap(resp.Body, &r); err != nil { 242 return err 243 } 244 if !r.Ok() { 245 return ErrNotOK 246 } 247 return nil 248 }