@@ -13,6 +13,12 @@ import (
1313// resources managed by the manager
1414type Resources map [string ][]* resource.Resource
1515
16+ type SafeResources struct {
17+ mu sync.Mutex
18+ v Resources
19+ err map [string ]error
20+ }
21+
1622// Provider : Provider definition
1723// Implements all logic for controlling Resource Managers
1824type Provider struct {
@@ -25,67 +31,86 @@ type Provider struct {
2531func (p * Provider ) GetAllResources () Resources {
2632 p .Logger .Info ("Fetching All Resources" )
2733 var wg sync.WaitGroup
28- resources := make (Resources )
34+ resources := SafeResources { v : make (Resources )}
2935 for _ , resMgr := range p .Managers {
3036 wg .Add (1 )
31- go func (res Resources , resMgr * resource.Manager ) {
37+ go func (res * SafeResources , resMgr * resource.Manager ) {
3238 defer wg .Done ()
39+
3340 resMgrResources , err := resMgr .GetAll ()
3441 if err != nil {
3542 resMgr .Logger .Error (err )
3643 }
37- res [resMgr .Name ] = resMgrResources
38- }(resources , resMgr )
44+ res .mu .Lock ()
45+ defer res .mu .Unlock ()
46+ res .v [resMgr .Name ] = resMgrResources
47+ }(& resources , resMgr )
3948 }
4049 wg .Wait ()
41- return resources
50+ return resources . v
4251}
4352
4453// GetDestroyableResources : Return the resources which can be destroyed
4554func (p * Provider ) GetDestroyableResources (resources Resources ) Resources {
4655 p .Logger .Debug ("Getting Destroyable Resources" )
56+ count := 0
4757 destroyableResources := make (Resources )
4858 for mgrName , resList := range resources {
4959 var destroyableResList []* resource.Resource
5060 for _ , r := range resList {
51- if rules .GetResourceAction (r ) == rules .Destroy {
52- destroyableResList = append (destroyableResList , r )
61+ // Returns the first Matching Rule Action for a resource
62+ for _ , rule := range rules .GetRules () {
63+ if action := rule .CheckResource (r ); action == rules .Destroy {
64+ destroyableResList = append (destroyableResList , r )
65+ }
5366 }
5467 }
68+ count += len (destroyableResList )
5569 destroyableResources [mgrName ] = destroyableResList
5670 }
71+ p .Logger .Infof ("Found %d resources to be destroyed" , count )
5772 return destroyableResources
5873}
5974
6075// GetStoppableResources : Return the resources which can be stopped
6176func (p * Provider ) GetStoppableResources (resources Resources ) Resources {
6277 p .Logger .Debug ("Getting Stoppable Resources" )
6378 stoppableResources := make (Resources )
79+ count := 0
6480 for mgrName , resList := range resources {
6581 var stoppableResList []* resource.Resource
6682 for _ , r := range resList {
67- if r .IsActive () && rules .GetResourceAction (r ) == rules .Stop {
68- stoppableResList = append (stoppableResList , r )
83+ for _ , rule := range rules .GetRules () {
84+ if action := rule .CheckResource (r ); r .IsActive () && action == rules .Stop {
85+ stoppableResList = append (stoppableResList , r )
86+ }
6987 }
7088 }
89+ count += len (stoppableResList )
7190 stoppableResources [mgrName ] = stoppableResList
7291 }
92+ p .Logger .Infof ("Found %d resources to be stopped" , count )
7393 return stoppableResources
7494}
7595
7696// GetResumableResources : Return the resources which can be Resumed
7797func (p * Provider ) GetResumableResources (resources Resources ) Resources {
7898 p .Logger .Debug ("Getting resumable Resources" )
7999 resumableResource := make (Resources )
100+ count := 0
80101 for mgrName , resList := range resources {
81102 var resumableResList []* resource.Resource
82103 for _ , r := range resList {
83- if r .IsStopped () && rules .GetResourceAction (r ) == rules .Resume {
84- resumableResList = append (resumableResList , r )
104+ for _ , rule := range rules .GetRules () {
105+ if action := rule .CheckResource (r ); r .IsStopped () && action == rules .Resume {
106+ resumableResList = append (resumableResList , r )
107+ }
85108 }
86109 }
87110 resumableResource [mgrName ] = resumableResList
88111 }
112+ count += len (resumableResource )
113+ p .Logger .Infof ("Found %d resources to be resumed" , count )
89114 return resumableResource
90115}
91116
@@ -98,14 +123,20 @@ func (p *Provider) GetUnusedResources(resources Resources) Resources {
98123func (p * Provider ) DestroyResources (resources Resources ) map [string ]string {
99124 errs := make (map [string ]string )
100125 p .Logger .Debugf ("Destroying Resources..." )
126+ var wg sync.WaitGroup
101127
102128 for mgrName , res := range resources {
103- mgr := p .getManager (mgrName )
104- mgr .Logger .Debugf ("Destroying %s " , mgrName )
105- if err := mgr .Destroy (res ); err != nil {
106- errs [mgrName ] = err .Error ()
107- }
129+ wg .Add (1 )
130+ go func (mgrName string , res []* resource.Resource ) {
131+ defer wg .Done ()
132+ mgr := p .getManager (mgrName )
133+ mgr .Logger .Debugf ("Destroying %s " , mgrName )
134+ if err := mgr .Destroy (res ); err != nil {
135+ errs [mgrName ] = err .Error ()
136+ }
137+ }(mgrName , res )
108138 }
139+ wg .Wait ()
109140 return errs
110141}
111142
0 commit comments