| 196 | } |
| 197 | |
| 198 | func createSinkComponent(ctx context.Context, c client.Client, log logr.Logger, resource client.Object, sink *ofevent.SinkSpec) (*componentsv1alpha1.Component, error) { |
| 199 | if sink.Uri == nil && sink.Ref == nil { |
| 200 | return nil, errors.New("at least one uri or ref must be set in sink") |
| 201 | } |
| 202 | |
| 203 | var namespace, url string |
| 204 | if sink.Uri != nil { |
| 205 | url = *sink.Uri |
| 206 | // when setting the Uri, use resource.GetNamespace() |
| 207 | namespace = resource.GetNamespace() |
| 208 | } else { |
| 209 | gvk := sink.Ref.GroupVersionKind() |
| 210 | switch gvk { |
| 211 | case knativeServiceGVK: |
| 212 | var ksvc kservingv1.Service |
| 213 | if err := c.Get(ctx, types.NamespacedName{Namespace: sink.Ref.Namespace, Name: sink.Ref.Name}, &ksvc); err != nil { |
| 214 | log.Error(err, "Failed to find Knative Service", "namespace", sink.Ref.Namespace, "name", sink.Ref.Name) |
| 215 | return nil, err |
| 216 | } |
| 217 | url = ksvc.Status.URL.String() |
| 218 | case ofFunctionGVK: |
| 219 | var of ofcore.Function |
| 220 | if err := c.Get(ctx, types.NamespacedName{Namespace: sink.Ref.Namespace, Name: sink.Ref.Name}, &of); err != nil { |
| 221 | log.Error(err, "Failed to find OpenFunction", "namespace", sink.Ref.Namespace, "name", sink.Ref.Name) |
| 222 | return nil, err |
| 223 | } |
| 224 | for _, address := range of.Status.Addresses { |
| 225 | if *address.Type == ofcore.InternalAddressType { |
| 226 | url = address.Value |
| 227 | break |
| 228 | } |
| 229 | } |
| 230 | default: |
| 231 | return nil, fmt.Errorf("unsupported reference %s", gvk.String()) |
| 232 | } |
| 233 | namespace = sink.Ref.Namespace |
| 234 | } |
| 235 | |
| 236 | sink.Uri = &url |
| 237 | |
| 238 | component := &componentsv1alpha1.Component{ |
| 239 | ObjectMeta: metav1.ObjectMeta{ |
| 240 | Name: fmt.Sprintf(SinkComponentNameTmpl, resource.GetName(), namespace), |
| 241 | Namespace: resource.GetNamespace(), |
| 242 | }, |
| 243 | } |
| 244 | |
| 245 | var spec componentsv1alpha1.ComponentSpec |
| 246 | specMap := map[string]interface{}{ |
| 247 | "version": "v1", |
| 248 | "type": "bindings.http", |
| 249 | "metadata": []map[string]string{ |
| 250 | {"name": "url", "value": url}, |
| 251 | }, |
| 252 | } |
| 253 | specBytes, err := json.Marshal(specMap) |
| 254 | if err != nil { |
| 255 | return nil, err |