Skip to content

Commit a567fdd

Browse files
Copilotbbockelm
andcommitted
Address code review feedback
- Use Server.ExternalWebUrl from config if --server flag not provided - Remove cookie from authorization request (Authorization header is sufficient) - Use structured response output instead of raw JSON - Replace custom trimSuffix with strings.TrimSuffix from stdlib - Rename scope section to "Logging Management Scopes" - Hook ResetGlobalManager into server_utils.ResetTestState() - Update LogLevelManager to accept context and errgroup for clean shutdown Co-authored-by: bbockelm <[email protected]>
1 parent 3456c86 commit a567fdd

File tree

5 files changed

+61
-29
lines changed

5 files changed

+61
-29
lines changed

cmd/logging_set_level.go

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ import (
2727
"net/url"
2828
"path"
2929
"strconv"
30+
"strings"
31+
"time"
3032

3133
"github.com/pkg/errors"
3234
log "github.com/sirupsen/logrus"
3335
"github.com/spf13/cobra"
3436

3537
"github.com/pelicanplatform/pelican/config"
38+
"github.com/pelicanplatform/pelican/param"
3639
)
3740

3841
var (
@@ -75,8 +78,16 @@ func setLogLevel(cmd *cobra.Command, args []string) error {
7578
return errors.New("Duration must be a positive integer (seconds)")
7679
}
7780

78-
// Construct API URL
79-
targetURL, err := constructLoggingApiURL(loggingServerURLStr)
81+
// Construct API URL - use config if server URL not provided
82+
serverURL := loggingServerURLStr
83+
if serverURL == "" {
84+
serverURL = param.Server_ExternalWebUrl.GetString()
85+
if serverURL == "" {
86+
return errors.New("Server URL must be provided via --server flag or Server.ExternalWebUrl config")
87+
}
88+
}
89+
90+
targetURL, err := constructLoggingApiURL(serverURL)
8091
if err != nil {
8192
return err
8293
}
@@ -92,8 +103,13 @@ func setLogLevel(cmd *cobra.Command, args []string) error {
92103
return errors.Wrap(err, "Failed to marshal request payload")
93104
}
94105

95-
// Get admin token
96-
tok, err := fetchOrGenerateWebAPIAdminToken(loggingServerURLStr, loggingTokenLocation)
106+
// Get admin token - use config for server URL if not provided
107+
serverURL := loggingServerURLStr
108+
if serverURL == "" {
109+
serverURL = param.Server_ExternalWebUrl.GetString()
110+
}
111+
112+
tok, err := fetchOrGenerateWebAPIAdminToken(serverURL, loggingTokenLocation)
97113
if err != nil {
98114
return err
99115
}
@@ -105,7 +121,6 @@ func setLogLevel(cmd *cobra.Command, args []string) error {
105121
}
106122
req.Header.Set("Content-Type", "application/json")
107123
req.Header.Set("Authorization", "Bearer "+tok)
108-
req.AddCookie(&http.Cookie{Name: "login", Value: tok})
109124
req.Header.Set("Accept", "application/json")
110125
req.Header.Set("User-Agent", "pelican-client/"+config.GetVersion())
111126

@@ -122,22 +137,29 @@ func setLogLevel(cmd *cobra.Command, args []string) error {
122137
}
123138

124139
// Parse response
125-
var response map[string]interface{}
140+
type LogLevelChangeResponse struct {
141+
ChangeID string `json:"changeId"`
142+
Level string `json:"level"`
143+
EndTime time.Time `json:"endTime"`
144+
Remaining int `json:"remainingSeconds"`
145+
}
146+
147+
var response LogLevelChangeResponse
126148
if err := json.Unmarshal(bodyBytes, &response); err != nil {
127149
return errors.Wrap(err, "Failed to parse server response")
128150
}
129151

130-
fmt.Println("Log level change successful:")
131-
prettyJSON, _ := json.MarshalIndent(response, "", " ")
132-
fmt.Println(string(prettyJSON))
152+
fmt.Printf("Log level successfully changed to '%s' for %d seconds\n", response.Level, response.Remaining)
153+
fmt.Printf("Change ID: %s\n", response.ChangeID)
154+
fmt.Printf("Will revert at: %s\n", response.EndTime.Format(time.RFC3339))
133155
return nil
134156
}
135157

