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

     1  package cache
     2  
     3  import (
     4  	"fmt"
     5  
     6  	defs "github.com/Axway/agent-sdk/pkg/apic/definitions"
     7  
     8  	v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1"
     9  	management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1"
    10  	"github.com/Axway/agent-sdk/pkg/util"
    11  )
    12  
    13  func formatAppForeignKey(appName string) string { return fmt.Sprintf("ManagedApplication:%v", appName) }
    14  
    15  func arSecondaryKey(appName, apiID, apiStage, apiVersion string) string {
    16  	return fmt.Sprintf("%s:%s:%s:%s", appName, apiID, apiStage, apiVersion)
    17  }
    18  
    19  // AccessRequest cache related methods
    20  func (c *cacheManager) GetAccessRequestCacheKeys() []string {
    21  	c.ApplyResourceReadLock()
    22  	defer c.ReleaseResourceReadLock()
    23  
    24  	return c.accessRequestMap.GetKeys()
    25  }
    26  
    27  func (c *cacheManager) AddAccessRequest(ri *v1.ResourceInstance) {
    28  	if ri == nil {
    29  		return
    30  	}
    31  
    32  	ar := &management.AccessRequest{}
    33  	if ar.FromInstance(ri) != nil {
    34  		return
    35  	}
    36  
    37  	appName := ar.Spec.ManagedApplication
    38  	instID := ""
    39  
    40  	instRef := ar.GetReferenceByGVK(management.APIServiceInstanceGVK())
    41  	instID = instRef.ID
    42  
    43  	instance, _ := c.GetAPIServiceInstanceByID(instID)
    44  	apiID := ""
    45  	apiStage := ""
    46  	apiVersion := ""
    47  	if instance != nil {
    48  		apiID, _ = util.GetAgentDetailsValue(instance, defs.AttrExternalAPIID)
    49  		apiStage, _ = util.GetAgentDetailsValue(instance, defs.AttrExternalAPIStage)
    50  		apiVersion, _ = util.GetAgentDetailsValue(instance, defs.AttrExternalAPIVersion)
    51  	}
    52  
    53  	secKey := arSecondaryKey(appName, apiID, apiStage, apiVersion)
    54  	formattedAppForeignKey := formatAppForeignKey(appName)
    55  
    56  	c.logger.
    57  		WithField("instID", instID).
    58  		WithField("apiID", apiID).
    59  		WithField("apiStage", apiStage).
    60  		WithField("apiVersion", apiVersion).
    61  		WithField("formattedAppForeignKey", formattedAppForeignKey).
    62  		WithField("metadataID", ar.Metadata.ID).
    63  		WithField("secKey", secKey).
    64  		Trace("add access request and set secondary key")
    65  
    66  	c.accessRequestMap.SetWithSecondaryKey(ar.Metadata.ID, secKey, ri)
    67  	c.accessRequestMap.SetForeignKey(ar.Metadata.ID, formattedAppForeignKey)
    68  
    69  }
    70  
    71  func (c *cacheManager) GetAccessRequestByAppAndAPI(appName, remoteAPIID, remoteAPIStage string) *v1.ResourceInstance {
    72  	return c.GetAccessRequestByAppAndAPIStageVersion(appName, remoteAPIID, remoteAPIStage, "")
    73  }
    74  
    75  func (c *cacheManager) GetAccessRequestByAppAndAPIStageVersion(appName, remoteAPIID, remoteAPIStage, remoteAPIVersion string) *v1.ResourceInstance {
    76  	c.logger.
    77  		WithField("appName", appName).
    78  		WithField("remoteAPIID", remoteAPIID).
    79  		WithField("remoteAPIStage", remoteAPIStage).
    80  		WithField("remoteAPIVersion", remoteAPIVersion).
    81  		Trace("get access request by app, API stage, and version")
    82  
    83  	c.ApplyResourceReadLock()
    84  	defer c.ReleaseResourceReadLock()
    85  
    86  	secKey := arSecondaryKey(appName, remoteAPIID, remoteAPIStage, remoteAPIVersion)
    87  
    88  	accessRequest, _ := c.accessRequestMap.GetBySecondaryKey(secKey)
    89  	if accessRequest != nil {
    90  		if ri, ok := accessRequest.(*v1.ResourceInstance); ok {
    91  			return ri
    92  		}
    93  	}
    94  	return nil
    95  }
    96  
    97  func (c *cacheManager) GetAccessRequestsByApp(appName string) []*v1.ResourceInstance {
    98  	c.ApplyResourceReadLock()
    99  	defer c.ReleaseResourceReadLock()
   100  
   101  	items, _ := c.accessRequestMap.GetItemsByForeignKey(formatAppForeignKey(appName))
   102  
   103  	accessRequests := []*v1.ResourceInstance{}
   104  	for _, item := range items {
   105  		if item != nil {
   106  			if ri, ok := item.GetObject().(*v1.ResourceInstance); ok {
   107  				accessRequests = append(accessRequests, ri)
   108  			}
   109  		}
   110  	}
   111  
   112  	return accessRequests
   113  }
   114  
   115  func (c *cacheManager) GetAccessRequest(id string) *v1.ResourceInstance {
   116  	c.ApplyResourceReadLock()
   117  	defer c.ReleaseResourceReadLock()
   118  
   119  	accessRequest, _ := c.accessRequestMap.Get(id)
   120  	if accessRequest != nil {
   121  		if ri, ok := accessRequest.(*v1.ResourceInstance); ok {
   122  			return ri
   123  		}
   124  	}
   125  	return nil
   126  }
   127  
   128  func (c *cacheManager) DeleteAccessRequest(id string) error {
   129  	return c.accessRequestMap.Delete(id)
   130  }
   131  
   132  func (c *cacheManager) ListAccessRequests() []*v1.ResourceInstance {
   133  	list := make([]*v1.ResourceInstance, 0)
   134  	for _, key := range c.accessRequestMap.GetKeys() {
   135  		item, _ := c.accessRequestMap.Get(key)
   136  		if v, ok := item.(*v1.ResourceInstance); ok && v != nil {
   137  			list = append(list, v)
   138  		}
   139  	}
   140  	return list
   141  }