open-vault/vendor/github.com/cloudfoundry-community/go-cfclient/orgs.go

833 lines
25 KiB
Go
Raw Normal View History

package cfclient
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"github.com/pkg/errors"
)
type OrgResponse struct {
Count int `json:"total_results"`
Pages int `json:"total_pages"`
NextUrl string `json:"next_url"`
Resources []OrgResource `json:"resources"`
}
type OrgResource struct {
Meta Meta `json:"metadata"`
Entity Org `json:"entity"`
}
type OrgUserResponse struct {
Count int `json:"total_results"`
Pages int `json:"total_pages"`
NextURL string `json:"next_url"`
Resources []UserResource `json:"resources"`
}
type Org struct {
Guid string `json:"guid"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
Name string `json:"name"`
Status string `json:"status"`
QuotaDefinitionGuid string `json:"quota_definition_guid"`
DefaultIsolationSegmentGuid string `json:"default_isolation_segment_guid"`
c *Client
}
type OrgSummary struct {
Guid string `json:"guid"`
Name string `json:"name"`
Status string `json:"status"`
Spaces []OrgSummarySpaces `json:"spaces"`
}
type OrgSummarySpaces struct {
Guid string `json:"guid"`
Name string `json:"name"`
ServiceCount int `json:"service_count"`
AppCount int `json:"app_count"`
MemDevTotal int `json:"mem_dev_total"`
MemProdTotal int `json:"mem_prod_total"`
}
type OrgRequest struct {
Name string `json:"name"`
Status string `json:"status,omitempty"`
QuotaDefinitionGuid string `json:"quota_definition_guid,omitempty"`
DefaultIsolationSegmentGuid string `json:"default_isolation_segment_guid,omitempty"`
}
func (c *Client) ListOrgsByQuery(query url.Values) ([]Org, error) {
var orgs []Org
requestURL := "/v2/organizations?" + query.Encode()
for {
orgResp, err := c.getOrgResponse(requestURL)
if err != nil {
return []Org{}, err
}
for _, org := range orgResp.Resources {
orgs = append(orgs, c.mergeOrgResource(org))
}
requestURL = orgResp.NextUrl
if requestURL == "" {
break
}
}
return orgs, nil
}
func (c *Client) ListOrgs() ([]Org, error) {
return c.ListOrgsByQuery(nil)
}
func (c *Client) GetOrgByName(name string) (Org, error) {
var org Org
q := url.Values{}
q.Set("q", "name:"+name)
orgs, err := c.ListOrgsByQuery(q)
if err != nil {
return org, err
}
if len(orgs) == 0 {
return org, fmt.Errorf("Unable to find org %s", name)
}
return orgs[0], nil
}
func (c *Client) GetOrgByGuid(guid string) (Org, error) {
var orgRes OrgResource
r := c.NewRequest("GET", "/v2/organizations/"+guid)
resp, err := c.DoRequest(r)
if err != nil {
return Org{}, err
}
body, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
return Org{}, err
}
err = json.Unmarshal(body, &orgRes)
if err != nil {
return Org{}, err
}
return c.mergeOrgResource(orgRes), nil
}
func (c *Client) OrgSpaces(guid string) ([]Space, error) {
return c.fetchSpaces(fmt.Sprintf("/v2/organizations/%s/spaces", guid))
}
func (o *Org) Summary() (OrgSummary, error) {
var orgSummary OrgSummary
requestURL := fmt.Sprintf("/v2/organizations/%s/summary", o.Guid)
r := o.c.NewRequest("GET", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return OrgSummary{}, errors.Wrap(err, "Error requesting org summary")
}
resBody, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
return OrgSummary{}, errors.Wrap(err, "Error reading org summary body")
}
err = json.Unmarshal(resBody, &orgSummary)
if err != nil {
return OrgSummary{}, errors.Wrap(err, "Error unmarshalling org summary")
}
return orgSummary, nil
}
func (o *Org) Quota() (*OrgQuota, error) {
var orgQuota *OrgQuota
var orgQuotaResource OrgQuotasResource
if o.QuotaDefinitionGuid == "" {
return nil, nil
}
requestURL := fmt.Sprintf("/v2/quota_definitions/%s", o.QuotaDefinitionGuid)
r := o.c.NewRequest("GET", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return &OrgQuota{}, errors.Wrap(err, "Error requesting org quota")
}
resBody, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
return &OrgQuota{}, errors.Wrap(err, "Error reading org quota body")
}
err = json.Unmarshal(resBody, &orgQuotaResource)
if err != nil {
return &OrgQuota{}, errors.Wrap(err, "Error unmarshalling org quota")
}
orgQuota = &orgQuotaResource.Entity
orgQuota.Guid = orgQuotaResource.Meta.Guid
orgQuota.c = o.c
return orgQuota, nil
}
func (c *Client) ListOrgUsersByQuery(orgGUID string, query url.Values) ([]User, error) {
var users []User
requestURL := fmt.Sprintf("/v2/organizations/%s/users?%s", orgGUID, query.Encode())
for {
omResp, err := c.getOrgUserResponse(requestURL)
if err != nil {
return []User{}, err
}
for _, u := range omResp.Resources {
users = append(users, c.mergeUserResource(u))
}
requestURL = omResp.NextURL
if requestURL == "" {
break
}
}
return users, nil
}
func (c *Client) ListOrgUsers(orgGUID string) ([]User, error) {
return c.ListOrgUsersByQuery(orgGUID, nil)
}
func (c *Client) listOrgRolesByQuery(orgGUID, role string, query url.Values) ([]User, error) {
var users []User
requestURL := fmt.Sprintf("/v2/organizations/%s/%s?%s", orgGUID, role, query.Encode())
for {
omResp, err := c.getOrgUserResponse(requestURL)
if err != nil {
return []User{}, err
}
for _, u := range omResp.Resources {
users = append(users, c.mergeUserResource(u))
}
requestURL = omResp.NextURL
if requestURL == "" {
break
}
}
return users, nil
}
func (c *Client) ListOrgManagersByQuery(orgGUID string, query url.Values) ([]User, error) {
return c.listOrgRolesByQuery(orgGUID, "managers", query)
}
func (c *Client) ListOrgManagers(orgGUID string) ([]User, error) {
return c.ListOrgManagersByQuery(orgGUID, nil)
}
func (c *Client) ListOrgAuditorsByQuery(orgGUID string, query url.Values) ([]User, error) {
return c.listOrgRolesByQuery(orgGUID, "auditors", query)
}
func (c *Client) ListOrgAuditors(orgGUID string) ([]User, error) {
return c.ListOrgAuditorsByQuery(orgGUID, nil)
}
func (c *Client) ListOrgBillingManagersByQuery(orgGUID string, query url.Values) ([]User, error) {
return c.listOrgRolesByQuery(orgGUID, "billing_managers", query)
}
func (c *Client) ListOrgBillingManagers(orgGUID string) ([]User, error) {
return c.ListOrgBillingManagersByQuery(orgGUID, nil)
}
func (c *Client) AssociateOrgManager(orgGUID, userGUID string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateManager(userGUID)
}
func (c *Client) AssociateOrgManagerByUsername(orgGUID, name string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateManagerByUsername(name)
}
func (c *Client) AssociateOrgManagerByUsernameAndOrigin(orgGUID, name, origin string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateManagerByUsernameAndOrigin(name, origin)
}
func (c *Client) AssociateOrgUser(orgGUID, userGUID string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateUser(userGUID)
}
func (c *Client) AssociateOrgAuditor(orgGUID, userGUID string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateAuditor(userGUID)
}
func (c *Client) AssociateOrgUserByUsername(orgGUID, name string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateUserByUsername(name)
}
func (c *Client) AssociateOrgUserByUsernameAndOrigin(orgGUID, name, origin string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateUserByUsernameAndOrigin(name, origin)
}
func (c *Client) AssociateOrgAuditorByUsername(orgGUID, name string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateAuditorByUsername(name)
}
func (c *Client) AssociateOrgAuditorByUsernameAndOrigin(orgGUID, name, origin string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateAuditorByUsernameAndOrigin(name, origin)
}
func (c *Client) AssociateOrgBillingManager(orgGUID, userGUID string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateBillingManager(userGUID)
}
func (c *Client) AssociateOrgBillingManagerByUsername(orgGUID, name string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateBillingManagerByUsername(name)
}
func (c *Client) AssociateOrgBillingManagerByUsernameAndOrigin(orgGUID, name, origin string) (Org, error) {
org := Org{Guid: orgGUID, c: c}
return org.AssociateBillingManagerByUsernameAndOrigin(name, origin)
}
func (c *Client) RemoveOrgManager(orgGUID, userGUID string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveManager(userGUID)
}
func (c *Client) RemoveOrgManagerByUsername(orgGUID, name string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveManagerByUsername(name)
}
func (c *Client) RemoveOrgManagerByUsernameAndOrigin(orgGUID, name, origin string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveManagerByUsernameAndOrigin(name, origin)
}
func (c *Client) RemoveOrgUser(orgGUID, userGUID string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveUser(userGUID)
}
func (c *Client) RemoveOrgAuditor(orgGUID, userGUID string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveAuditor(userGUID)
}
func (c *Client) RemoveOrgUserByUsername(orgGUID, name string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveUserByUsername(name)
}
func (c *Client) RemoveOrgUserByUsernameAndOrigin(orgGUID, name, origin string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveUserByUsernameAndOrigin(name, origin)
}
func (c *Client) RemoveOrgAuditorByUsername(orgGUID, name string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveAuditorByUsername(name)
}
func (c *Client) RemoveOrgAuditorByUsernameAndOrigin(orgGUID, name, origin string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveAuditorByUsernameAndOrigin(name, origin)
}
func (c *Client) RemoveOrgBillingManager(orgGUID, userGUID string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveBillingManager(userGUID)
}
func (c *Client) RemoveOrgBillingManagerByUsername(orgGUID, name string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveBillingManagerByUsername(name)
}
func (c *Client) RemoveOrgBillingManagerByUsernameAndOrigin(orgGUID, name, origin string) error {
org := Org{Guid: orgGUID, c: c}
return org.RemoveBillingManagerByUsernameAndOrigin(name, origin)
}
func (c *Client) ListOrgSpaceQuotas(orgGUID string) ([]SpaceQuota, error) {
org := Org{Guid: orgGUID, c: c}
return org.ListSpaceQuotas()
}
func (c *Client) ListOrgPrivateDomains(orgGUID string) ([]Domain, error) {
org := Org{Guid: orgGUID, c: c}
return org.ListPrivateDomains()
}
func (c *Client) ShareOrgPrivateDomain(orgGUID, privateDomainGUID string) (*Domain, error) {
org := Org{Guid: orgGUID, c: c}
return org.SharePrivateDomain(privateDomainGUID)
}
func (c *Client) UnshareOrgPrivateDomain(orgGUID, privateDomainGUID string) error {
org := Org{Guid: orgGUID, c: c}
return org.UnsharePrivateDomain(privateDomainGUID)
}
func (o *Org) ListSpaceQuotas() ([]SpaceQuota, error) {
var spaceQuotas []SpaceQuota
requestURL := fmt.Sprintf("/v2/organizations/%s/space_quota_definitions", o.Guid)
for {
spaceQuotasResp, err := o.c.getSpaceQuotasResponse(requestURL)
if err != nil {
return []SpaceQuota{}, err
}
for _, resource := range spaceQuotasResp.Resources {
spaceQuotas = append(spaceQuotas, *o.c.mergeSpaceQuotaResource(resource))
}
requestURL = spaceQuotasResp.NextUrl
if requestURL == "" {
break
}
}
return spaceQuotas, nil
}
func (o *Org) ListPrivateDomains() ([]Domain, error) {
var domains []Domain
requestURL := fmt.Sprintf("/v2/organizations/%s/private_domains", o.Guid)
for {
domainsResp, err := o.c.getDomainsResponse(requestURL)
if err != nil {
return []Domain{}, err
}
for _, resource := range domainsResp.Resources {
domains = append(domains, *o.c.mergeDomainResource(resource))
}
requestURL = domainsResp.NextUrl
if requestURL == "" {
break
}
}
return domains, nil
}
func (o *Org) SharePrivateDomain(privateDomainGUID string) (*Domain, error) {
requestURL := fmt.Sprintf("/v2/organizations/%s/private_domains/%s", o.Guid, privateDomainGUID)
r := o.c.NewRequest("PUT", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return nil, err
}
if resp.StatusCode != http.StatusCreated {
return nil, errors.Wrapf(err, "Error sharing domain %s for org %s, response code: %d", privateDomainGUID, o.Guid, resp.StatusCode)
}
return o.c.handleDomainResp(resp)
}
func (o *Org) UnsharePrivateDomain(privateDomainGUID string) error {
requestURL := fmt.Sprintf("/v2/organizations/%s/private_domains/%s", o.Guid, privateDomainGUID)
r := o.c.NewRequest("DELETE", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return errors.Wrapf(err, "Error unsharing domain %s for org %s, response code: %d", privateDomainGUID, o.Guid, resp.StatusCode)
}
return nil
}
func (o *Org) associateRole(userGUID, role string) (Org, error) {
requestURL := fmt.Sprintf("/v2/organizations/%s/%s/%s", o.Guid, role, userGUID)
r := o.c.NewRequest("PUT", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return Org{}, err
}
if resp.StatusCode != http.StatusCreated {
return Org{}, errors.Wrapf(err, "Error associating %s %s, response code: %d", role, userGUID, resp.StatusCode)
}
return o.c.handleOrgResp(resp)
}
func (o *Org) associateRoleByUsernameAndOrigin(name, role, origin string) (Org, error) {
requestURL := fmt.Sprintf("/v2/organizations/%s/%s", o.Guid, role)
buf := bytes.NewBuffer(nil)
payload := make(map[string]string)
payload["username"] = name
if origin != "" {
payload["origin"] = origin
}
err := json.NewEncoder(buf).Encode(payload)
if err != nil {
return Org{}, err
}
r := o.c.NewRequestWithBody("PUT", requestURL, buf)
resp, err := o.c.DoRequest(r)
if err != nil {
return Org{}, err
}
if resp.StatusCode != http.StatusCreated {
return Org{}, errors.Wrapf(err, "Error associating %s %s, response code: %d", role, name, resp.StatusCode)
}
return o.c.handleOrgResp(resp)
}
func (o *Org) AssociateManager(userGUID string) (Org, error) {
return o.associateRole(userGUID, "managers")
}
func (o *Org) AssociateManagerByUsername(name string) (Org, error) {
return o.associateRoleByUsernameAndOrigin(name, "managers", "")
}
func (o *Org) AssociateManagerByUsernameAndOrigin(name, origin string) (Org, error) {
return o.associateRoleByUsernameAndOrigin(name, "managers", origin)
}
func (o *Org) AssociateUser(userGUID string) (Org, error) {
requestURL := fmt.Sprintf("/v2/organizations/%s/users/%s", o.Guid, userGUID)
r := o.c.NewRequest("PUT", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return Org{}, err
}
if resp.StatusCode != http.StatusCreated {
return Org{}, errors.Wrapf(err, "Error associating user %s, response code: %d", userGUID, resp.StatusCode)
}
return o.c.handleOrgResp(resp)
}
func (o *Org) AssociateAuditor(userGUID string) (Org, error) {
return o.associateRole(userGUID, "auditors")
}
func (o *Org) AssociateAuditorByUsername(name string) (Org, error) {
return o.associateRoleByUsernameAndOrigin(name, "auditors", "")
}
func (o *Org) AssociateAuditorByUsernameAndOrigin(name, origin string) (Org, error) {
return o.associateRoleByUsernameAndOrigin(name, "auditors", origin)
}
func (o *Org) AssociateBillingManager(userGUID string) (Org, error) {
return o.associateRole(userGUID, "billing_managers")
}
func (o *Org) AssociateBillingManagerByUsername(name string) (Org, error) {
return o.associateRoleByUsernameAndOrigin(name, "billing_managers", "")
}
func (o *Org) AssociateBillingManagerByUsernameAndOrigin(name, origin string) (Org, error) {
return o.associateRoleByUsernameAndOrigin(name, "billing_managers", origin)
}
func (o *Org) AssociateUserByUsername(name string) (Org, error) {
return o.associateUserByUsernameAndOrigin(name, "")
}
func (o *Org) AssociateUserByUsernameAndOrigin(name, origin string) (Org, error) {
return o.associateUserByUsernameAndOrigin(name, origin)
}
func (o *Org) associateUserByUsernameAndOrigin(name, origin string) (Org, error) {
requestURL := fmt.Sprintf("/v2/organizations/%s/users", o.Guid)
buf := bytes.NewBuffer(nil)
payload := make(map[string]string)
payload["username"] = name
if origin != "" {
payload["origin"] = origin
}
err := json.NewEncoder(buf).Encode(payload)
if err != nil {
return Org{}, err
}
r := o.c.NewRequestWithBody("PUT", requestURL, buf)
resp, err := o.c.DoRequest(r)
if err != nil {
return Org{}, err
}
if resp.StatusCode != http.StatusCreated {
return Org{}, errors.Wrapf(err, "Error associating user %s, response code: %d", name, resp.StatusCode)
}
return o.c.handleOrgResp(resp)
}
func (o *Org) removeRole(userGUID, role string) error {
requestURL := fmt.Sprintf("/v2/organizations/%s/%s/%s", o.Guid, role, userGUID)
r := o.c.NewRequest("DELETE", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return errors.Wrapf(err, "Error removing %s %s, response code: %d", role, userGUID, resp.StatusCode)
}
return nil
}
func (o *Org) removeRoleByUsernameAndOrigin(name, role, origin string) error {
var requestURL string
var method string
buf := bytes.NewBuffer(nil)
payload := make(map[string]string)
payload["username"] = name
if origin != "" {
requestURL = fmt.Sprintf("/v2/organizations/%s/%s/remove", o.Guid, role)
method = "POST"
payload["origin"] = origin
} else {
requestURL = fmt.Sprintf("/v2/organizations/%s/%s", o.Guid, role)
method = "DELETE"
}
err := json.NewEncoder(buf).Encode(payload)
if err != nil {
return err
}
r := o.c.NewRequestWithBody(method, requestURL, buf)
resp, err := o.c.DoRequest(r)
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return errors.Wrapf(err, "Error removing manager %s, response code: %d", name, resp.StatusCode)
}
return nil
}
func (o *Org) RemoveManager(userGUID string) error {
return o.removeRole(userGUID, "managers")
}
func (o *Org) RemoveManagerByUsername(name string) error {
return o.removeRoleByUsernameAndOrigin(name, "managers", "")
}
func (o *Org) RemoveManagerByUsernameAndOrigin(name, origin string) error {
return o.removeRoleByUsernameAndOrigin(name, "managers", origin)
}
func (o *Org) RemoveAuditor(userGUID string) error {
return o.removeRole(userGUID, "auditors")
}
func (o *Org) RemoveAuditorByUsername(name string) error {
return o.removeRoleByUsernameAndOrigin(name, "auditors", "")
}
func (o *Org) RemoveAuditorByUsernameAndOrigin(name, origin string) error {
return o.removeRoleByUsernameAndOrigin(name, "auditors", origin)
}
func (o *Org) RemoveBillingManager(userGUID string) error {
return o.removeRole(userGUID, "billing_managers")
}
func (o *Org) RemoveBillingManagerByUsername(name string) error {
return o.removeRoleByUsernameAndOrigin(name, "billing_managers", "")
}
func (o *Org) RemoveBillingManagerByUsernameAndOrigin(name, origin string) error {
return o.removeRoleByUsernameAndOrigin(name, "billing_managers", origin)
}
func (o *Org) RemoveUser(userGUID string) error {
requestURL := fmt.Sprintf("/v2/organizations/%s/users/%s", o.Guid, userGUID)
r := o.c.NewRequest("DELETE", requestURL)
resp, err := o.c.DoRequest(r)
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return errors.Wrapf(err, "Error removing user %s, response code: %d", userGUID, resp.StatusCode)
}
return nil
}
func (o *Org) RemoveUserByUsername(name string) error {
return o.removeUserByUsernameAndOrigin(name, "")
}
func (o *Org) RemoveUserByUsernameAndOrigin(name, origin string) error {
return o.removeUserByUsernameAndOrigin(name, origin)
}
func (o *Org) removeUserByUsernameAndOrigin(name, origin string) error {
var requestURL string
var method string
buf := bytes.NewBuffer(nil)
payload := make(map[string]string)
payload["username"] = name
if origin != "" {
payload["origin"] = origin
requestURL = fmt.Sprintf("/v2/organizations/%s/users/remove", o.Guid)
method = "POST"
} else {
requestURL = fmt.Sprintf("/v2/organizations/%s/users", o.Guid)
method = "DELETE"
}
err := json.NewEncoder(buf).Encode(payload)
if err != nil {
return err
}
r := o.c.NewRequestWithBody(method, requestURL, buf)
resp, err := o.c.DoRequest(r)
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return errors.Wrapf(err, "Error removing user %s, response code: %d", name, resp.StatusCode)
}
return nil
}
func (c *Client) CreateOrg(req OrgRequest) (Org, error) {
buf := bytes.NewBuffer(nil)
err := json.NewEncoder(buf).Encode(req)
if err != nil {
return Org{}, err
}
r := c.NewRequestWithBody("POST", "/v2/organizations", buf)
resp, err := c.DoRequest(r)
if err != nil {
return Org{}, err
}
if resp.StatusCode != http.StatusCreated {
return Org{}, errors.Wrapf(err, "Error creating organization, response code: %d", resp.StatusCode)
}
return c.handleOrgResp(resp)
}
func (c *Client) UpdateOrg(orgGUID string, orgRequest OrgRequest) (Org, error) {
buf := bytes.NewBuffer(nil)
err := json.NewEncoder(buf).Encode(orgRequest)
if err != nil {
return Org{}, err
}
r := c.NewRequestWithBody("PUT", fmt.Sprintf("/v2/organizations/%s", orgGUID), buf)
resp, err := c.DoRequest(r)
if err != nil {
return Org{}, err
}
if resp.StatusCode != http.StatusCreated {
return Org{}, errors.Wrapf(err, "Error updating organization, response code: %d", resp.StatusCode)
}
return c.handleOrgResp(resp)
}
func (c *Client) DeleteOrg(guid string, recursive, async bool) error {
resp, err := c.DoRequest(c.NewRequest("DELETE", fmt.Sprintf("/v2/organizations/%s?recursive=%t&async=%t", guid, recursive, async)))
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return errors.Wrapf(err, "Error deleting organization %s, response code: %d", guid, resp.StatusCode)
}
return nil
}
func (c *Client) getOrgResponse(requestURL string) (OrgResponse, error) {
var orgResp OrgResponse
r := c.NewRequest("GET", requestURL)
resp, err := c.DoRequest(r)
if err != nil {
return OrgResponse{}, errors.Wrap(err, "Error requesting orgs")
}
resBody, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
return OrgResponse{}, errors.Wrap(err, "Error reading org request")
}
err = json.Unmarshal(resBody, &orgResp)
if err != nil {
return OrgResponse{}, errors.Wrap(err, "Error unmarshalling org")
}
return orgResp, nil
}
func (c *Client) fetchOrgs(requestURL string) ([]Org, error) {
var orgs []Org
for {
orgResp, err := c.getOrgResponse(requestURL)
if err != nil {
return []Org{}, err
}
for _, org := range orgResp.Resources {
orgs = append(orgs, c.mergeOrgResource(org))
}
requestURL = orgResp.NextUrl
if requestURL == "" {
break
}
}
return orgs, nil
}
func (c *Client) handleOrgResp(resp *http.Response) (Org, error) {
body, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
return Org{}, err
}
var orgResource OrgResource
err = json.Unmarshal(body, &orgResource)
if err != nil {
return Org{}, err
}
return c.mergeOrgResource(orgResource), nil
}
func (c *Client) getOrgUserResponse(requestURL string) (OrgUserResponse, error) {
var omResp OrgUserResponse
r := c.NewRequest("GET", requestURL)
resp, err := c.DoRequest(r)
if err != nil {
return OrgUserResponse{}, errors.Wrap(err, "error requesting org managers")
}
defer resp.Body.Close()
resBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return OrgUserResponse{}, errors.Wrap(err, "error reading org managers response body")
}
if err := json.Unmarshal(resBody, &omResp); err != nil {
return OrgUserResponse{}, errors.Wrap(err, "error unmarshaling org managers")
}
return omResp, nil
}
func (c *Client) mergeOrgResource(org OrgResource) Org {
org.Entity.Guid = org.Meta.Guid
org.Entity.CreatedAt = org.Meta.CreatedAt
org.Entity.UpdatedAt = org.Meta.UpdatedAt
org.Entity.c = c
return org.Entity
}
func (c *Client) DefaultIsolationSegmentForOrg(orgGUID, isolationSegmentGUID string) error {
return c.updateOrgDefaultIsolationSegment(orgGUID, map[string]interface{}{"guid": isolationSegmentGUID})
}
func (c *Client) ResetDefaultIsolationSegmentForOrg(orgGUID string) error {
return c.updateOrgDefaultIsolationSegment(orgGUID, nil)
}
func (c *Client) updateOrgDefaultIsolationSegment(orgGUID string, data interface{}) error {
requestURL := fmt.Sprintf("/v3/organizations/%s/relationships/default_isolation_segment", orgGUID)
buf := bytes.NewBuffer(nil)
err := json.NewEncoder(buf).Encode(map[string]interface{}{"data": data})
if err != nil {
return err
}
r := c.NewRequestWithBody("PATCH", requestURL, buf)
resp, err := c.DoRequest(r)
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return errors.Wrapf(err, "Error setting default isolation segment for org %s, response code: %d", orgGUID, resp.StatusCode)
}
return nil
}