blob: 9b509ca6b25f644f77fe044f455835883e58fb62 [file] [log] [blame]
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package client
import (
"encoding/json"
"errors"
"fmt"
"net/http"
"strconv"
"github.com/apache/trafficcontrol/lib/go-tc"
)
func (to *Session) Federations() ([]tc.AllDeliveryServiceFederationsMapping, ReqInf, error) {
type FederationResponse struct {
Response []tc.AllDeliveryServiceFederationsMapping `json:"response"`
}
data := FederationResponse{}
inf, err := get(to, apiBase+"/federations", &data)
return data.Response, inf, err
}
func (to *Session) AllFederations() ([]tc.AllDeliveryServiceFederationsMapping, ReqInf, error) {
type FederationResponse struct {
Response []tc.AllDeliveryServiceFederationsMapping `json:"response"`
}
data := FederationResponse{}
inf, err := get(to, apiBase+"/federations/all", &data)
return data.Response, inf, err
}
func (to *Session) AllFederationsForCDN(cdnName string) ([]tc.AllDeliveryServiceFederationsMapping, ReqInf, error) {
// because the Federations JSON array is heterogeneous (array members may be a AllFederation or AllFederationCDN), we have to try decoding each separately.
type FederationResponse struct {
Response []json.RawMessage `json:"response"`
}
data := FederationResponse{}
inf, err := get(to, apiBase+"/federations/all?cdnName="+cdnName, &data)
if err != nil {
return nil, inf, err
}
feds := []tc.AllDeliveryServiceFederationsMapping{}
for _, raw := range data.Response {
fed := tc.AllDeliveryServiceFederationsMapping{}
if err := json.Unmarshal([]byte(raw), &fed); err != nil {
// we don't actually need the CDN, but we want to return an error if we got something unexpected
cdnFed := tc.AllFederationCDN{}
if err := json.Unmarshal([]byte(raw), &cdnFed); err != nil {
return nil, inf, errors.New("Traffic Ops returned an unexpected object: '" + string(raw) + "'")
}
}
feds = append(feds, fed)
}
return feds, inf, nil
}
func (to *Session) CreateFederationDeliveryServices(federationID int, deliveryServiceIDs []int, replace bool) (ReqInf, error) {
req := tc.FederationDSPost{DSIDs: deliveryServiceIDs, Replace: &replace}
jsonReq, err := json.Marshal(req)
if err != nil {
return ReqInf{CacheHitStatus: CacheHitStatusMiss}, err
}
resp := map[string]interface{}{}
inf, err := makeReq(to, http.MethodPost, apiBase+`/federations/`+strconv.Itoa(federationID)+`/deliveryservices`, jsonReq, &resp)
return inf, err
}
// GetFederationDeliveryServices Returns a given Federation's Delivery Services
func (to *Session) GetFederationDeliveryServices(federationID int) ([]tc.FederationDeliveryServiceNullable, ReqInf, error) {
type FederationDSesResponse struct {
Response []tc.FederationDeliveryServiceNullable `json:"response"`
}
data := FederationDSesResponse{}
inf, err := get(to, fmt.Sprintf("%s/federations/%v/deliveryservices", apiBase, federationID), &data)
return data.Response, inf, err
}
// DeleteFederationDeliveryService Deletes a given Delivery Service from a Federation
func (to *Session) DeleteFederationDeliveryService(federationID, deliveryServiceID int) (tc.Alerts, ReqInf, error) {
route := fmt.Sprintf("%s/federations/%v/deliveryservices/%v", apiBase, federationID, deliveryServiceID)
resp, remoteAddr, err := to.request(http.MethodDelete, route, nil)
reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
if err != nil {
return tc.Alerts{}, reqInf, err
}
defer resp.Body.Close()
var alerts tc.Alerts
if err = json.NewDecoder(resp.Body).Decode(&alerts); err != nil {
return tc.Alerts{}, reqInf, err
}
return alerts, reqInf, nil
}
// GetFederationUsers Associates the given Users' IDs to a Federation
func (to *Session) CreateFederationUsers(federationID int, userIDs []int, replace bool) (tc.Alerts, ReqInf, error) {
req := tc.FederationUserPost{IDs: userIDs, Replace: &replace}
jsonReq, err := json.Marshal(req)
if err != nil {
return tc.Alerts{}, ReqInf{CacheHitStatus: CacheHitStatusMiss}, err
}
var alerts tc.Alerts
inf, err := makeReq(to, http.MethodPost, fmt.Sprintf("%s/federations/%v/users", apiBase, federationID), jsonReq, &alerts)
return alerts, inf, err
}
// GetFederationUsers Returns a given Federation's Users
func (to *Session) GetFederationUsers(federationID int) ([]tc.FederationUser, ReqInf, error) {
type FederationUsersResponse struct {
Response []tc.FederationUser `json:"response"`
}
data := FederationUsersResponse{}
inf, err := get(to, fmt.Sprintf("%s/federations/%v/users", apiBase, federationID), &data)
return data.Response, inf, err
}
// DeleteFederationUser Deletes a given User from a Federation
func (to *Session) DeleteFederationUser(federationID, userID int) (tc.Alerts, ReqInf, error) {
route := fmt.Sprintf("%s/federations/%v/users/%v", apiBase, federationID, userID)
resp, remoteAddr, err := to.request(http.MethodDelete, route, nil)
reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss, RemoteAddr: remoteAddr}
if err != nil {
return tc.Alerts{}, reqInf, err
}
defer resp.Body.Close()
var alerts tc.Alerts
if err = json.NewDecoder(resp.Body).Decode(&alerts); err != nil {
return tc.Alerts{}, reqInf, err
}
return alerts, reqInf, nil
}
// AddFederationResolverMappingsForCurrentUser adds Federation Resolver mappings to one or more
// Delivery Services for the current user.
func (to *Session) AddFederationResolverMappingsForCurrentUser(mappings tc.DeliveryServiceFederationResolverMappingRequest) (tc.Alerts, ReqInf, error) {
reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss}
var alerts tc.Alerts
bts, err := json.Marshal(mappings)
if err != nil {
return alerts, reqInf, err
}
resp, remoteAddr, err := to.request(http.MethodPost, apiBase+"/federations", bts)
reqInf.RemoteAddr = remoteAddr
if err != nil {
return alerts, reqInf, err
}
defer resp.Body.Close()
err = json.NewDecoder(resp.Body).Decode(&alerts)
return alerts, reqInf, err
}
// DeleteFederationResolverMappingsForCurrentUser removes ALL Federation Resolver mappings for ALL
// Federations assigned to the currently authenticated user, as well as deleting ALL of the
// Federation Resolvers themselves.
func (to *Session) DeleteFederationResolverMappingsForCurrentUser() (tc.Alerts, ReqInf, error) {
reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss}
var alerts tc.Alerts
resp, remoteAddr, err := to.request(http.MethodDelete, apiBase+"/federations", nil)
reqInf.RemoteAddr = remoteAddr
if err != nil {
return alerts, reqInf, err
}
defer resp.Body.Close()
err = json.NewDecoder(resp.Body).Decode(&alerts)
return alerts, reqInf, err
}
// ReplaceFederationResolverMappingsForCurrentUser replaces any and all Federation Resolver mappings
// on all Federations assigned to the currently authenticated user. This will first remove ALL
// Federation Resolver mappings for ALL Federations assigned to the currently authenticated user, as
// well as deleting ALL of the Federation Resolvers themselves. In other words, calling this is
// equivalent to a call to DeleteFederationResolverMappingsForCurrentUser followed by a call to
// AddFederationResolverMappingsForCurrentUser .
func (to *Session) ReplaceFederationResolverMappingsForCurrentUser(mappings tc.DeliveryServiceFederationResolverMappingRequest) (tc.Alerts, ReqInf, error) {
reqInf := ReqInf{CacheHitStatus: CacheHitStatusMiss}
var alerts tc.Alerts
bts, err := json.Marshal(mappings)
if err != nil {
return alerts, reqInf, err
}
resp, remoteAddr, err := to.request(http.MethodPut, apiBase+"/federations", bts)
reqInf.RemoteAddr = remoteAddr
if err != nil {
return alerts, reqInf, err
}
defer resp.Body.Close()
err = json.NewDecoder(resp.Body).Decode(&alerts)
return alerts, reqInf, err
}