11package seaweedfs
22
33import (
4+ "bytes"
45 "context"
56 "encoding/json"
67 "fmt"
@@ -12,6 +13,7 @@ import (
1213 "github.com/replicatedhq/embedded-cluster/pkg/helpers"
1314 batchv1 "k8s.io/api/batch/v1"
1415 corev1 "k8s.io/api/core/v1"
16+ k8serrors "k8s.io/apimachinery/pkg/api/errors"
1517 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1618 "k8s.io/apimachinery/pkg/util/intstr"
1719 "k8s.io/client-go/metadata"
@@ -32,23 +34,36 @@ func (s *SeaweedFS) Install(
3234 return errors .Wrap (err , "generate helm values" )
3335 }
3436
35- err = s .ensurePostInstallHooksDeleted (ctx , kcli )
36- if err != nil {
37- return errors .Wrap (err , "ensure hooks deleted" )
37+ if ! s .DryRun {
38+ err = s .ensurePostInstallHooksDeleted (ctx , kcli )
39+ if err != nil {
40+ return errors .Wrap (err , "ensure hooks deleted" )
41+ }
3842 }
3943
40- _ , err = hcli . Install ( ctx , helm.InstallOptions {
44+ opts := helm.InstallOptions {
4145 ReleaseName : s .ReleaseName (),
4246 ChartPath : s .ChartLocation (domains ),
4347 ChartVersion : Metadata .Version ,
4448 Values : values ,
4549 Namespace : s .Namespace (),
4650 Labels : getBackupLabels (),
4751 LogFn : helm .LogFn (logf ),
48- })
49- if err != nil {
50- return errors .Wrap (err , "helm install" )
5152 }
53+
54+ if s .DryRun {
55+ manifests , err := hcli .Render (ctx , opts )
56+ if err != nil {
57+ return errors .Wrap (err , "dry run values" )
58+ }
59+ s .dryRunManifests = append (s .dryRunManifests , manifests ... )
60+ } else {
61+ _ , err = hcli .Install (ctx , opts )
62+ if err != nil {
63+ return errors .Wrap (err , "helm install" )
64+ }
65+ }
66+
5267 return nil
5368}
5469
@@ -69,13 +84,21 @@ func (s *SeaweedFS) ensurePreRequisites(ctx context.Context, kcli client.Client)
6984}
7085
7186func (s * SeaweedFS ) ensureNamespace (ctx context.Context , kcli client.Client ) error {
72- ns := corev1.Namespace {
87+ obj := & corev1.Namespace {
7388 ObjectMeta : metav1.ObjectMeta {
7489 Name : s .Namespace (),
7590 },
7691 }
77- if err := kcli .Create (ctx , & ns ); client .IgnoreAlreadyExists (err ) != nil {
78- return err
92+ if s .DryRun {
93+ b := bytes .NewBuffer (nil )
94+ if err := serializer .Encode (obj , b ); err != nil {
95+ return errors .Wrap (err , "serialize" )
96+ }
97+ s .dryRunManifests = append (s .dryRunManifests , b .Bytes ())
98+ } else {
99+ if err := kcli .Create (ctx , obj ); err != nil && ! k8serrors .IsAlreadyExists (err ) {
100+ return err
101+ }
79102 }
80103 return nil
81104}
@@ -91,6 +114,10 @@ func (s *SeaweedFS) ensureService(ctx context.Context, kcli client.Client, servi
91114 }
92115
93116 obj := & corev1.Service {
117+ TypeMeta : metav1.TypeMeta {
118+ Kind : "Service" ,
119+ APIVersion : "v1" ,
120+ },
94121 ObjectMeta : metav1.ObjectMeta {Name : _s3SVCName , Namespace : s .Namespace ()},
95122 Spec : corev1.ServiceSpec {
96123 ClusterIP : clusterIP ,
@@ -111,22 +138,30 @@ func (s *SeaweedFS) ensureService(ctx context.Context, kcli client.Client, servi
111138
112139 obj .Labels = ApplyLabels (obj .Labels , "s3" )
113140
114- var existingObj corev1.Service
115- if err := kcli .Get (ctx , client.ObjectKey {Name : obj .Name , Namespace : obj .Namespace }, & existingObj ); client .IgnoreNotFound (err ) != nil {
116- return errors .Wrap (err , "get s3 service" )
117- } else if err == nil {
118- // if the service already exists and has the correct cluster IP, do not recreate it
119- if existingObj .Spec .ClusterIP == clusterIP {
120- return nil
141+ if s .DryRun {
142+ b := bytes .NewBuffer (nil )
143+ if err := serializer .Encode (obj , b ); err != nil {
144+ return errors .Wrap (err , "serialize" )
121145 }
122- err := kcli .Delete (ctx , & existingObj )
123- if err != nil {
124- return errors .Wrap (err , "delete existing s3 service" )
146+ s .dryRunManifests = append (s .dryRunManifests , b .Bytes ())
147+ } else {
148+ var existingObj corev1.Service
149+ if err := kcli .Get (ctx , client.ObjectKey {Name : obj .Name , Namespace : obj .Namespace }, & existingObj ); client .IgnoreNotFound (err ) != nil {
150+ return errors .Wrap (err , "get s3 service" )
151+ } else if err == nil {
152+ // if the service already exists and has the correct cluster IP, do not recreate it
153+ if existingObj .Spec .ClusterIP == clusterIP {
154+ return nil
155+ }
156+ err := kcli .Delete (ctx , & existingObj )
157+ if err != nil {
158+ return errors .Wrap (err , "delete existing s3 service" )
159+ }
125160 }
126- }
127161
128- if err := kcli .Create (ctx , obj ); err != nil {
129- return errors .Wrap (err , "create s3 service" )
162+ if err := kcli .Create (ctx , obj ); err != nil {
163+ return errors .Wrap (err , "create s3 service" )
164+ }
130165 }
131166
132167 return nil
@@ -157,16 +192,29 @@ func (s *SeaweedFS) ensureS3Secret(ctx context.Context, kcli client.Client) erro
157192 }
158193
159194 obj := & corev1.Secret {
195+ TypeMeta : metav1.TypeMeta {
196+ Kind : "Secret" ,
197+ APIVersion : "v1" ,
198+ },
160199 ObjectMeta : metav1.ObjectMeta {Name : _s3SecretName , Namespace : s .Namespace ()},
200+ Type : "Opaque" ,
161201 Data : map [string ][]byte {
162202 "seaweedfs_s3_config" : configData ,
163203 },
164204 }
165205
166206 obj .Labels = ApplyLabels (obj .Labels , "s3" )
167207
168- if err := kcli .Create (ctx , obj ); client .IgnoreAlreadyExists (err ) != nil {
169- return errors .Wrap (err , "create s3 secret" )
208+ if s .DryRun {
209+ b := bytes .NewBuffer (nil )
210+ if err := serializer .Encode (obj , b ); err != nil {
211+ return errors .Wrap (err , "serialize" )
212+ }
213+ s .dryRunManifests = append (s .dryRunManifests , b .Bytes ())
214+ } else {
215+ if err := kcli .Create (ctx , obj ); err != nil && ! k8serrors .IsAlreadyExists (err ) {
216+ return errors .Wrap (err , "create s3 secret" )
217+ }
170218 }
171219
172220 return nil
0 commit comments