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  }