147 lines
4.1 KiB
Go
147 lines
4.1 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// SecurityGroup definition
|
|
type SecurityGroup struct {
|
|
Description string `json:"description"`
|
|
ID string `json:"id"`
|
|
Organization string `json:"organization"`
|
|
Name string `json:"name"`
|
|
Servers []ServerRef `json:"servers"`
|
|
EnableDefaultSecurity bool `json:"enable_default_security"`
|
|
OrganizationDefault bool `json:"organization_default"`
|
|
}
|
|
|
|
type SecurityGroupRef struct {
|
|
Identifier string `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
}
|
|
|
|
type ServerRef struct {
|
|
Identifier string `json:"id,omitempty"`
|
|
Name string `json:"name,omitempty"`
|
|
}
|
|
|
|
// getSecurityGroups represents the response of a GET /security_groups/
|
|
type getSecurityGroups struct {
|
|
SecurityGroups []SecurityGroup `json:"security_groups"`
|
|
}
|
|
|
|
// getSecurityGroup represents the response of a GET /security_groups/{groupID}
|
|
type getSecurityGroup struct {
|
|
SecurityGroup SecurityGroup `json:"security_group"`
|
|
}
|
|
|
|
// NewSecurityGroup definition POST request /security_groups
|
|
type NewSecurityGroup struct {
|
|
Organization string `json:"organization"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
EnableDefaultSecurity bool `json:"enable_default_security"`
|
|
}
|
|
|
|
// UpdateSecurityGroup definition PUT request /security_groups
|
|
type UpdateSecurityGroup struct {
|
|
Organization string `json:"organization"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
OrganizationDefault bool `json:"organization_default"`
|
|
}
|
|
|
|
// DeleteSecurityGroup deletes a SecurityGroup
|
|
func (s *API) DeleteSecurityGroup(securityGroupID string) error {
|
|
resp, err := s.DeleteResponse(s.computeAPI, fmt.Sprintf("security_groups/%s", securityGroupID))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
_, err = s.handleHTTPError([]int{http.StatusNoContent}, resp)
|
|
return err
|
|
}
|
|
|
|
// UpdateSecurityGroup updates a SecurityGroup
|
|
func (s *API) UpdateSecurityGroup(group UpdateSecurityGroup, securityGroupID string) (*SecurityGroup, error) {
|
|
resp, err := s.PutResponse(s.computeAPI, fmt.Sprintf("security_groups/%s", securityGroupID), group)
|
|
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 getSecurityGroup
|
|
if err = json.Unmarshal(body, &data); err != nil {
|
|
return nil, err
|
|
}
|
|
return &data.SecurityGroup, err
|
|
}
|
|
|
|
// GetSecurityGroup returns a SecurityGroup
|
|
func (s *API) GetSecurityGroup(groupsID string) (*SecurityGroup, error) {
|
|
resp, err := s.GetResponsePaginate(s.computeAPI, fmt.Sprintf("security_groups/%s", groupsID), 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 securityGroups getSecurityGroup
|
|
|
|
if err = json.Unmarshal(body, &securityGroups); err != nil {
|
|
return nil, err
|
|
}
|
|
return &securityGroups.SecurityGroup, nil
|
|
}
|
|
|
|
// CreateSecurityGroup posts a group on a server
|
|
func (s *API) CreateSecurityGroup(group NewSecurityGroup) (*SecurityGroup, error) {
|
|
resp, err := s.PostResponse(s.computeAPI, "security_groups", group)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
body, err := s.handleHTTPError([]int{http.StatusCreated}, resp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var securityGroups getSecurityGroup
|
|
|
|
if err = json.Unmarshal(body, &securityGroups); err != nil {
|
|
return nil, err
|
|
}
|
|
return &securityGroups.SecurityGroup, nil
|
|
}
|
|
|
|
// GetSecurityGroups returns a SecurityGroups
|
|
func (s *API) GetSecurityGroups() ([]SecurityGroup, error) {
|
|
resp, err := s.GetResponsePaginate(s.computeAPI, "security_groups", 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 securityGroups getSecurityGroups
|
|
|
|
if err = json.Unmarshal(body, &securityGroups); err != nil {
|
|
return nil, err
|
|
}
|
|
return securityGroups.SecurityGroups, nil
|
|
}
|