This is an automated email from the ASF dual-hosted git repository.

wmedvedeo pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-serverless-operator.git


The following commit(s) were added to refs/heads/main by this push:
     new f48047a3 kie-kogito-serverless-operator-335: Operator driven service 
discovery API Phase4 (#338)
f48047a3 is described below

commit f48047a36677f02e11083c2355a6f4a058f03af7
Author: Walter Medvedeo <[email protected]>
AuthorDate: Fri Jan 19 11:18:53 2024 +0100

    kie-kogito-serverless-operator-335: Operator driven service discovery API 
Phase4 (#338)
    
    * kie-kogito-serverless-operator-335: Operator driven service discovery API 
Phase4
        - Add the discovery of Openshift DeploymentConfigs and Routes to the 
service discovery API
    
    * kie-kogito-serverless-operator-335: Operator driven service discovery API 
Phase4
        - Code review suggestions 1
    
    * kie-kogito-serverless-operator-335: Operator driven service discovery API 
Phase4
        - Code review suggestions 2
    
    * kie-kogito-serverless-operator-335: Operator driven service discovery API 
Phase4
        - Augment the service uri query parameters
---
 .../sonataflow-operator.clusterserviceversion.yaml |  16 +++
 config/rbac/service_discovery_role.yaml            |  16 +++
 controllers/builder/openshiftbuilder.go            |   4 +-
 controllers/discovery/discovery.go                 |   6 +-
 controllers/discovery/discovery_knative_test.go    |   8 +-
 controllers/discovery/discovery_openshift_test.go  | 123 +++++++++++++++++++
 controllers/discovery/discovery_test.go            |  14 +--
 controllers/discovery/openshift_catalog.go         | 132 +++++++++++++++++++++
 controllers/discovery/test_utils.go                |   5 +
 controllers/discovery/uri_parser.go                |  39 ++++--
 controllers/discovery/uri_parser_test.go           |  58 +++++++++
 controllers/openshift/openshift.go                 |  64 ++++++++++
 .../profiles/common/properties/discovery_test.go   |   4 +-
 operator.yaml                                      |  16 +++
 14 files changed, 482 insertions(+), 23 deletions(-)

diff --git a/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml 
b/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
index 2d294988..94baa4f1 100644
--- a/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
+++ b/bundle/manifests/sonataflow-operator.clusterserviceversion.yaml
@@ -576,6 +576,22 @@ spec:
           - get
           - list
           - watch
+        - apiGroups:
+          - apps.openshift.io
+          resources:
+          - deploymentconfigs
+          verbs:
+          - get
+          - list
+          - watch
+        - apiGroups:
+          - route.openshift.io
+          resources:
+          - routes
+          verbs:
+          - get
+          - list
+          - watch
         serviceAccountName: sonataflow-operator-controller-manager
       deployments:
       - label:
diff --git a/config/rbac/service_discovery_role.yaml 
b/config/rbac/service_discovery_role.yaml
index e7be5d7f..ea72098f 100644
--- a/config/rbac/service_discovery_role.yaml
+++ b/config/rbac/service_discovery_role.yaml
@@ -40,3 +40,19 @@ rules:
       - get
       - list
       - watch
+  - apiGroups:
+      - apps.openshift.io
+    resources:
+      - deploymentconfigs
+    verbs:
+      - get
+      - list
+      - watch
+  - apiGroups:
+      - route.openshift.io
+    resources:
+      - routes
+    verbs:
+      - get
+      - list
+      - watch
diff --git a/controllers/builder/openshiftbuilder.go 
b/controllers/builder/openshiftbuilder.go
index 94d40607..79ada8fe 100644
--- a/controllers/builder/openshiftbuilder.go
+++ b/controllers/builder/openshiftbuilder.go
@@ -23,6 +23,8 @@ import (
        "context"
        "strings"
 
+       
"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/openshift"
+
        buildv1 "github.com/openshift/api/build/v1"
        imgv1 "github.com/openshift/api/image/v1"
        buildclientv1 
"github.com/openshift/client-go/build/clientset/versioned/typed/build/v1"
@@ -78,7 +80,7 @@ type openshiftBuilderManager struct {
 }
 
 func newOpenShiftBuilderManager(managerContext buildManagerContext, cliConfig 
*rest.Config) (BuildManager, error) {
-       buildClient, err := buildclientv1.NewForConfig(cliConfig)
+       buildClient, err := openshift.NewOpenShiftBuildClient(cliConfig)
        if err != nil {
                return nil, err
        }
diff --git a/controllers/discovery/discovery.go 
b/controllers/discovery/discovery.go
index d5b44255..6d5dba33 100644
--- a/controllers/discovery/discovery.go
+++ b/controllers/discovery/discovery.go
@@ -87,10 +87,11 @@ type sonataFlowServiceCatalog struct {
 }
 
 // NewServiceCatalog returns a new ServiceCatalog configured to resolve 
kubernetes, knative, and openshift resource addresses.
-func NewServiceCatalog(cli client.Client, knDiscoveryClient 
*KnDiscoveryClient) ServiceCatalog {
+func NewServiceCatalog(cli client.Client, knDiscoveryClient 
*KnDiscoveryClient, openShiftDiscoveryClient *OpenShiftDiscoveryClient) 
ServiceCatalog {
        return &sonataFlowServiceCatalog{
                kubernetesCatalog: newK8SServiceCatalog(cli),
                knativeCatalog:    newKnServiceCatalog(knDiscoveryClient),
+               openshiftCatalog:  
newOpenShiftServiceCatalog(openShiftDiscoveryClient),
        }
 }
 
@@ -98,6 +99,7 @@ func NewServiceCatalogForConfig(cli client.Client, cfg 
*rest.Config) ServiceCata
        return &sonataFlowServiceCatalog{
                kubernetesCatalog: newK8SServiceCatalog(cli),
                knativeCatalog:    newKnServiceCatalogForConfig(cfg),
+               openshiftCatalog:  
newOpenShiftServiceCatalogForClientAndConfig(cli, cfg),
        }
 }
 
@@ -108,7 +110,7 @@ func (c *sonataFlowServiceCatalog) Query(ctx 
context.Context, uri ResourceUri, o
        case KnativeScheme:
                return c.knativeCatalog.Query(ctx, uri, outputFormat)
        case OpenshiftScheme:
-               return "", fmt.Errorf("openshift service discovery is not yet 
implemented")
+               return c.openshiftCatalog.Query(ctx, uri, outputFormat)
        default:
                return "", fmt.Errorf("unknown scheme was provided for service 
discovery: %s", uri.Scheme)
        }
diff --git a/controllers/discovery/discovery_knative_test.go 
b/controllers/discovery/discovery_knative_test.go
index 9169bbaa..6fc281f3 100644
--- a/controllers/discovery/discovery_knative_test.go
+++ b/controllers/discovery/discovery_knative_test.go
@@ -43,7 +43,7 @@ func Test_QueryKnativeService(t *testing.T) {
 
 func Test_QueryKnativeServiceNotFound(t *testing.T) {
        _, client := fakeservingclient.With(context.TODO())
-       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(client.ServingV1(), 
nil))
+       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(client.ServingV1(), 
nil), nil)
        doTestQueryWithError(t, ctg, *NewResourceUriBuilder(KnativeScheme).
                Kind("services").
                Group("serving.knative.dev").
@@ -72,7 +72,7 @@ func doTestQueryKnativeService(t *testing.T, expectedUri 
string) {
                },
        }
        _, client := fakeservingclient.With(context.TODO(), service)
-       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(client.ServingV1(), 
nil))
+       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(client.ServingV1(), 
nil), nil)
        doTestQuery(t, ctg, *NewResourceUriBuilder(KnativeScheme).
                Kind("services").
                Group("serving.knative.dev").
@@ -87,7 +87,7 @@ func Test_QueryKnativeBroker(t *testing.T) {
 
 func Test_QueryKnativeBrokerNotFound(t *testing.T) {
        _, client := fakeeventingclient.With(context.TODO())
-       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(nil, 
client.EventingV1()))
+       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(nil, 
client.EventingV1()), nil)
        doTestQueryWithError(t, ctg, *NewResourceUriBuilder(KnativeScheme).
                Kind("brokers").
                Group("eventing.knative.dev").
@@ -115,7 +115,7 @@ func doTestQueryKnativeBroker(t *testing.T, expectedUri 
string) {
                },
        }
        _, client := fakeeventingclient.With(context.TODO(), broker)
-       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(nil, 
client.EventingV1()))
+       ctg := NewServiceCatalog(nil, newKnDiscoveryClient(nil, 
client.EventingV1()), nil)
        doTestQuery(t, ctg, *NewResourceUriBuilder(KnativeScheme).
                Kind("brokers").
                Group("eventing.knative.dev").
diff --git a/controllers/discovery/discovery_openshift_test.go 
b/controllers/discovery/discovery_openshift_test.go
new file mode 100644
index 00000000..ac54da72
--- /dev/null
+++ b/controllers/discovery/discovery_openshift_test.go
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package discovery
+
+import (
+       appsv1 "github.com/openshift/api/apps/v1"
+       routev1 "github.com/openshift/api/route/v1"
+       corev1 "k8s.io/api/core/v1"
+       "sigs.k8s.io/controller-runtime/pkg/client/fake"
+
+       fakeappsclient 
"github.com/openshift/client-go/apps/clientset/versioned/fake"
+       fakerouteclient 
"github.com/openshift/client-go/route/clientset/versioned/fake"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+       "testing"
+)
+
+func Test_QueryOpenShiftRoute(t *testing.T) {
+       doTestQueryOpenShiftRoute(t, false, "http://openshiftroutehost1:80";)
+}
+
+func Test_QueryOpenShiftRouteWithTLS(t *testing.T) {
+       doTestQueryOpenShiftRoute(t, true, "https://openshiftroutehost1:443";)
+}
+
+func doTestQueryOpenShiftRoute(t *testing.T, tls bool, expectedUri string) {
+       route := &routev1.Route{
+               TypeMeta: metav1.TypeMeta{},
+               ObjectMeta: metav1.ObjectMeta{
+                       Namespace: namespace1,
+                       Name:      openShiftRouteName1,
+               },
+               Spec: routev1.RouteSpec{
+                       Host: openShiftRouteHost1,
+               },
+               Status: routev1.RouteStatus{},
+       }
+       if tls {
+               route.Spec.TLS = &routev1.TLSConfig{}
+       }
+       fakeRoutesClient := fakerouteclient.NewSimpleClientset(route)
+       ctg := NewServiceCatalog(nil, nil, newOpenShiftDiscoveryClient(nil, 
fakeRoutesClient.RouteV1(), nil))
+       doTestQuery(t, ctg, *NewResourceUriBuilder(OpenshiftScheme).
+               Kind("routes").
+               Group("route.openshift.io").
+               Version("v1").
+               Namespace(namespace1).
+               Name(openShiftRouteName1).Build(), "", expectedUri)
+}
+
+func Test_QueryOpenShiftDeploymentConfigWithServiceDNSMode(t *testing.T) {
+       doTestQueryOpenShiftDeploymentConfig(t, KubernetesDNSAddress, true, 
"http://service1Name.namespace1.svc:80";, "")
+}
+
+func Test_QueryOpenShiftDeploymentConfigWithServiceIPAddressMode(t *testing.T) 
{
+       doTestQueryOpenShiftDeploymentConfig(t, KubernetesIPAddress, true, 
"http://10.1.15.16:80";, "")
+}
+
+func Test_QueryOpenShiftDeploymentConfigWithoutServiceDNSMode(t *testing.T) {
+       doTestQueryOpenShiftDeploymentConfig(t, KubernetesDNSAddress, false, 
"", "no service was found for the deploymentConfig: 
openShiftDeploymentConfigName1")
+}
+
+func Test_QueryOpenShiftDeploymentConfigWithoutServiceIPAddressMode(t 
*testing.T) {
+       doTestQueryOpenShiftDeploymentConfig(t, KubernetesIPAddress, false, "", 
"no service was found for the deploymentConfig: openShiftDeploymentConfigName1")
+}
+
+func doTestQueryOpenShiftDeploymentConfig(t *testing.T, outputFormat string, 
withService bool, expectedUri string, expectedError string) {
+       selector := map[string]string{
+               label1: valueLabel1,
+               label2: valueLabel2,
+       }
+       deploymentConfig := &appsv1.DeploymentConfig{
+               TypeMeta: metav1.TypeMeta{},
+               ObjectMeta: metav1.ObjectMeta{
+                       Namespace: namespace1,
+                       Name:      openShiftDeploymentConfigName1,
+               },
+               Spec: appsv1.DeploymentConfigSpec{
+                       Selector: selector,
+               },
+       }
+       fakeClientBuilder := fake.NewClientBuilder()
+       if withService {
+               service := mockServiceWithPorts(namespace1, service1Name, 
mockServicePort(httpProtocol, tcp, defaultHttpPort))
+               service.Spec.Selector = selector
+               service.Spec.ClusterIP = "10.1.15.16"
+               service.Spec.Type = corev1.ServiceTypeNodePort
+               fakeClientBuilder.WithRuntimeObjects(service)
+       }
+       cli := fakeClientBuilder.Build()
+       fakeAppsClient := fakeappsclient.NewSimpleClientset(deploymentConfig)
+       ctg := NewServiceCatalog(nil, nil, newOpenShiftDiscoveryClient(cli, 
nil, fakeAppsClient.AppsV1()))
+
+       resourceUri := *NewResourceUriBuilder(OpenshiftScheme).
+               Kind("deploymentconfigs").
+               Group("apps.openshift.io").
+               Version("v1").
+               Namespace(namespace1).
+               Name(openShiftDeploymentConfigName1).Build()
+
+       if withService {
+               doTestQuery(t, ctg, resourceUri, outputFormat, expectedUri)
+       } else {
+               doTestQueryWithError(t, ctg, resourceUri, outputFormat, 
expectedError)
+       }
+}
diff --git a/controllers/discovery/discovery_test.go 
b/controllers/discovery/discovery_test.go
index 1c28881b..12175ca1 100644
--- a/controllers/discovery/discovery_test.go
+++ b/controllers/discovery/discovery_test.go
@@ -65,7 +65,7 @@ func doTestQueryKubernetesService(t *testing.T, outputFormat 
string, expectedUri
        service.Spec.Type = corev1.ServiceTypeNodePort
        service.Spec.ClusterIP = "10.1.5.18"
        cli := fake.NewClientBuilder().WithRuntimeObjects(service).Build()
-       ctg := NewServiceCatalog(cli, newKnDiscoveryClient(nil, nil))
+       ctg := NewServiceCatalog(cli, nil, nil)
        doTestQuery(t, ctg, *NewResourceUriBuilder(KubernetesScheme).
                Kind("services").
                Version("v1").
@@ -86,7 +86,7 @@ func doTestQueryKubernetesPod(t *testing.T, outputFormat 
string, expectedUri str
                *mockContainerWithPorts("container1Name", 
mockContainerPort(httpProtocol, tcp, defaultHttpPort)))
        pod.Status.PodIP = "10.1.12.13"
        cli := fake.NewClientBuilder().WithRuntimeObjects(pod).Build()
-       ctg := NewServiceCatalog(cli, newKnDiscoveryClient(nil, nil))
+       ctg := NewServiceCatalog(cli, nil, nil)
        doTestQuery(t, ctg, *NewResourceUriBuilder(KubernetesScheme).
                Kind("pods").
                Version("v1").
@@ -116,7 +116,7 @@ func doTesQueryKubernetesDeploymentWithService(t 
*testing.T, outputFormat string
        service.Spec.Type = corev1.ServiceTypeNodePort
 
        cli := fake.NewClientBuilder().WithRuntimeObjects(deployment, 
service).Build()
-       ctg := NewServiceCatalog(cli, newKnDiscoveryClient(nil, nil))
+       ctg := NewServiceCatalog(cli, nil, nil)
 
        doTestQuery(t, ctg, *NewResourceUriBuilder(KubernetesScheme).
                Group("apps").
@@ -142,7 +142,7 @@ func doTestQueryKubernetesDeploymentWithoutService(t 
*testing.T, outputFormat st
        }
 
        deployment := mockDeployment(namespace1, deployment1Name, nil, 
&selector)
-       ctg := 
NewServiceCatalog(fake.NewClientBuilder().WithRuntimeObjects(deployment).Build(),
 newKnDiscoveryClient(nil, nil))
+       ctg := 
NewServiceCatalog(fake.NewClientBuilder().WithRuntimeObjects(deployment).Build(),
 nil, nil)
 
        uri := *NewResourceUriBuilder(KubernetesScheme).
                Group("apps").
@@ -176,7 +176,7 @@ func doTestQueryKubernetesStatefulSetWithService(t 
*testing.T, outputFormat stri
        service.Spec.Type = corev1.ServiceTypeNodePort
 
        cli := fake.NewClientBuilder().WithRuntimeObjects(statefulSet, 
service).Build()
-       ctg := NewServiceCatalog(cli, newKnDiscoveryClient(nil, nil))
+       ctg := NewServiceCatalog(cli, nil, nil)
 
        doTestQuery(t, ctg, *NewResourceUriBuilder(KubernetesScheme).
                Group("apps").
@@ -202,7 +202,7 @@ func doTestQueryKubernetesStatefulSetWithoutService(t 
*testing.T, outputFormat s
        }
 
        statefulSet := mockStatefulSet(namespace1, statefulSet1Name, nil, 
&selector)
-       ctg := 
NewServiceCatalog(fake.NewClientBuilder().WithRuntimeObjects(statefulSet).Build(),
 newKnDiscoveryClient(nil, nil))
+       ctg := 
NewServiceCatalog(fake.NewClientBuilder().WithRuntimeObjects(statefulSet).Build(),
 nil, nil)
 
        uri := *NewResourceUriBuilder(KubernetesScheme).
                Group("apps").
@@ -237,7 +237,7 @@ func doTestQueryKubernetesIngress(t *testing.T, hostName 
string, ip string, tls
                ingress.Spec.TLS = []v1.IngressTLS{{}}
        }
        cli := fake.NewClientBuilder().WithRuntimeObjects(ingress).Build()
-       ctg := NewServiceCatalog(cli, newKnDiscoveryClient(nil, nil))
+       ctg := NewServiceCatalog(cli, nil, nil)
        doTestQuery(t, ctg, *NewResourceUriBuilder(KubernetesScheme).
                Kind("ingresses").
                Group("networking.k8s.io").
diff --git a/controllers/discovery/openshift_catalog.go 
b/controllers/discovery/openshift_catalog.go
new file mode 100644
index 00000000..d01a75dc
--- /dev/null
+++ b/controllers/discovery/openshift_catalog.go
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package discovery
+
+import (
+       "context"
+       "fmt"
+
+       "sigs.k8s.io/controller-runtime/pkg/client"
+
+       
"github.com/apache/incubator-kie-kogito-serverless-operator/controllers/openshift"
+       "github.com/apache/incubator-kie-kogito-serverless-operator/log"
+       "github.com/apache/incubator-kie-kogito-serverless-operator/utils"
+       appsv1 
"github.com/openshift/client-go/apps/clientset/versioned/typed/apps/v1"
+       routev1 
"github.com/openshift/client-go/route/clientset/versioned/typed/route/v1"
+
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "k8s.io/client-go/rest"
+       "k8s.io/klog/v2"
+)
+
+const (
+       openShiftRoutes            = "routes"
+       openShiftDeploymentConfigs = "deploymentconfigs"
+)
+
+type openShiftServiceCatalog struct {
+       dc *OpenShiftDiscoveryClient
+}
+
+type OpenShiftDiscoveryClient struct {
+       Client      client.Client
+       RouteClient routev1.RouteV1Interface
+       AppsClient  appsv1.AppsV1Interface
+}
+
+func newOpenShiftServiceCatalog(discoveryClient *OpenShiftDiscoveryClient) 
openShiftServiceCatalog {
+       return openShiftServiceCatalog{
+               dc: discoveryClient,
+       }
+}
+func newOpenShiftServiceCatalogForClientAndConfig(cli client.Client, cfg 
*rest.Config) openShiftServiceCatalog {
+       return openShiftServiceCatalog{
+               dc: newOpenShiftDiscoveryClientForClientAndConfig(cli, cfg),
+       }
+}
+
+func newOpenShiftDiscoveryClientForClientAndConfig(cli client.Client, cfg 
*rest.Config) *OpenShiftDiscoveryClient {
+       var routeClient routev1.RouteV1Interface
+       var appsClient appsv1.AppsV1Interface
+       var err error
+       if utils.IsOpenShift() {
+               if routeClient, err = openshift.GetRouteClient(cfg); err != nil 
{
+                       klog.V(log.E).ErrorS(err, "Unable to get the openshift 
route client")
+                       return nil
+               }
+               if appsClient, err = openshift.GetAppsClient(cfg); err != nil {
+                       klog.V(log.E).ErrorS(err, "Unable to get the openshift 
apps client")
+                       return nil
+               }
+               return newOpenShiftDiscoveryClient(cli, routeClient, appsClient)
+       }
+       return nil
+}
+
+func newOpenShiftDiscoveryClient(cli client.Client, routeClient 
routev1.RouteV1Interface, appsClient appsv1.AppsV1Interface) 
*OpenShiftDiscoveryClient {
+       return &OpenShiftDiscoveryClient{
+               Client:      cli,
+               RouteClient: routeClient,
+               AppsClient:  appsClient,
+       }
+}
+
+func (c openShiftServiceCatalog) Query(ctx context.Context, uri ResourceUri, 
outputFormat string) (string, error) {
+       if c.dc == nil {
+               return "", fmt.Errorf("OpenShiftDiscoveryClient was not 
provided, maybe current operator is not running in OpenShift")
+       }
+       switch uri.GVK.Kind {
+       case openShiftRoutes:
+               return c.resolveOpenShiftRouteQuery(ctx, uri)
+       case openShiftDeploymentConfigs:
+               return c.resolveOpenShiftDeploymentConfigQuery(ctx, uri, 
outputFormat)
+       default:
+               return "", fmt.Errorf("resolution of openshift kind: %s is not 
implemented", uri.GVK.Kind)
+       }
+}
+
+func (c openShiftServiceCatalog) resolveOpenShiftRouteQuery(ctx 
context.Context, uri ResourceUri) (string, error) {
+       if route, err := c.dc.RouteClient.Routes(uri.Namespace).Get(ctx, 
uri.Name, metav1.GetOptions{}); err != nil {
+               return "", err
+       } else {
+               scheme := httpProtocol
+               port := defaultHttpPort
+               if route.Spec.TLS != nil {
+                       scheme = httpsProtocol
+                       port = defaultHttpsPort
+               }
+               return buildURI(scheme, route.Spec.Host, port), nil
+       }
+}
+
+func (c openShiftServiceCatalog) resolveOpenShiftDeploymentConfigQuery(ctx 
context.Context, uri ResourceUri, outputFormat string) (string, error) {
+       if deploymentConfig, err := 
c.dc.AppsClient.DeploymentConfigs(uri.Namespace).Get(ctx, uri.Name, 
metav1.GetOptions{}); err != nil {
+               return "", err
+       } else {
+               if serviceList, err := findServicesBySelectorTarget(ctx, 
c.dc.Client, uri.Namespace, deploymentConfig.Spec.Selector); err != nil {
+                       return "", err
+               } else if len(serviceList.Items) == 0 {
+                       return "", fmt.Errorf("no service was found for the 
deploymentConfig: %s in namespace: %s", uri.Name, uri.Namespace)
+               } else {
+                       referenceService := 
selectBestSuitedServiceByCustomLabels(serviceList, uri.GetCustomLabels())
+                       return resolveServiceUri(referenceService, 
uri.GetPort(), outputFormat)
+               }
+       }
+}
diff --git a/controllers/discovery/test_utils.go 
b/controllers/discovery/test_utils.go
index 222be956..c05fea11 100644
--- a/controllers/discovery/test_utils.go
+++ b/controllers/discovery/test_utils.go
@@ -58,6 +58,11 @@ const (
 
        knServiceName1 = "knServiceName1"
        knBrokerName1  = "knBrokerName1"
+
+       openShiftRouteName1 = "openShiftRouteName1"
+       openShiftRouteHost1 = "openshiftroutehost1"
+
+       openShiftDeploymentConfigName1 = "openShiftDeploymentConfigName1"
 )
 
 func mockService(namespace string, name string, labels *map[string]string, 
selectorLabels *map[string]string) *corev1.Service {
diff --git a/controllers/discovery/uri_parser.go 
b/controllers/discovery/uri_parser.go
index 78a6375b..09f9aec0 100644
--- a/controllers/discovery/uri_parser.go
+++ b/controllers/discovery/uri_parser.go
@@ -29,10 +29,13 @@ import (
 
 const (
        // valid namespace, name, or label name.
-       dns1123LabelFmt         string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
-       namespaceAndNamePattern        = "^/((" + dns1123LabelFmt + ")+)(/(" + 
dns1123LabelFmt + ")+)?"
-       queryStringPattern             = "^(\\?((" + dns1123LabelFmt + ")+\\=(" 
+ dns1123LabelFmt + ")+)" +
-               "(&(" + dns1123LabelFmt + ")+\\=(" + dns1123LabelFmt + ")+)*)?$"
+       dns1123LabelFmt string = "[a-z0-9]([-a-z0-9]*[a-z0-9])?"
+       queryParamName         = "[a-zA-Z0-9][-a-zAz0-9]*"
+       queryParamValue        = "[/a-zA-Z0-9][/-a-zAz0-9]*"
+
+       namespaceAndNamePattern = "^/((" + dns1123LabelFmt + ")+)(/(" + 
dns1123LabelFmt + ")+)?"
+       queryStringPattern      = "^(\\?((" + queryParamName + ")+\\=(" + 
queryParamValue + ")+)" +
+               "(&(" + queryParamName + ")+\\=(" + queryParamValue + ")+)*)?$"
 
        kubernetesGroupsPattern = "^(" + kubernetesServices +
                "|" + kubernetesPods +
@@ -63,7 +66,7 @@ func ParseUri(uri string) (*ResourceUri, error) {
        } else if knativeSimplifiedServiceExpr.MatchString(uri) {
                return parseKnativeSimplifiedServiceUri(uri)
        } else if split := openshiftGroupsExpr.Split(uri, -1); len(split) == 2 {
-               return parseOpenshiftUri(openshiftGroupsExpr.FindString(uri), 
split[1])
+               return parseOpenshiftUri(uri, 
openshiftGroupsExpr.FindString(uri), split[1])
        }
        return nil, fmt.Errorf("invalid uri: %s, not correspond to any of the 
available schemes format: %s, %s, %s", uri, KubernetesScheme, KnativeScheme, 
OpenshiftScheme)
 }
@@ -165,6 +168,18 @@ func parseGVK(schemaGvk string) (*v1.GroupVersionKind, 
error) {
                        Version: "v1",
                        Kind:    "brokers",
                }, nil
+       case openshiftRoutes:
+               return &v1.GroupVersionKind{
+                       Group:   "route.openshift.io",
+                       Version: "v1",
+                       Kind:    "routes",
+               }, nil
+       case openshiftDeploymentConfigs:
+               return &v1.GroupVersionKind{
+                       Group:   "apps.openshift.io",
+                       Version: "v1",
+                       Kind:    "deploymentconfigs",
+               }, nil
        default:
                return nil, fmt.Errorf("unknown schema and gvk: %s", schemaGvk)
        }
@@ -212,6 +227,16 @@ func parseKnativeSimplifiedServiceUri(uri string) 
(*ResourceUri, error) {
        }
 }
 
-func parseOpenshiftUri(findString string, s string) (*ResourceUri, error) {
-       return nil, fmt.Errorf("openshit is parsing not yet implemented")
+func parseOpenshiftUri(uri string, schemaAndGroup string, after string) 
(*ResourceUri, error) {
+       if namespace, name, gvk, queryParams, err := 
parseNamespaceNameGVKAndQueryParams(uri, schemaAndGroup, after); err != nil {
+               return nil, err
+       } else {
+               return &ResourceUri{
+                       Scheme:      OpenshiftScheme,
+                       GVK:         *gvk,
+                       Namespace:   namespace,
+                       Name:        name,
+                       QueryParams: queryParams,
+               }, nil
+       }
 }
diff --git a/controllers/discovery/uri_parser_test.go 
b/controllers/discovery/uri_parser_test.go
index 5d590e17..4b80e3ca 100644
--- a/controllers/discovery/uri_parser_test.go
+++ b/controllers/discovery/uri_parser_test.go
@@ -194,6 +194,14 @@ var KnativeServicesTestValues = map[string]*ResourceUri{
                WithQueryParam("label-a", "value-a").
                WithQueryParam("label-b", "value-b").
                WithPort("custom-port-value").Build(),
+
+       
"knative:services.v1.serving.knative.dev/my-namespace/my-function?path=/myKnativeFunction":
 NewResourceUriBuilder(KnativeScheme).
+               Kind("services").
+               Version("v1").
+               Group("serving.knative.dev").
+               Namespace("my-namespace").
+               Name("my-function").
+               WithQueryParam("path", "/myKnativeFunction").Build(),
 }
 
 var KnativeBrokersTestValues = map[string]*ResourceUri{
@@ -224,6 +232,44 @@ var KnativeBrokersTestValues = map[string]*ResourceUri{
        
"knative:brokers.v1.eventing.knative.dev/my-namespace/my-broker/another": nil,
 }
 
+var OpenshiftRoutesTestValues = map[string]*ResourceUri{
+       "openshift:routes.v1.route.openshift.io": nil,
+
+       "openshift:routes.v1.route.openshift.io/my-route": 
NewResourceUriBuilder(OpenshiftScheme).
+               Kind("routes").
+               Group("route.openshift.io").
+               Version("v1").
+               Name("my-route").
+               Build(),
+
+       "openshift:routes.v1.route.openshift.io/my-namespace/my-route": 
NewResourceUriBuilder(OpenshiftScheme).
+               Kind("routes").
+               Group("route.openshift.io").
+               Version("v1").
+               Namespace("my-namespace").
+               Name("my-route").
+               Build(),
+}
+
+var OpenshiftDeploymentConfigsTestValues = map[string]*ResourceUri{
+       "openshift:deploymentconfigs.v1.apps.openshift.io": nil,
+
+       
"openshift:deploymentconfigs.v1.apps.openshift.io/my-deployment-config": 
NewResourceUriBuilder(OpenshiftScheme).
+               Kind("deploymentconfigs").
+               Group("apps.openshift.io").
+               Version("v1").
+               Name("my-deployment-config").
+               Build(),
+
+       
"openshift:deploymentconfigs.v1.apps.openshift.io/my-namespace/my-deployment-config":
 NewResourceUriBuilder(OpenshiftScheme).
+               Kind("deploymentconfigs").
+               Group("apps.openshift.io").
+               Version("v1").
+               Namespace("my-namespace").
+               Name("my-deployment-config").
+               Build(),
+}
+
 func TestParseKubernetesServicesURI(t *testing.T) {
        for k, v := range KubernetesServicesTestValues {
                doTestParseURI(t, k, v)
@@ -242,6 +288,18 @@ func TestParseKnativeBrokersURI(t *testing.T) {
        }
 }
 
+func TestParseOpenshiftRoutesURI(t *testing.T) {
+       for k, v := range OpenshiftRoutesTestValues {
+               doTestParseURI(t, k, v)
+       }
+}
+
+func TestParseOpenshiftDeploymentConfigsURI(t *testing.T) {
+       for k, v := range OpenshiftDeploymentConfigsTestValues {
+               doTestParseURI(t, k, v)
+       }
+}
+
 func doTestParseURI(t *testing.T, url string, expectedUri *ResourceUri) {
        result, err := ParseUri(url)
        if expectedUri == nil {
diff --git a/controllers/openshift/openshift.go 
b/controllers/openshift/openshift.go
new file mode 100644
index 00000000..57abc481
--- /dev/null
+++ b/controllers/openshift/openshift.go
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package openshift
+
+import (
+       appsv1 
"github.com/openshift/client-go/apps/clientset/versioned/typed/apps/v1"
+       buildv1 
"github.com/openshift/client-go/build/clientset/versioned/typed/build/v1"
+       routev1 
"github.com/openshift/client-go/route/clientset/versioned/typed/route/v1"
+       "k8s.io/client-go/rest"
+)
+
+var routeClient routev1.RouteV1Interface
+var appsClient appsv1.AppsV1Interface
+
+func GetRouteClient(cfg *rest.Config) (routev1.RouteV1Interface, error) {
+       if routeClient == nil {
+               if osRouteClient, err := NewOpenShiftRouteClient(cfg); err != 
nil {
+                       return nil, err
+               } else {
+                       routeClient = osRouteClient
+               }
+       }
+       return routeClient, nil
+}
+
+func GetAppsClient(cfg *rest.Config) (appsv1.AppsV1Interface, error) {
+       if appsClient == nil {
+               if osAppsClient, err := NewOpenShiftAppsClientClient(cfg); err 
!= nil {
+                       return nil, err
+               } else {
+                       appsClient = osAppsClient
+               }
+       }
+       return appsClient, nil
+}
+
+func NewOpenShiftRouteClient(cfg *rest.Config) (*routev1.RouteV1Client, error) 
{
+       return routev1.NewForConfig(cfg)
+}
+
+func NewOpenShiftAppsClientClient(cfg *rest.Config) (*appsv1.AppsV1Client, 
error) {
+       return appsv1.NewForConfig(cfg)
+}
+
+func NewOpenShiftBuildClient(cfg *rest.Config) (*buildv1.BuildV1Client, error) 
{
+       return buildv1.NewForConfig(cfg)
+}
diff --git a/controllers/profiles/common/properties/discovery_test.go 
b/controllers/profiles/common/properties/discovery_test.go
index 49824f26..4555c6c3 100644
--- a/controllers/profiles/common/properties/discovery_test.go
+++ b/controllers/profiles/common/properties/discovery_test.go
@@ -47,11 +47,11 @@ func Test_generateDiscoveryProperties(t *testing.T) {
                Functions: []model.Function{
                        {
                                Name:      "knServiceInvocation1",
-                               Operation: 
"knative:services.v1.serving.knative.dev/namespace1/my-kn-service1?path=knative-function1",
+                               Operation: 
"knative:services.v1.serving.knative.dev/namespace1/my-kn-service1?path=/knative-function1",
                        },
                        {
                                Name:      "knServiceInvocation2",
-                               Operation: 
"knative:services.v1.serving.knative.dev/my-kn-service3?path=knative-function3",
+                               Operation: 
"knative:services.v1.serving.knative.dev/my-kn-service3?path=/knative-function3",
                        },
                },
        }
diff --git a/operator.yaml b/operator.yaml
index e5b00cfa..068ea81a 100644
--- a/operator.yaml
+++ b/operator.yaml
@@ -26334,6 +26334,22 @@ rules:
   - get
   - list
   - watch
+- apiGroups:
+  - apps.openshift.io
+  resources:
+  - deploymentconfigs
+  verbs:
+  - get
+  - list
+  - watch
+- apiGroups:
+  - route.openshift.io
+  resources:
+  - routes
+  verbs:
+  - get
+  - list
+  - watch
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: RoleBinding


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to