@@ -2,12 +2,12 @@ package jsfunction
2
2
3
3
import (
4
4
"context"
5
- "strings "
5
+ "fmt "
6
6
7
7
knv1alpha1 "github.com/knative/serving/pkg/apis/serving/v1alpha1"
8
8
knv1beta1 "github.com/knative/serving/pkg/apis/serving/v1beta1"
9
9
10
- faasv1alpha1 "github.com/lance /js-function-operator/pkg/apis/faas/v1alpha1"
10
+ faasv1alpha1 "github.com/openshift-cloud-functions /js-function-operator/pkg/apis/faas/v1alpha1"
11
11
12
12
corev1 "k8s.io/api/core/v1"
13
13
"k8s.io/apimachinery/pkg/api/errors"
@@ -104,7 +104,24 @@ func (r *ReconcileJSFunction) Reconcile(request reconcile.Request) (reconcile.Re
104
104
err = r .client .Get (context .TODO (), types.NamespacedName {Name : function .Name , Namespace : function .Namespace }, found )
105
105
if err != nil && errors .IsNotFound (err ) {
106
106
// No service for this function exists. Create a new one
107
- service := r .serviceForFunction (function )
107
+
108
+ // Create configmap first
109
+ configMap , err := r .configMapWithFunction (function )
110
+ if err != nil {
111
+ return reconcile.Result {}, err
112
+ }
113
+ err = r .client .Create (context .TODO (), configMap )
114
+ if err != nil {
115
+ reqLogger .Error (err , "Failed to create new ConfigMap holding function." , "Service.Namespace" , configMap .Namespace , "ConfigMap.Name" , configMap .Name )
116
+ return reconcile.Result {}, err
117
+ }
118
+
119
+ // Create service, mounting the config map
120
+ service , err := r .serviceForFunction (function , configMap .Name )
121
+ if err != nil {
122
+ return reconcile.Result {}, err
123
+ }
124
+
108
125
reqLogger .Info ("Creating a new knative Service" , "Service.Namespace" , service .Namespace , "Service.Name" , service .Name )
109
126
err = r .client .Create (context .TODO (), service )
110
127
if err != nil {
@@ -126,35 +143,23 @@ func (r *ReconcileJSFunction) Reconcile(request reconcile.Request) (reconcile.Re
126
143
return reconcile.Result {}, nil
127
144
}
128
145
129
- func (r * ReconcileJSFunction ) serviceForFunction (f * faasv1alpha1.JSFunction ) * knv1alpha1. Service {
146
+ func (r * ReconcileJSFunction ) configMapWithFunction (f * faasv1alpha1.JSFunction ) ( * corev1. ConfigMap , error ) {
130
147
// Create a config map containing the user code
131
148
configMap := & corev1.ConfigMap {
132
149
ObjectMeta : metav1.ObjectMeta {
133
150
Name : f .Name ,
151
+ Namespace : f .Namespace ,
134
152
},
135
153
Data : map [string ]string {"index.js" : f .Spec .Func },
136
154
}
137
155
if err := controllerutil .SetControllerReference (f , configMap , r .scheme ); err != nil {
138
- log .Error (err , "Failed to set controller reference for function ConfigMap" )
139
- }
140
-
141
- volumeName := strings .Join ([]string {f .Name , "source" }, "-" )
142
- var _ = & corev1.Volume {
143
- Name : volumeName ,
144
- VolumeSource : corev1.VolumeSource {
145
- ConfigMap : & corev1.ConfigMapVolumeSource {
146
- LocalObjectReference : corev1.LocalObjectReference {
147
- Name : configMap .Name ,
148
- },
149
- },
150
- },
156
+ return nil , err
151
157
}
158
+ return configMap , nil
159
+ }
152
160
161
+ func (r * ReconcileJSFunction ) serviceForFunction (f * faasv1alpha1.JSFunction , configMapName string ) (* knv1alpha1.Service , error ) {
153
162
service := & knv1alpha1.Service {
154
- TypeMeta : metav1.TypeMeta {
155
- APIVersion : "serving.knative.dev/v1beta1" ,
156
- Kind : "Service" ,
157
- },
158
163
ObjectMeta : metav1.ObjectMeta {
159
164
Name : f .Name ,
160
165
Namespace : f .Namespace ,
@@ -167,21 +172,7 @@ func (r *ReconcileJSFunction) serviceForFunction(f *faasv1alpha1.JSFunction) *kn
167
172
},
168
173
Spec : knv1alpha1.RevisionSpec {
169
174
RevisionSpec : knv1beta1.RevisionSpec {
170
- PodSpec : corev1.PodSpec {
171
- Containers : []corev1.Container {{
172
- Image : "quay.io/lanceball/js-runtime" ,
173
- Name : strings .Join ([]string {"nodejs" , f .Name }, "-" ),
174
- Ports : []corev1.ContainerPort {{
175
- ContainerPort : 8080 ,
176
- }},
177
- VolumeMounts : []corev1.VolumeMount {
178
- corev1.VolumeMount {
179
- Name : volumeName ,
180
- MountPath : "/home/node/usr" ,
181
- },
182
- },
183
- }},
184
- },
175
+ PodSpec : createPodSpec (f .Name , configMapName ),
185
176
},
186
177
},
187
178
},
@@ -192,8 +183,43 @@ func (r *ReconcileJSFunction) serviceForFunction(f *faasv1alpha1.JSFunction) *kn
192
183
193
184
// Set JSFunction instance as the owner and controller
194
185
if err := controllerutil .SetControllerReference (f , service , r .scheme ); err != nil {
195
- log . Error ( err , "Failed to set controller reference for function Service" )
186
+ return nil , err
196
187
}
197
188
198
- return service
189
+ return service , nil
190
+ }
191
+
192
+ func createPodSpec (functionName , configMapName string ) corev1.PodSpec {
193
+ volumeName := fmt .Sprintf ("%s-source" , functionName )
194
+ return corev1.PodSpec {
195
+ Containers : []corev1.Container {{
196
+ Image : "docker.io/rhuss/js-runtime" ,
197
+ Name : fmt .Sprintf ("nodejs-%s" , functionName ),
198
+ Ports : []corev1.ContainerPort {{
199
+ ContainerPort : 8181 ,
200
+ }},
201
+ VolumeMounts : []corev1.VolumeMount {
202
+ {
203
+ Name : volumeName ,
204
+ MountPath : "/home/node/usr" ,
205
+ },
206
+ },
207
+ }},
208
+ Volumes : []corev1.Volume {
209
+ createConfigMapVolume (volumeName , configMapName ),
210
+ },
211
+ }
212
+ }
213
+
214
+ func createConfigMapVolume (volumeName , configMapName string ) corev1.Volume {
215
+ return corev1.Volume {
216
+ Name : volumeName ,
217
+ VolumeSource : corev1.VolumeSource {
218
+ ConfigMap : & corev1.ConfigMapVolumeSource {
219
+ LocalObjectReference : corev1.LocalObjectReference {
220
+ Name : configMapName ,
221
+ },
222
+ },
223
+ },
224
+ }
199
225
}
0 commit comments