This is an automated email from the ASF dual-hosted git repository.
ocket8888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new 673d0f2401 Fix server not appearing after updating its profile (#6857)
673d0f2401 is described below
commit 673d0f2401b74d883b792136d9f3c00766dc90fb
Author: Eric Holguin <[email protected]>
AuthorDate: Thu Jun 2 09:38:05 2022 -0600
Fix server not appearing after updating its profile (#6857)
* move update profiles after all checks
* fix the nil server issue for v2 and v3
* add back query count that merge removed
---
.../traffic_ops_golang/dbhelpers/db_helpers.go | 19 ++-----
traffic_ops/traffic_ops_golang/server/servers.go | 61 +++++++++++++++-------
2 files changed, 46 insertions(+), 34 deletions(-)
diff --git a/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
b/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
index feaf30c07b..d4c34ef63b 100644
--- a/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
+++ b/traffic_ops/traffic_ops_golang/dbhelpers/db_helpers.go
@@ -2124,27 +2124,18 @@ func UpdateServerProfilesForV4(id int, profile
[]string, tx *sql.Tx) error {
}
// UpdateServerProfileTableForV2V3 updates CommonServerPropertiesV40 struct
and server_profile table via Update (server) function for API v2/v3.
-func UpdateServerProfileTableForV2V3(id *int, newProfileId *int, origProfile
string, tx *sql.Tx) ([]string, error) {
- var profileName []string
-
- var newProfile string
- err := tx.QueryRow("SELECT name from profile where id = $1",
*newProfileId).Scan(&newProfile)
+func UpdateServerProfileTableForV2V3(id *int, newProfileId *int, origProfile
string, tx *sql.Tx) error {
+ newProfile, _, err := GetProfileNameFromID(*newProfileId, tx)
if err != nil && err != sql.ErrNoRows {
- return nil, fmt.Errorf("selecting profile by name: %w", err)
+ return fmt.Errorf("selecting profile by name: %w", err)
}
query := `UPDATE server_profile SET profile_name=$1 WHERE server=$2 AND
profile_name=$3`
_, err = tx.Exec(query, newProfile, *id, origProfile)
if err != nil {
- return nil, fmt.Errorf("updating server_profile by
profile_name: %w", err)
- }
-
- err = tx.QueryRow("SELECT ARRAY_AGG(profile_name) FROM server_profile
WHERE server=$1", *id).Scan(pq.Array(&profileName))
- if err == sql.ErrNoRows {
- return nil, fmt.Errorf("selecting server_profile by
profile_name: %w", err)
+ return fmt.Errorf("updating server_profile by profile_name:
%w", err)
}
-
- return profileName, nil
+ return nil
}
// GetServerDetailFromV4 function converts server details from V4 to V3/V2
diff --git a/traffic_ops/traffic_ops_golang/server/servers.go
b/traffic_ops/traffic_ops_golang/server/servers.go
index 4637981d98..c18a7b7764 100644
--- a/traffic_ops/traffic_ops_golang/server/servers.go
+++ b/traffic_ops/traffic_ops_golang/server/servers.go
@@ -1002,7 +1002,6 @@ func getServers(h http.Header, params map[string]string,
tx *sqlx.Tx, user *auth
countQueryString = serverCountQuery + joinProfileV4
}
}
-
countQuery := countQueryString + queryAddition + where
// If we are querying for a DS that has reqd capabilities, we need to
make sure that we also include all the ORG servers directly assigned to this DS
if _, ok := params["dsId"]; ok && dsHasRequiredCapabilities {
@@ -1499,10 +1498,13 @@ func Update(w http.ResponseWriter, r *http.Request) {
originalStatusID := *original.StatusID
var server tc.ServerV40
+ var serverV3 tc.ServerV30
+ var legacyServer tc.ServerNullableV2
var statusLastUpdatedTime time.Time
- server.ID = new(int)
- *server.ID = inf.IntParams["id"]
+
if inf.Version.Major >= 4 {
+ server.ID = new(int)
+ *server.ID = inf.IntParams["id"]
if err := json.NewDecoder(r.Body).Decode(&server); err != nil {
api.HandleErr(w, r, tx, http.StatusBadRequest, err, nil)
return
@@ -1524,13 +1526,7 @@ func Update(w http.ResponseWriter, r *http.Request) {
api.HandleErr(w, r, tx, errCode, userErr, sysErr)
return
}
- if err := dbhelpers.UpdateServerProfilesForV4(*server.ID,
server.ProfileNames, tx); err != nil {
- userErr, sysErr, errCode := api.ParseDBError(err)
- api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
- return
- }
} else if inf.Version.Major >= 3 {
- var serverV3 tc.ServerV30
serverV3.ID = new(int)
*serverV3.ID = inf.IntParams["id"]
if err := json.NewDecoder(r.Body).Decode(&serverV3); err != nil
{
@@ -1554,22 +1550,25 @@ func Update(w http.ResponseWriter, r *http.Request) {
api.HandleErr(w, r, tx, code, userErr, sysErr)
return
}
- profileName, err :=
dbhelpers.UpdateServerProfileTableForV2V3(serverV3.ID, serverV3.ProfileID,
(original.ProfileNames)[0], tx)
+
+ profileName, exists, err :=
dbhelpers.GetProfileNameFromID(*serverV3.ProfileID, tx)
if err != nil {
- api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, fmt.Errorf("failed to update server_profile: %w", err))
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, err)
return
}
- if len(profileName) > 1 {
- profileName = []string{profileName[0]}
+ if !exists {
+ api.HandleErr(w, r, tx, http.StatusNotFound,
errors.New("profile does not exist"), nil)
+ return
}
- server, err = serverV3.UpgradeToV40(profileName)
+ profileNames := []string{profileName}
+
+ server, err = serverV3.UpgradeToV40(profileNames)
if err != nil {
sysErr = fmt.Errorf("error upgrading valid V3 server to
V4 structure: %v", err)
api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, sysErr)
return
}
} else {
- var legacyServer tc.ServerNullableV2
legacyServer.ID = new(int)
*legacyServer.ID = inf.IntParams["id"]
if err := json.NewDecoder(r.Body).Decode(&legacyServer); err !=
nil {
@@ -1585,15 +1584,19 @@ func Update(w http.ResponseWriter, r *http.Request) {
api.HandleErr(w, r, tx, code, userErr, sysErr)
return
}
- profileName, err :=
dbhelpers.UpdateServerProfileTableForV2V3(legacyServer.ID,
legacyServer.ProfileID, (original.ProfileNames)[0], tx)
+
+ profileName, exists, err :=
dbhelpers.GetProfileNameFromID(*legacyServer.ProfileID, tx)
if err != nil {
- api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, fmt.Errorf("failed to update server_profile: %w", err))
+ api.HandleErr(w, r, inf.Tx.Tx,
http.StatusInternalServerError, nil, err)
return
}
- if len(profileName) > 1 {
- profileName = []string{profileName[0]}
+ if !exists {
+ api.HandleErr(w, r, inf.Tx.Tx, http.StatusNotFound,
errors.New("profile does not exist"), nil)
+ return
}
- server, err = legacyServer.UpgradeToV40(profileName)
+ profileNames := []string{profileName}
+
+ server, err = legacyServer.UpgradeToV40(profileNames)
if err != nil {
sysErr = fmt.Errorf("error upgrading valid V2 server to
V3 structure: %v", err)
api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, sysErr)
@@ -1681,6 +1684,24 @@ func Update(w http.ResponseWriter, r *http.Request) {
}
}
+ if inf.Version.Major >= 4 {
+ if err = dbhelpers.UpdateServerProfilesForV4(*server.ID,
server.ProfileNames, tx); err != nil {
+ userErr, sysErr, errCode := api.ParseDBError(err)
+ api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)
+ return
+ }
+ } else if inf.Version.Major >= 3 {
+ if err = dbhelpers.UpdateServerProfileTableForV2V3(serverV3.ID,
serverV3.ProfileID, (original.ProfileNames)[0], tx); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, fmt.Errorf("failed to update server_profile: %w", err))
+ return
+ }
+ } else {
+ if err =
dbhelpers.UpdateServerProfileTableForV2V3(legacyServer.ID,
legacyServer.ProfileID, (original.ProfileNames)[0], tx); err != nil {
+ api.HandleErr(w, r, tx, http.StatusInternalServerError,
nil, fmt.Errorf("failed to update server_profile: %w", err))
+ return
+ }
+ }
+
serverID, errCode, userErr, sysErr := updateServer(inf.Tx, server)
if userErr != nil || sysErr != nil {
api.HandleErr(w, r, inf.Tx.Tx, errCode, userErr, sysErr)