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 }