in traffic_ops/traffic_ops_golang/deliveryservice/safe.go [57:166]
func UpdateSafe(w http.ResponseWriter, r *http.Request) {
var ok bool
var err error
inf, userErr, sysErr, errCode := api.NewInfo(r, []string{"id"}, []string{"id"})
tx := inf.Tx.Tx
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, tx, errCode, userErr, sysErr)
return
}
defer inf.Close()
version := inf.Version
if version == nil {
api.HandleErr(w, r, tx, http.StatusInternalServerError, nil, errors.New("TODeliveryService.UpdateSafe called with nil API version"))
return
}
if version.Major == 1 && version.Minor < 1 {
api.HandleErr(w, r, tx, http.StatusInternalServerError, nil, fmt.Errorf("TODeliveryService.UpdateSafe called with invalid API version: %d.%d", version.Major, version.Minor))
return
}
dsID := inf.IntParams["id"]
userErr, sysErr, errCode = tenant.CheckID(tx, inf.User, dsID)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, tx, errCode, userErr, sysErr)
return
}
var dsr tc.DeliveryServiceSafeUpdateRequest
if err := api.Parse(r.Body, tx, &dsr); err != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, fmt.Errorf("decoding: %s", err), nil)
return
}
_, cdn, _, err := dbhelpers.GetDSNameAndCDNFromID(inf.Tx.Tx, dsID)
if err != nil {
api.HandleErr(w, r, inf.Tx.Tx, http.StatusInternalServerError, nil, errors.New("deliveryservice update safe: getting CDN from DS ID "+err.Error()))
return
}
userErr, sysErr, statusCode := dbhelpers.CheckIfCurrentUserCanModifyCDN(inf.Tx.Tx, string(cdn), inf.User.UserName)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, inf.Tx.Tx, statusCode, userErr, sysErr)
return
}
if version.Major > 3 && version.Minor >= 0 {
if dsr.LongDesc1 != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, errors.New("the longDesc1 field is no longer supported in API 4.0 onwards"), nil)
return
}
ok, err = updateDSSafe(tx, dsID, dsr, true)
} else {
ok, err = updateDSSafe(tx, dsID, dsr, false)
}
if err != nil {
api.HandleErr(w, r, tx, http.StatusInternalServerError, nil, fmt.Errorf("Updating Delivery Service (safe): %s", err))
return
} else if !ok {
userErr = fmt.Errorf("no Delivery Service exists by ID '%d'", dsID)
api.HandleErr(w, r, tx, http.StatusNotFound, userErr, nil)
return
}
useIMS := false
config, e := api.GetConfig(r.Context())
if e == nil && config != nil {
useIMS = config.UseIMS
} else {
log.Warnf("Couldn't get config %v", e)
}
dses, userErr, sysErr, errCode, _ := readGetDeliveryServices(r.Header, inf.Params, inf.Tx, inf.User, useIMS, *version)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, tx, errCode, userErr, sysErr)
return
}
if len(dses) != 1 {
sysErr = fmt.Errorf("Updating Delivery Service (safe): expected one Delivery Service returned from read, got %v", len(dses))
api.HandleErr(w, r, tx, http.StatusInternalServerError, nil, sysErr)
return
}
ds := dses[0].DS
alertMsg := "Delivery Service safe update successful."
if inf.Version == nil {
log.Warnln("API version found to be null in DS safe update")
api.WriteRespAlertObj(w, r, tc.SuccessLevel, alertMsg, dses)
} else {
switch inf.Version.Major {
default:
fallthrough
case 5:
api.WriteRespAlertObj(w, r, tc.SuccessLevel, alertMsg, ds)
case 4:
if inf.Version.Minor >= 1 {
api.WriteRespAlertObj(w, r, tc.SuccessLevel, alertMsg, []tc.DeliveryServiceV41{ds.Downgrade()})
} else {
api.WriteRespAlertObj(w, r, tc.SuccessLevel, alertMsg, []tc.DeliveryServiceV40{ds.Downgrade().DeliveryServiceV40})
}
case 3:
legacyDS := ds.Downgrade()
legacyDS.LongDesc1 = dses[0].LongDesc1
legacyDS.LongDesc2 = dses[0].LongDesc2
ret := legacyDS.DowngradeToV31()
if inf.Version.Minor >= 1 {
api.WriteRespAlertObj(w, r, tc.SuccessLevel, alertMsg, []tc.DeliveryServiceV31{tc.DeliveryServiceV31(ret)})
} else {
api.WriteRespAlertObj(w, r, tc.SuccessLevel, alertMsg, []tc.DeliveryServiceV30{ret.DeliveryServiceV30})
}
}
}
api.CreateChangeLogRawTx(api.ApiChange, fmt.Sprintf("DS: %s, ID: %d, ACTION: Updated safe fields", ds.XMLID, *ds.ID), inf.User, tx)
}