1
1
package services
2
2
3
3
import (
4
+ "fmt"
5
+ "strconv"
4
6
"strings"
5
7
6
8
"github.com/ctfer-io/chall-manager/deploy/common"
7
9
"github.com/ctfer-io/chall-manager/deploy/services/parts"
10
+ corev1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/core/v1"
11
+ v1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/meta/v1"
8
12
netwv1 "github.com/pulumi/pulumi-kubernetes/sdk/v4/go/kubernetes/networking/v1"
9
13
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
10
14
)
@@ -19,13 +23,17 @@ type (
19
23
cm * parts.ChallManager
20
24
cmj * parts.ChallManagerJanitor
21
25
26
+ // Exposure
27
+ svc * corev1.Service
28
+
22
29
// Interface & ports network policies
23
30
cmToEtcd * netwv1.NetworkPolicy
24
31
cmjToCm * netwv1.NetworkPolicy
25
32
26
33
// Outputs
27
34
28
- Endpoint pulumi.StringOutput
35
+ Endpoint pulumi.StringOutput
36
+ ExposedPort pulumi.IntPtrOutput
29
37
}
30
38
31
39
// ChallManagerArgs contains all the parametrization of a Chall-Manager
@@ -47,7 +55,11 @@ type (
47
55
JanitorCron pulumi.StringPtrInput
48
56
janitorCron pulumi.StringOutput
49
57
50
- Swagger bool
58
+ // PVCAccessModes defines the access modes supported by the PVC.
59
+ PVCAccessModes pulumi.StringArrayInput
60
+ pvcAccessModes pulumi.StringArrayOutput
61
+
62
+ Swagger , Expose bool
51
63
52
64
Otel * common.OtelArgs
53
65
}
@@ -62,19 +74,41 @@ const (
62
74
//
63
75
// It is not made to be exposed to outer world (outside of the cluster).
64
76
func NewChallManager (ctx * pulumi.Context , name string , args * ChallManagerArgs , opts ... pulumi.ResourceOption ) (* ChallManager , error ) {
77
+ cm := & ChallManager {}
78
+ args , err := cm .validate (args )
79
+ if err != nil {
80
+ return nil , err
81
+ }
82
+ if err := ctx .RegisterComponentResource ("ctfer-io:chall-manager" , name , cm , opts ... ); err != nil {
83
+ return nil , err
84
+ }
85
+ opts = append (opts , pulumi .Parent (cm ))
86
+ if err := cm .provision (ctx , args , opts ... ); err != nil {
87
+ return nil , err
88
+ }
89
+ if err := cm .outputs (ctx ); err != nil {
90
+ return nil , err
91
+ }
92
+ return cm , nil
93
+ }
94
+
95
+ func (cm * ChallManager ) validate (args * ChallManagerArgs ) (* ChallManagerArgs , error ) {
65
96
if args == nil {
66
97
args = & ChallManagerArgs {}
67
98
}
99
+
68
100
if args .Tag == nil || args .Tag == pulumi .String ("" ) {
69
101
args .tag = pulumi .String ("dev" ).ToStringOutput ()
70
102
} else {
71
103
args .tag = args .Tag .ToStringPtrOutput ().Elem ()
72
104
}
105
+
73
106
if args .JanitorCron == nil || args .JanitorCron == pulumi .String ("" ) {
74
107
args .janitorCron = pulumi .String (defaultCron ).ToStringOutput ()
75
108
} else {
76
109
args .janitorCron = args .JanitorCron .ToStringPtrOutput ().Elem ()
77
110
}
111
+
78
112
if args .PrivateRegistry == nil {
79
113
args .privateRegistry = pulumi .String ("" ).ToStringOutput ()
80
114
} else {
@@ -92,23 +126,22 @@ func NewChallManager(ctx *pulumi.Context, name string, args *ChallManagerArgs, o
92
126
return str
93
127
}).(pulumi.StringOutput )
94
128
}
129
+
95
130
if args .Replicas == nil {
96
131
args .replicas = pulumi .Int (1 ).ToIntOutput ()
97
132
} else {
98
133
args .replicas = args .Replicas .ToIntPtrOutput ().Elem ()
99
134
}
100
135
101
- cm := & ChallManager {}
102
- if err := ctx .RegisterComponentResource ("ctfer-io:chall-manager" , name , cm , opts ... ); err != nil {
103
- return nil , err
104
- }
105
- opts = append (opts , pulumi .Parent (cm ))
106
- if err := cm .provision (ctx , args , opts ... ); err != nil {
107
- return nil , err
136
+ if args .PVCAccessModes == nil {
137
+ args .pvcAccessModes = pulumi .ToStringArray ([]string {
138
+ "ReadWriteMany" ,
139
+ }).ToStringArrayOutput ()
140
+ } else {
141
+ args .pvcAccessModes = args .PVCAccessModes .ToStringArrayOutput ()
108
142
}
109
- cm .outputs ()
110
143
111
- return cm , nil
144
+ return args , nil
112
145
}
113
146
114
147
func (cm * ChallManager ) provision (ctx * pulumi.Context , args * ChallManagerArgs , opts ... pulumi.ResourceOption ) (err error ) {
@@ -149,9 +182,10 @@ func (cm *ChallManager) provision(ctx *pulumi.Context, args *ChallManagerArgs, o
149
182
}
150
183
return 1 // default replicas to 1
151
184
}).(pulumi.IntOutput ),
152
- Etcd : nil ,
153
- Swagger : args .Swagger ,
154
- Otel : nil ,
185
+ Etcd : nil ,
186
+ Swagger : args .Swagger ,
187
+ PVCAccessModes : args .pvcAccessModes ,
188
+ Otel : nil ,
155
189
}
156
190
if args .EtcdReplicas != nil {
157
191
cmArgs .Etcd = & parts.ChallManagerEtcdArgs {
@@ -172,6 +206,34 @@ func (cm *ChallManager) provision(ctx *pulumi.Context, args *ChallManagerArgs, o
172
206
return
173
207
}
174
208
209
+ if args .Expose {
210
+ cm .svc , err = corev1 .NewService (ctx , "cm-exposed" , & corev1.ServiceArgs {
211
+ Metadata : v1.ObjectMetaArgs {
212
+ Labels : cm .cm .PodLabels ,
213
+ Namespace : args .Namespace ,
214
+ },
215
+ Spec : corev1.ServiceSpecArgs {
216
+ Type : pulumi .String ("NodePort" ),
217
+ Selector : cm .cm .PodLabels ,
218
+ Ports : corev1.ServicePortArray {
219
+ corev1.ServicePortArgs {
220
+ Port : cm .cm .Endpoint .ApplyT (func (edp string ) int {
221
+ // On bootstrap there is no valid URL, but port is assigned
222
+ pts := strings .Split (edp , ":" )
223
+ p := pts [len (pts )- 1 ]
224
+ port , _ := strconv .Atoi (p )
225
+ fmt .Printf ("port: %v\n " , port )
226
+ return port
227
+ }).(pulumi.IntOutput ),
228
+ },
229
+ },
230
+ },
231
+ }, opts ... )
232
+ if err != nil {
233
+ return
234
+ }
235
+ }
236
+
175
237
// Deploy janitor
176
238
var cmjOtel * common.OtelArgs
177
239
if args .Otel != nil {
@@ -294,6 +356,16 @@ func (cm *ChallManager) provision(ctx *pulumi.Context, args *ChallManagerArgs, o
294
356
return
295
357
}
296
358
297
- func (cm * ChallManager ) outputs () {
359
+ func (cm * ChallManager ) outputs (ctx * pulumi. Context ) error {
298
360
cm .Endpoint = cm .cm .Endpoint
361
+ if cm .svc != nil {
362
+ cm .ExposedPort = cm .svc .Spec .ApplyT (func (spec corev1.ServiceSpec ) * int {
363
+ return spec .Ports [0 ].NodePort
364
+ }).(pulumi.IntPtrOutput )
365
+ }
366
+
367
+ return ctx .RegisterResourceOutputs (cm , pulumi.Map {
368
+ "endpoint" : cm .Endpoint ,
369
+ "exposed_port" : cm .ExposedPort ,
370
+ })
299
371
}
0 commit comments