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  }