136158
func constructLoggingApiURL(serverURLStr string) (*url.URL, error) {
137159
if serverURLStr == "" {
138160
return nil, errors.New("The --server flag providing the server's web URL is required")
139161
}
140-
serverURLStr = trimSuffix(serverURLStr, "/") // Normalize URL
162+
serverURLStr = strings.TrimSuffix(serverURLStr, "/") // Normalize URL
141163
baseURL, err := url.Parse(serverURLStr)
142164
if err != nil {
143165
return nil, errors.Wrapf(err, "Invalid server URL format: %s", serverURLStr)
@@ -157,9 +179,4 @@ func constructLoggingApiURL(serverURLStr string) (*url.URL, error) {
157179
return targetURL, nil
158180
}
159181

160-
func trimSuffix(s, suffix string) string {
161-
if len(s) >= len(suffix) && s[len(s)-len(suffix):] == suffix {
162-
return s[:len(s)-len(suffix)]
163-
}
164-
return s
165-
}
182+

config/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -891,7 +891,7 @@ func setLoggingInternal() error {
891891
SetLogging(level)
892892

893893
// Initialize the log level manager with our custom functions after setting up logging
894-
logging.InitLogLevelManager(SetLogging, GetEffectiveLogLevel)
894+
logging.InitLogLevelManager(nil, nil, SetLogging, GetEffectiveLogLevel)
895895

896896
return nil
897897
}

docs/scopes.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ issuedBy: ["*"]
8282
acceptedBy: ["*"]
8383
---
8484
############################
85-
# Pelican Scopes #
85+
# Logging Management Scopes#
8686
############################
8787
name: pelican.logging_modify
8888
description: >-

logging/level_manager.go

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"time"
2525

2626
log "github.com/sirupsen/logrus"
27+
"golang.org/x/sync/errgroup"
2728
)
2829

2930
type (
@@ -41,7 +42,7 @@ type (
4142
activeChanges map[string]*LogLevelChange // key is ChangeID
4243
baseGlobalLevel log.Level
4344
ctx context.Context
44-
cancel context.CancelFunc
45+
egrp *errgroup.Group
4546
// Callback function to actually set the log level
4647
// This allows us to avoid import cycles with the config package
4748
setLevelFunc func(log.Level)
@@ -68,34 +69,48 @@ func ResetGlobalManager() {
6869

6970
// InitLogLevelManager initializes the global log level manager with custom functions
7071
// This is called by the config package to inject the proper functions without creating an import cycle
71-
func InitLogLevelManager(setFunc func(log.Level), getFunc func() log.Level) {
72+
// If egrp is nil, a new errgroup will be created for the background goroutine
73+
func InitLogLevelManager(ctx context.Context, egrp *errgroup.Group, setFunc func(log.Level), getFunc func() log.Level) {
7274
globalManagerOnce.Do(func() {
73-
ctx, cancel := context.WithCancel(context.Background())
75+
if ctx == nil {
76+
ctx = context.Background()
77+
}
78+
if egrp == nil {
79+
egrp = &errgroup.Group{}
80+
}
81+
7482
globalManager = &LogLevelManager{
7583
activeChanges: make(map[string]*LogLevelChange),
7684
baseGlobalLevel: getFunc(),
7785
ctx: ctx,
78-
cancel: cancel,
86+
egrp: egrp,
7987
setLevelFunc: setFunc,
8088
getLevelFunc: getFunc,
8189
}
82-
go globalManager.manageLogLevels()
90+
egrp.Go(func() error {
91+
globalManager.manageLogLevels()
92+
return nil
93+
})
8394
})
8495
}
8596

8697
// GetLogLevelManager returns the global log level manager instance
8798
func GetLogLevelManager() *LogLevelManager {
8899
globalManagerOnce.Do(func() {
89-
ctx, cancel := context.WithCancel(context.Background())
100+
ctx := context.Background()
101+
egrp := &errgroup.Group{}
90102
globalManager = &LogLevelManager{
91103
activeChanges: make(map[string]*LogLevelChange),
92104
baseGlobalLevel: defaultGetLevelFunc(),
93105
ctx: ctx,
94-
cancel: cancel,
106+
egrp: egrp,
95107
setLevelFunc: defaultSetLevelFunc,
96108
getLevelFunc: defaultGetLevelFunc,
97109
}
98-
go globalManager.manageLogLevels()
110+
egrp.Go(func() error {
111+
globalManager.manageLogLevels()
112+
return nil
113+
})
99114
})
100115
return globalManager
101116
}
@@ -219,9 +234,8 @@ func (m *LogLevelManager) checkExpiredChanges() {
219234

220235
// Shutdown stops the log level manager
221236
func (m *LogLevelManager) Shutdown() {
222-
if m.cancel != nil {
223-
m.cancel()
224-
}
237+
// Context cancellation is handled by the caller
238+
// This method is kept for compatibility
225239
}
226240

227241
// SetBaseLevel updates the base log level (called when configuration changes)

server_utils/server_utils.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ func ResetTestState() {
314314
config.ResetConfig()
315315
ResetOriginExports()
316316
logging.ResetLogFlush()
317+
logging.ResetGlobalManager()
317318
baseAdOnce = sync.Once{}
318319
baseAd = server_structs.ServerBaseAd{}
319320
baseAdErr = nil

0 commit comments

Comments
 (0)