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)

Reply via email to