github.com/Axway/agent-sdk@v1.1.101/pkg/agent/cache/migratepersistedcache.go (about) 1 package cache 2 3 import ( 4 "sync" 5 6 v1 "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/api/v1" 7 management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1" 8 defs "github.com/Axway/agent-sdk/pkg/apic/definitions" 9 "github.com/Axway/agent-sdk/pkg/util" 10 ) 11 12 type cacheMigrate func(key string) error 13 14 // migratePersistentCache is the top level migrator for all cache migrations 15 func (c *cacheManager) migratePersistentCache(key string) error { 16 c.logger.Trace("checking if the persisted cache needs migrations") 17 18 wg := sync.WaitGroup{} 19 errs := make([]error, len(c.migrators)) 20 for i, m := range c.migrators { 21 wg.Add(1) 22 go func(index int, migFunc cacheMigrate) { 23 defer wg.Done() 24 errs[index] = migFunc(key) 25 }(i, m) 26 } 27 wg.Wait() 28 29 for _, err := range errs { 30 if err != nil { 31 return err 32 } 33 } 34 return nil 35 } 36 37 func (c *cacheManager) migrateAccessRequest(key string) error { 38 if key != accReqKey { 39 return nil 40 } 41 42 // migrate to set the foreign keys 43 if len(c.accessRequestMap.GetKeys()) > 0 && len(c.accessRequestMap.GetForeignKeys()) == 0 { 44 c.logger.Trace("migrating access requests to set foreign key of managed application name") 45 46 wg := sync.WaitGroup{} 47 errs := make([]error, len(c.accessRequestMap.GetKeys())) 48 for i, k := range c.accessRequestMap.GetKeys() { 49 wg.Add(1) 50 go func(index int, key string) { 51 defer wg.Done() 52 inst, _ := c.accessRequestMap.Get(key) 53 if inst != nil { 54 if ri, ok := inst.(*v1.ResourceInstance); ok { 55 accessRequest := management.NewAccessRequest("", "") 56 errs[index] = accessRequest.FromInstance(ri) 57 c.accessRequestMap.SetForeignKey(key, formatAppForeignKey(accessRequest.Spec.ManagedApplication)) 58 } 59 } 60 }(i, k) 61 } 62 wg.Wait() 63 64 for _, err := range errs { 65 if err != nil { 66 return err 67 } 68 } 69 } 70 return nil 71 } 72 73 func (c *cacheManager) migrateInstanceCount(key string) error { 74 if key != instanceCountKey { 75 return nil 76 } 77 78 // run if there are api services, api service instances, and no instance counts 79 if len(c.apiMap.GetKeys()) != 0 && len(c.instanceMap.GetKeys()) != 0 && len(c.instanceCountMap.GetKeys()) == 0 { 80 c.logger.Trace("migrating instance counts for api service instances") 81 wg := sync.WaitGroup{} 82 errs := make([]error, len(c.accessRequestMap.GetKeys())) 83 84 for i, k := range c.instanceMap.GetKeys() { 85 wg.Add(1) 86 go func(index int, key string) { 87 defer wg.Done() 88 inst, _ := c.instanceMap.Get(key) 89 if inst != nil { 90 if ri, ok := inst.(*v1.ResourceInstance); ok { 91 apiID, _ := util.GetAgentDetailsValue(ri, defs.AttrExternalAPIID) 92 primaryKey, _ := util.GetAgentDetailsValue(ri, defs.AttrExternalAPIPrimaryKey) 93 c.addToServiceInstanceCount(apiID, primaryKey) 94 } 95 } 96 }(i, k) 97 } 98 wg.Wait() 99 100 for _, err := range errs { 101 if err != nil { 102 return err 103 } 104 } 105 } 106 return nil 107 }