@@ -13,6 +13,12 @@ import (
13
13
// resources managed by the manager
14
14
type Resources map [string ][]* resource.Resource
15
15
16
+ type SafeResources struct {
17
+ mu sync.Mutex
18
+ v Resources
19
+ err map [string ]error
20
+ }
21
+
16
22
// Provider : Provider definition
17
23
// Implements all logic for controlling Resource Managers
18
24
type Provider struct {
@@ -25,67 +31,86 @@ type Provider struct {
25
31
func (p * Provider ) GetAllResources () Resources {
26
32
p .Logger .Info ("Fetching All Resources" )
27
33
var wg sync.WaitGroup
28
- resources := make (Resources )
34
+ resources := SafeResources { v : make (Resources )}
29
35
for _ , resMgr := range p .Managers {
30
36
wg .Add (1 )
31
- go func (res Resources , resMgr * resource.Manager ) {
37
+ go func (res * SafeResources , resMgr * resource.Manager ) {
32
38
defer wg .Done ()
39
+
33
40
resMgrResources , err := resMgr .GetAll ()
34
41
if err != nil {
35
42
resMgr .Logger .Error (err )
36
43
}
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 )
39
48
}
40
49
wg .Wait ()
41
- return resources
50
+ return resources . v
42
51
}
43
52
44
53
// GetDestroyableResources : Return the resources which can be destroyed
45
54
func (p * Provider ) GetDestroyableResources (resources Resources ) Resources {
46
55
p .Logger .Debug ("Getting Destroyable Resources" )
56
+ count := 0
47
57
destroyableResources := make (Resources )
48
58
for mgrName , resList := range resources {
49
59
var destroyableResList []* resource.Resource
50
60
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
+ }
53
66
}
54
67
}
68
+ count += len (destroyableResList )
55
69
destroyableResources [mgrName ] = destroyableResList
56
70
}
71
+ p .Logger .Infof ("Found %d resources to be destroyed" , count )
57
72
return destroyableResources
58
73
}
59
74
60
75
// GetStoppableResources : Return the resources which can be stopped
61
76
func (p * Provider ) GetStoppableResources (resources Resources ) Resources {
62
77
p .Logger .Debug ("Getting Stoppable Resources" )
63
78
stoppableResources := make (Resources )
79
+ count := 0
64
80
for mgrName , resList := range resources {
65
81
var stoppableResList []* resource.Resource
66
82
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
+ }
69
87
}
70
88
}
89
+ count += len (stoppableResList )
71
90
stoppableResources [mgrName ] = stoppableResList
72
91
}
92
+ p .Logger .Infof ("Found %d resources to be stopped" , count )
73
93
return stoppableResources
74
94
}
75
95
76
96
// GetResumableResources : Return the resources which can be Resumed
77
97
func (p * Provider ) GetResumableResources (resources Resources ) Resources {
78
98
p .Logger .Debug ("Getting resumable Resources" )
79
99
resumableResource := make (Resources )
100
+ count := 0
80
101
for mgrName , resList := range resources {
81
102
var resumableResList []* resource.Resource
82
103
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
+ }
85
108
}
86
109
}
87
110
resumableResource [mgrName ] = resumableResList
88
111
}
112
+ count += len (resumableResource )
113
+ p .Logger .Infof ("Found %d resources to be resumed" , count )
89
114
return resumableResource
90
115
}
91
116
@@ -98,14 +123,20 @@ func (p *Provider) GetUnusedResources(resources Resources) Resources {
98
123
func (p * Provider ) DestroyResources (resources Resources ) map [string ]string {
99
124
errs := make (map [string ]string )
100
125
p .Logger .Debugf ("Destroying Resources..." )
126
+ var wg sync.WaitGroup
101
127
102
128
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 )
108
138
}
139
+ wg .Wait ()
109
140
return errs
110
141
}
111
142
0 commit comments