github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/logging.go (about) 1 package v7action 2 3 import ( 4 "context" 5 "errors" 6 "strings" 7 "time" 8 9 "code.cloudfoundry.org/cli/actor/sharedaction" 10 "github.com/SermoDigital/jose/jws" 11 ) 12 13 func (actor Actor) GetStreamingLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client sharedaction.LogCacheClient) (<-chan sharedaction.LogMessage, <-chan error, context.CancelFunc, Warnings, error) { 14 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 15 if err != nil { 16 return nil, nil, nil, allWarnings, err 17 } 18 19 messages, logErrs, cancelFunc := sharedaction.GetStreamingLogs(app.GUID, client) 20 21 return messages, logErrs, cancelFunc, allWarnings, err 22 } 23 24 func (actor Actor) GetRecentLogsForApplicationByNameAndSpace(appName string, spaceGUID string, client sharedaction.LogCacheClient) ([]sharedaction.LogMessage, Warnings, error) { 25 app, allWarnings, err := actor.GetApplicationByNameAndSpace(appName, spaceGUID) 26 if err != nil { 27 return nil, allWarnings, err 28 } 29 30 logCacheMessages, err := sharedaction.GetRecentLogs(app.GUID, client) 31 if err != nil { 32 return nil, allWarnings, err 33 } 34 35 var logMessages []sharedaction.LogMessage 36 37 for _, message := range logCacheMessages { 38 logMessages = append(logMessages, *sharedaction.NewLogMessage( 39 message.Message(), 40 message.Type(), 41 message.Timestamp(), 42 message.SourceType(), 43 message.SourceInstance(), 44 )) 45 } 46 47 return logMessages, allWarnings, nil 48 } 49 50 func (actor Actor) ScheduleTokenRefresh() (chan bool, error) { 51 accessTokenString, err := actor.RefreshAccessToken() 52 if err != nil { 53 return nil, err 54 } 55 accessTokenString = strings.TrimPrefix(accessTokenString, "bearer ") 56 token, err := jws.ParseJWT([]byte(accessTokenString)) 57 if err != nil { 58 return nil, err 59 } 60 61 var expiresIn time.Duration 62 expiration, ok := token.Claims().Expiration() 63 if ok { 64 expiresIn = time.Until(expiration) 65 66 // When we refresh exactly every EXPIRY_DURATION nanoseconds usually the auth token 67 // ends up expiring on the log-cache client. Better to refresh a little more often 68 // to avoid log outage 69 expiresIn = expiresIn * 9 / 10 70 } else { 71 return nil, errors.New("Failed to get an expiry time from the current access token") 72 } 73 quitNowChannel := make(chan bool, 1) 74 75 go func() { 76 ticker := time.NewTicker(expiresIn) 77 defer ticker.Stop() 78 for { 79 select { 80 case <-ticker.C: 81 _, err := actor.RefreshAccessToken() 82 if err != nil { 83 panic(err) 84 } 85 case <-quitNowChannel: 86 return 87 } 88 } 89 }() 90 91 return quitNowChannel, nil 92 }