@@ -2,8 +2,13 @@ package helm
2
2
3
3
import (
4
4
"fmt"
5
+ "github.com/cyclops-ui/cyclops/cyclops-ctrl/internal/models/dto"
6
+ "github.com/cyclops-ui/cyclops/cyclops-ctrl/pkg/cluster/k8sclient"
5
7
"io"
8
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
9
+ "k8s.io/apimachinery/pkg/runtime"
6
10
"log"
11
+ "sort"
7
12
"strings"
8
13
9
14
"github.com/pkg/errors"
@@ -16,14 +21,18 @@ import (
16
21
17
22
type ReleaseClient struct {
18
23
namespace string
24
+ k8sClient k8sclient.IKubernetesClient
19
25
}
20
26
21
- func NewReleaseClient (namespace string ) * ReleaseClient {
27
+ func NewReleaseClient (namespace string , k8sClient k8sclient. IKubernetesClient ) * ReleaseClient {
22
28
return & ReleaseClient {
23
29
namespace : strings .TrimSpace (namespace ),
30
+ k8sClient : k8sClient ,
24
31
}
25
32
}
26
33
34
+ func noopLogger (format string , v ... interface {}) {}
35
+
27
36
func (r * ReleaseClient ) ListReleases () ([]* release.Release , error ) {
28
37
settings := cli .New ()
29
38
@@ -119,3 +128,78 @@ func (r *ReleaseClient) UpgradeRelease(
119
128
_ , err = client .Run (name , current .Chart , values )
120
129
return err
121
130
}
131
+
132
+ func (r * ReleaseClient ) ListResources (namespace string , name string ) ([]dto.Resource , error ) {
133
+ if len (r .namespace ) > 0 && namespace != r .namespace {
134
+ return nil , errors .New (fmt .Sprintf ("invalid namespace provided: %v" , namespace ))
135
+ }
136
+
137
+ settings := cli .New ()
138
+ settings .SetNamespace (namespace )
139
+
140
+ actionConfig := new (action.Configuration )
141
+ if err := actionConfig .Init (settings .RESTClientGetter (), namespace , "" , noopLogger ); err != nil {
142
+ return nil , err
143
+ }
144
+
145
+ client := action .NewStatus (actionConfig )
146
+ client .ShowResources = true
147
+
148
+ releaseStatus , err := client .Run (name )
149
+ if err != nil {
150
+ return nil , err
151
+ }
152
+
153
+ if releaseStatus .Info == nil {
154
+ return nil , errors .New ("empty release info resources" )
155
+ }
156
+
157
+ out := make ([]dto.Resource , 0 , 0 )
158
+ for gv , objs := range releaseStatus .Info .Resources {
159
+ if strings .HasSuffix (gv , "(related)" ) {
160
+ continue
161
+ }
162
+
163
+ for _ , obj := range objs {
164
+ u , err := runtime .DefaultUnstructuredConverter .ToUnstructured (obj )
165
+ if err != nil {
166
+ return nil , err
167
+ }
168
+
169
+ res , err := r .k8sClient .MapUnstructuredResource (unstructured.Unstructured {Object : u })
170
+ if err != nil {
171
+ return nil , err
172
+ }
173
+
174
+ out = append (out , res )
175
+ }
176
+ }
177
+
178
+ sort .Slice (out , func (i , j int ) bool {
179
+ if out [i ].GetGroupVersionKind () != out [j ].GetGroupVersionKind () {
180
+ return out [i ].GetGroupVersionKind () < out [j ].GetGroupVersionKind ()
181
+ }
182
+
183
+ return out [i ].GetName () < out [j ].GetName ()
184
+ })
185
+
186
+ return out , nil
187
+ }
188
+
189
+ func (r * ReleaseClient ) ListWorkloadsForRelease (namespace , name string ) ([]dto.Resource , error ) {
190
+ resources , err := r .ListResources (namespace , name )
191
+ if err != nil {
192
+ return nil , err
193
+ }
194
+
195
+ workloads := make ([]dto.Resource , 0 , 0 )
196
+ for _ , resource := range resources {
197
+ if resource .GetGroup () == "apps" &&
198
+ resource .GetVersion () == "v1" &&
199
+ (resource .GetKind () == "Deployment" || resource .GetKind () == "DaemonSet" || resource .GetKind () == "StatefulSet" ) {
200
+ workloads = append (workloads , resource )
201
+ }
202
+ }
203
+
204
+ return workloads , nil
205
+ }
0 commit comments