@@ -20,17 +20,20 @@ import (
20
20
21
21
"github.com/martinlindhe/base36"
22
22
"github.com/pborman/uuid"
23
-
24
23
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25
24
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
26
25
apitypes "k8s.io/apimachinery/pkg/types"
27
26
clientset "k8s.io/client-go/kubernetes"
27
+ "k8s.io/client-go/kubernetes/typed/core/v1"
28
28
helmengine "k8s.io/helm/pkg/engine"
29
29
"k8s.io/helm/pkg/kube"
30
30
"k8s.io/helm/pkg/storage"
31
+ "k8s.io/helm/pkg/storage/driver"
31
32
"k8s.io/helm/pkg/tiller"
32
33
"k8s.io/helm/pkg/tiller/environment"
34
+ crmanager "sigs.k8s.io/controller-runtime/pkg/manager"
33
35
36
+ "github.com/operator-framework/operator-sdk/pkg/helm/client"
34
37
"github.com/operator-framework/operator-sdk/pkg/helm/engine"
35
38
"github.com/operator-framework/operator-sdk/pkg/helm/internal/types"
36
39
)
@@ -40,43 +43,51 @@ import (
40
43
// improves decoupling between reconciliation logic and the Helm backend
41
44
// components used to manage releases.
42
45
type ManagerFactory interface {
43
- NewManager (r * unstructured.Unstructured ) Manager
46
+ NewManager (r * unstructured.Unstructured ) ( Manager , error )
44
47
}
45
48
46
49
type managerFactory struct {
47
- storageBackend * storage.Storage
48
- tillerKubeClient * kube.Client
49
- chartDir string
50
+ mgr crmanager.Manager
51
+ chartDir string
50
52
}
51
53
52
54
// NewManagerFactory returns a new Helm manager factory capable of installing and uninstalling releases.
53
- func NewManagerFactory (storageBackend * storage.Storage , tillerKubeClient * kube.Client , chartDir string ) ManagerFactory {
54
- return & managerFactory {storageBackend , tillerKubeClient , chartDir }
55
- }
56
-
57
- func (f managerFactory ) NewManager (r * unstructured.Unstructured ) Manager {
58
- return f .newManagerForCR (r )
55
+ func NewManagerFactory (mgr crmanager.Manager , chartDir string ) ManagerFactory {
56
+ return & managerFactory {mgr , chartDir }
59
57
}
60
58
61
- func (f managerFactory ) newManagerForCR (r * unstructured.Unstructured ) Manager {
59
+ func (f managerFactory ) NewManager (cr * unstructured.Unstructured ) (Manager , error ) {
60
+ clientv1 , err := v1 .NewForConfig (f .mgr .GetConfig ())
61
+ if err != nil {
62
+ return nil , fmt .Errorf ("failed to get core/v1 client: %s" , err )
63
+ }
64
+ storageBackend := storage .Init (driver .NewSecrets (clientv1 .Secrets (cr .GetNamespace ())))
65
+ tillerKubeClient , err := client .NewFromManager (f .mgr )
66
+ if err != nil {
67
+ return nil , fmt .Errorf ("failed to get client from manager: %s" , err )
68
+ }
69
+ releaseServer , err := getReleaseServer (cr , storageBackend , tillerKubeClient )
70
+ if err != nil {
71
+ return nil , fmt .Errorf ("failed to get helm release server: %s" , err )
72
+ }
62
73
return & manager {
63
- storageBackend : f . storageBackend ,
64
- tillerKubeClient : f . tillerKubeClient ,
74
+ storageBackend : storageBackend ,
75
+ tillerKubeClient : tillerKubeClient ,
65
76
chartDir : f .chartDir ,
66
77
67
- tiller : f . tillerRendererForCR ( r ) ,
68
- releaseName : getReleaseName (r ),
69
- namespace : r .GetNamespace (),
78
+ tiller : releaseServer ,
79
+ releaseName : getReleaseName (cr ),
80
+ namespace : cr .GetNamespace (),
70
81
71
- spec : r .Object ["spec" ],
72
- status : types .StatusFor (r ),
73
- }
82
+ spec : cr .Object ["spec" ],
83
+ status : types .StatusFor (cr ),
84
+ }, nil
74
85
}
75
86
76
- // tillerRendererForCR creates a ReleaseServer configured with a rendering engine that adds ownerrefs to rendered assets
87
+ // getReleaseServer creates a ReleaseServer configured with a rendering engine that adds ownerrefs to rendered assets
77
88
// based on the CR.
78
- func ( f managerFactory ) tillerRendererForCR ( r * unstructured.Unstructured ) * tiller.ReleaseServer {
79
- controllerRef := metav1 .NewControllerRef (r , r .GroupVersionKind ())
89
+ func getReleaseServer ( cr * unstructured.Unstructured , storageBackend * storage. Storage , tillerKubeClient * kube. Client ) ( * tiller.ReleaseServer , error ) {
90
+ controllerRef := metav1 .NewControllerRef (cr , cr .GroupVersionKind ())
80
91
ownerRefs := []metav1.OwnerReference {
81
92
* controllerRef ,
82
93
}
@@ -87,17 +98,23 @@ func (f managerFactory) tillerRendererForCR(r *unstructured.Unstructured) *tille
87
98
}
88
99
env := & environment.Environment {
89
100
EngineYard : ey ,
90
- Releases : f .storageBackend ,
91
- KubeClient : f .tillerKubeClient ,
101
+ Releases : storageBackend ,
102
+ KubeClient : tillerKubeClient ,
103
+ }
104
+ kubeconfig , err := tillerKubeClient .ToRESTConfig ()
105
+ if err != nil {
106
+ return nil , err
107
+ }
108
+ cs , err := clientset .NewForConfig (kubeconfig )
109
+ if err != nil {
110
+ return nil , err
92
111
}
93
- kubeconfig , _ := f .tillerKubeClient .ToRESTConfig ()
94
- cs := clientset .NewForConfigOrDie (kubeconfig )
95
112
96
- return tiller .NewReleaseServer (env , cs , false )
113
+ return tiller .NewReleaseServer (env , cs , false ), nil
97
114
}
98
115
99
- func getReleaseName (r * unstructured.Unstructured ) string {
100
- return fmt .Sprintf ("%s-%s" , r .GetName (), shortenUID (r .GetUID ()))
116
+ func getReleaseName (cr * unstructured.Unstructured ) string {
117
+ return fmt .Sprintf ("%s-%s" , cr .GetName (), shortenUID (cr .GetUID ()))
101
118
}
102
119
103
120
func shortenUID (uid apitypes.UID ) string {
0 commit comments