github.com/Axway/agent-sdk@v1.1.101/pkg/transaction/util/util.go (about)

     1  package util
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"strings"
     7  
     8  	"github.com/Axway/agent-sdk/pkg/agent/cache"
     9  	v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1"
    10  	catalog "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/catalog/v1alpha1"
    11  	management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1"
    12  	"github.com/Axway/agent-sdk/pkg/transaction/models"
    13  	"github.com/Axway/agent-sdk/pkg/util/log"
    14  )
    15  
    16  const (
    17  	unknown = "unknown"
    18  	// SummaryEventProxyIDPrefix - Prefix for proxyID in summary event
    19  	SummaryEventProxyIDPrefix = "remoteApiId_"
    20  
    21  	// SummaryEventApplicationIDPrefix - Prefix for application.ID in summary event
    22  	SummaryEventApplicationIDPrefix = "remoteAppId_"
    23  )
    24  
    25  // GetAccessRequest -
    26  func GetAccessRequest(cacheManager cache.Manager, managedApp *v1.ResourceInstance, apiID, stage, version string) *management.AccessRequest {
    27  	if managedApp == nil {
    28  		return nil
    29  	}
    30  
    31  	// Lookup Access Request
    32  	apiID = strings.TrimPrefix(apiID, "remoteApiId_")
    33  	accessReq := &management.AccessRequest{}
    34  	ri := cacheManager.GetAccessRequestByAppAndAPIStageVersion(managedApp.Name, apiID, stage, version)
    35  	if ri == nil {
    36  		return nil
    37  	}
    38  	accessReq.FromInstance(ri)
    39  	return accessReq
    40  }
    41  
    42  // GetSubscriptionID -
    43  func GetSubscriptionID(subscription *v1.ResourceInstance) string {
    44  	if subscription == nil {
    45  		return unknown
    46  	}
    47  	return subscription.Metadata.ID
    48  }
    49  
    50  // GetConsumerOrgID -
    51  func GetConsumerOrgID(ri *v1.ResourceInstance) string {
    52  	if ri == nil {
    53  		return ""
    54  	}
    55  
    56  	// Lookup Subscription
    57  	app := &management.ManagedApplication{}
    58  	app.FromInstance(ri)
    59  
    60  	if app.Marketplace.Resource.Owner != nil {
    61  		return app.Marketplace.Resource.Owner.Organization.ID
    62  	}
    63  	return ""
    64  }
    65  
    66  // GetConsumerApplication -
    67  func GetConsumerApplication(ri *v1.ResourceInstance) (string, string) {
    68  	if ri == nil {
    69  		return "", ""
    70  	}
    71  
    72  	for _, ref := range ri.Metadata.References {
    73  		// get the ID of the Catalog Application
    74  		if ref.Kind == catalog.ApplicationGVK().Kind {
    75  			return ref.ID, ref.Name
    76  		}
    77  	}
    78  
    79  	return ri.Metadata.ID, ri.Name // default to the managed app id
    80  }
    81  
    82  // IsHTTPSuccessStatus - Returns true if the HTTP status is between 200 and 400
    83  func IsHTTPSuccessStatus(status int) bool {
    84  	return status >= http.StatusOK && status < http.StatusBadRequest
    85  }
    86  
    87  // IsSuccessStatus - Returns true if the HTTP status is between 200 and 400
    88  func IsSuccessStatus(status int) bool {
    89  	// DEPRECATED
    90  	log.DeprecationWarningReplace("IsSuccessStatus", "IsHTTPSuccessStatus")
    91  	return IsHTTPSuccessStatus(status)
    92  }
    93  
    94  // IsHTTPFailureStatus - Returns true if the HTTP status is between 400 and 500
    95  func IsHTTPFailureStatus(status int) bool {
    96  	return status >= http.StatusBadRequest && status < http.StatusInternalServerError
    97  }
    98  
    99  // IsFailureStatus - Returns true if the HTTP status is between 400 and 500
   100  func IsFailureStatus(status int) bool {
   101  	// DEPRECATED
   102  	log.DeprecationWarningReplace("IsFailureStatus", "IsHTTPFailureStatus")
   103  	return IsHTTPFailureStatus(status)
   104  }
   105  
   106  // IsHTTPExceptionStatus - Returns true if the HTTP status is between 500 and 511
   107  func IsHTTPExceptionStatus(status int) bool {
   108  	return status >= http.StatusInternalServerError && status <= http.StatusNetworkAuthenticationRequired
   109  }
   110  
   111  // IsExceptionStatus - Returns true if the HTTP status is between 500 and 511
   112  func IsExceptionStatus(status int) bool {
   113  	// DEPRECATED
   114  	log.DeprecationWarningReplace("IsExceptionStatus", "IsHTTPExceptionStatus")
   115  	return IsHTTPExceptionStatus(status)
   116  }
   117  
   118  // GetTransactionSummaryStatus - Returns the summary status based on HTTP status code.
   119  func GetTransactionSummaryStatus(status int) string {
   120  	transSummaryStatus := "Unknown"
   121  	if IsHTTPSuccessStatus(status) {
   122  		transSummaryStatus = "Success"
   123  	} else if IsHTTPFailureStatus(status) {
   124  		transSummaryStatus = "Failure"
   125  	} else if IsHTTPExceptionStatus(status) {
   126  		transSummaryStatus = "Exception"
   127  	}
   128  	return transSummaryStatus
   129  }
   130  
   131  // GetTransactionEventStatus - Returns the transaction event status based on HTTP status code.
   132  func GetTransactionEventStatus(status int) string {
   133  	transStatus := "Fail"
   134  	if IsHTTPSuccessStatus(status) {
   135  		transStatus = "Pass"
   136  	}
   137  	return transStatus
   138  }
   139  
   140  // MarshalHeadersAsJSONString - Serializes the header key/values in map as JSON string
   141  func MarshalHeadersAsJSONString(headers map[string]string) string {
   142  	bb, _ := json.Marshal(headers)
   143  	return string(bb)
   144  }
   145  
   146  // FormatProxyID - Returns the prefixed proxyID for summary event.
   147  func FormatProxyID(proxyID string) string {
   148  	return SummaryEventProxyIDPrefix + proxyID
   149  }
   150  
   151  // FormatApplicationID - Returns the prefixed applicationID for summary event.
   152  func FormatApplicationID(applicationID string) string {
   153  	return SummaryEventApplicationIDPrefix + applicationID
   154  }
   155  
   156  // UpdateWithConsumerDetails -
   157  func UpdateWithConsumerDetails(accessRequest *management.AccessRequest, managedApp *v1.ResourceInstance, log log.FieldLogger) *models.ConsumerDetails {
   158  
   159  	// Set defaults to unknown to consumer details in case access request or managed apps comes back nil
   160  	consumerDetails := &models.ConsumerDetails{
   161  		Subscription: &models.Subscription{
   162  			ID:   unknown,
   163  			Name: unknown,
   164  		},
   165  		Application: &models.AppDetails{
   166  			ConsumerOrgID: unknown,
   167  			ID:            unknown,
   168  			Name:          unknown,
   169  		},
   170  		PublishedProduct: &models.Product{
   171  			ID:   unknown,
   172  			Name: unknown,
   173  		},
   174  	}
   175  
   176  	if accessRequest == nil || managedApp == nil {
   177  		log.Trace("access request or managed app is nil. Setting default values to unknown")
   178  		return consumerDetails
   179  	}
   180  
   181  	subRef := accessRequest.GetReferenceByGVK(catalog.SubscriptionGVK())
   182  	if subRef.ID == "" || subRef.Name == "" {
   183  		log.Debug("could not get subscription, setting subscription to unknown")
   184  	} else {
   185  		consumerDetails.Subscription.ID = subRef.ID
   186  		consumerDetails.Subscription.Name = subRef.Name
   187  	}
   188  	log.
   189  		WithField("subscription-id", consumerDetails.Subscription.ID).
   190  		WithField("subscription-name", consumerDetails.Subscription.Name).
   191  		Trace("subscription information")
   192  
   193  	appRef := accessRequest.GetReferenceByGVK(catalog.ApplicationGVK())
   194  	if appRef.ID == "" || appRef.Name == "" {
   195  		log.Debug("could not get application, setting application to unknown")
   196  	} else {
   197  		consumerDetails.Application.ID = appRef.ID
   198  		consumerDetails.Application.Name = appRef.Name
   199  	}
   200  
   201  	log.
   202  		WithField("application-id", consumerDetails.Application.ID).
   203  		WithField("application-name", consumerDetails.Application.Name).
   204  		Trace("application information")
   205  
   206  	// try to get consumer org ID from the managed app first
   207  
   208  	consumerOrgID := GetConsumerOrgID(managedApp)
   209  	if consumerOrgID == "" {
   210  		log.Debug("could not get consumer org ID from the managed app, try getting consumer org ID from subscription")
   211  	} else {
   212  		consumerDetails.Application.ConsumerOrgID = consumerOrgID
   213  	}
   214  	log.
   215  		WithField("consumer-org-id", consumerDetails.Application.ConsumerOrgID).
   216  		Trace("consumer org ID ")
   217  
   218  	publishProductRef := accessRequest.GetReferenceByGVK(catalog.PublishedProductGVK())
   219  	if publishProductRef.ID == "" || publishProductRef.Name == "" {
   220  		log.Debug("could not get published product, setting published product to unknown")
   221  	} else {
   222  		consumerDetails.PublishedProduct.ID = publishProductRef.ID
   223  		consumerDetails.PublishedProduct.Name = publishProductRef.Name
   224  	}
   225  
   226  	log.
   227  		WithField("published-product-id", consumerDetails.PublishedProduct.ID).
   228  		WithField("published-product-name", consumerDetails.PublishedProduct.Name).
   229  		Trace("published product information")
   230  
   231  	return consumerDetails
   232  }