141 lines
4.1 KiB
Go
141 lines
4.1 KiB
Go
|
package api
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
)
|
||
|
|
||
|
// SecurityGroupRule definition
|
||
|
type SecurityGroupRule struct {
|
||
|
Direction string `json:"direction"`
|
||
|
Protocol string `json:"protocol"`
|
||
|
IPRange string `json:"ip_range"`
|
||
|
DestPortFrom int `json:"dest_port_from,omitempty"`
|
||
|
Action string `json:"action"`
|
||
|
Position int `json:"position"`
|
||
|
DestPortTo string `json:"dest_port_to"`
|
||
|
Editable bool `json:"editable"`
|
||
|
ID string `json:"id"`
|
||
|
}
|
||
|
|
||
|
// getSecurityGroupRules represents the response of a GET /_group/{groupID}/rules
|
||
|
type getSecurityGroupRules struct {
|
||
|
Rules []SecurityGroupRule `json:"rules"`
|
||
|
}
|
||
|
|
||
|
// getSecurityGroupRule represents the response of a GET /_group/{groupID}/rules/{ruleID}
|
||
|
type getSecurityGroupRule struct {
|
||
|
Rules SecurityGroupRule `json:"rule"`
|
||
|
}
|
||
|
|
||
|
// NewSecurityGroupRule definition POST/PUT request /_group/{groupID}
|
||
|
type NewSecurityGroupRule struct {
|
||
|
Action string `json:"action"`
|
||
|
Direction string `json:"direction"`
|
||
|
IPRange string `json:"ip_range"`
|
||
|
Protocol string `json:"protocol"`
|
||
|
DestPortFrom int `json:"dest_port_from,omitempty"`
|
||
|
}
|
||
|
|
||
|
// UpdateSecurityGroupRule definition POST/PUT request /_group/{groupID}
|
||
|
type UpdateSecurityGroupRule struct {
|
||
|
Action string `json:"action"`
|
||
|
Direction string `json:"direction"`
|
||
|
IPRange string `json:"ip_range"`
|
||
|
Protocol string `json:"protocol"`
|
||
|
Position int `json:"position"`
|
||
|
DestPortFrom int `json:"dest_port_from,omitempty"`
|
||
|
}
|
||
|
|
||
|
// GetSecurityGroupRules returns a GroupRules
|
||
|
func (s *API) GetSecurityGroupRules(groupID string) ([]SecurityGroupRule, error) {
|
||
|
resp, err := s.GetResponsePaginate(s.computeAPI, fmt.Sprintf("security_groups/%s/rules", groupID), url.Values{})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
body, err := s.handleHTTPError([]int{http.StatusOK}, resp)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var data getSecurityGroupRules
|
||
|
|
||
|
if err = json.Unmarshal(body, &data); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return data.Rules, nil
|
||
|
}
|
||
|
|
||
|
// GetASecurityGroupRule returns a SecurityGroupRule
|
||
|
func (s *API) GetSecurityGroupRule(groupID string, rulesID string) (*SecurityGroupRule, error) {
|
||
|
resp, err := s.GetResponsePaginate(s.computeAPI, fmt.Sprintf("security_groups/%s/rules/%s", groupID, rulesID), url.Values{})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
body, err := s.handleHTTPError([]int{http.StatusOK}, resp)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var data getSecurityGroupRule
|
||
|
|
||
|
if err = json.Unmarshal(body, &data); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &data.Rules, nil
|
||
|
}
|
||
|
|
||
|
type postGroupRuleResponse struct {
|
||
|
SecurityGroupRule SecurityGroupRule `json:"rule"`
|
||
|
}
|
||
|
|
||
|
// CreateSecurityGroupRule posts a rule on a server
|
||
|
func (s *API) CreateSecurityGroupRule(GroupID string, rules NewSecurityGroupRule) (*SecurityGroupRule, error) {
|
||
|
resp, err := s.PostResponse(s.computeAPI, fmt.Sprintf("security_groups/%s/rules", GroupID), rules)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
data, err := s.handleHTTPError([]int{http.StatusCreated}, resp)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var res postGroupRuleResponse
|
||
|
err = json.Unmarshal(data, &res)
|
||
|
return &res.SecurityGroupRule, err
|
||
|
}
|
||
|
|
||
|
// UpdateSecurityGroupRule updates a SecurityGroupRule
|
||
|
func (s *API) UpdateSecurityGroupRule(rules UpdateSecurityGroupRule, GroupID, RuleID string) (*SecurityGroupRule, error) {
|
||
|
resp, err := s.PutResponse(s.computeAPI, fmt.Sprintf("security_groups/%s/rules/%s", GroupID, RuleID), rules)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
body, err := s.handleHTTPError([]int{http.StatusOK}, resp)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var res postGroupRuleResponse
|
||
|
err = json.Unmarshal(body, &res)
|
||
|
return &res.SecurityGroupRule, err
|
||
|
}
|
||
|
|
||
|
// DeleteSecurityGroupRule deletes a SecurityGroupRule
|
||
|
func (s *API) DeleteSecurityGroupRule(GroupID, RuleID string) error {
|
||
|
resp, err := s.DeleteResponse(s.computeAPI, fmt.Sprintf("security_groups/%s/rules/%s", GroupID, RuleID))
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
_, err = s.handleHTTPError([]int{http.StatusNoContent}, resp)
|
||
|
return err
|
||
|
}
|