@@ -33,26 +33,32 @@ const (
3333func main () {
3434 ctx , p := provider .MustPrepare [* postgres.DatabaseIntent ]()
3535
36+ if err := run (ctx , p ); err != nil {
37+ log .Fatal (err )
38+ }
39+ }
40+
41+ func run (ctx context.Context , p * provider.Provider [* postgres.DatabaseIntent ]) error {
3642 cluster := & postgresclass.ClusterInstance {}
3743 if err := p .Resources .Unmarshal (fmt .Sprintf ("%s:cluster" , providerPkg ), cluster ); err != nil {
38- log . Fatalf ("unable to read required resource \" cluster\" : %v " , err )
44+ return fmt . Errorf ("unable to read required resource \" cluster\" : %w " , err )
3945 }
4046
4147 // TODO inject file as secret ref and propagate secret ref to server, too.
4248 if cluster .CaCert != "" {
4349 if err := os .WriteFile (caCertPath , []byte (cluster .CaCert ), 0644 ); err != nil {
44- log . Fatalf ("failed to write %q: %v " , caCertPath , err )
50+ return fmt . Errorf ("failed to write %q: %w " , caCertPath , err )
4551 }
4652
4753 if err := os .Setenv ("PGSSLROOTCERT" , caCertPath ); err != nil {
48- log . Fatalf ("failed to set PGSSLROOTCERT: %v " , err )
54+ return fmt . Errorf ("failed to set PGSSLROOTCERT: %w " , err )
4955 }
5056
5157 }
5258
5359 exists , err := ensureDatabase (ctx , cluster , p .Intent .Name )
5460 if err != nil {
55- log . Fatalf ("unable to create database %q: %v " , p .Intent .Name , err )
61+ return fmt . Errorf ("unable to create database %q: %w " , p .Intent .Name , err )
5662 }
5763
5864 instance := & postgresclass.DatabaseInstance {
@@ -72,7 +78,7 @@ func main() {
7278 MaxConnIdleTime : connIdleTimeout ,
7379 })
7480 if err != nil {
75- log . Fatalf ("unable to open connection: %v " , err )
81+ return fmt . Errorf ("unable to open connection: %w " , err )
7682 }
7783 defer func () {
7884 if err := db .Close (); err != nil {
@@ -81,20 +87,30 @@ func main() {
8187 }()
8288
8389 for _ , schema := range p .Intent .Schema {
84- if err := backoff .Retry (func () error {
85- _ , err := db .Exec (ctx , string (schema .Contents ))
86- return err
87- }, backOff {
88- interval : 100 * time .Millisecond ,
89- deadline : time .Now ().Add (15 * time .Second ),
90- jitter : 100 * time .Millisecond ,
91- }); err != nil {
92- log .Fatalf ("unable to apply schema %q: %v" , schema .Path , err )
90+ if err := applyWithRetry (ctx , db , string (schema .Contents )); err != nil {
91+ return fmt .Errorf ("unable to apply schema %q: %w" , schema .Path , err )
9392 }
9493 }
9594 }
9695
9796 p .EmitResult (instance )
97+ return nil
98+ }
99+
100+ func applyWithRetry (ctx context.Context , db * universepg.DB , sql string ) error {
101+ return backoff .Retry (func () error {
102+ _ , err := db .Exec (ctx , sql )
103+
104+ if ! universepg .ErrorIsRetryable (err ) {
105+ return backoff .Permanent (err )
106+ }
107+
108+ return err
109+ }, backOff {
110+ interval : 100 * time .Millisecond ,
111+ deadline : time .Now ().Add (15 * time .Second ),
112+ jitter : 100 * time .Millisecond ,
113+ })
98114}
99115
100116func ensureDatabase (ctx context.Context , cluster * postgresclass.ClusterInstance , name string ) (bool , error ) {
0 commit comments