Skip to content

Commit

Permalink
Version the API (#146)
Browse files Browse the repository at this point in the history
* Move code to various dirs

Signed-off-by: Ali Ok <aliok@redhat.com>

* More moving around

Signed-off-by: Ali Ok <aliok@redhat.com>

* Version the OpenAPI

Signed-off-by: Ali Ok <aliok@redhat.com>

* Fix code generation

Signed-off-by: Ali Ok <aliok@redhat.com>

---------

Signed-off-by: Ali Ok <aliok@redhat.com>
  • Loading branch information
aliok authored Jan 15, 2025
1 parent a625a17 commit e90b54d
Show file tree
Hide file tree
Showing 18 changed files with 72 additions and 45 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eventmesh
package auth

import (
"context"
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package eventmesh
package v1

import (
eventingv1 "knative.dev/eventing/pkg/apis/eventing/v1"

"knative.dev/backstage-plugins/backends/pkg/util"
)

// GetNamespacedName returns the name and namespace of the broker in the format "<namespace>/<name>"
func (b Broker) GetNamespacedName() string {
return NamespacedName(b.Namespace, b.Name)
return util.NamespacedName(b.Namespace, b.Name)
}

// convertBroker converts a Knative Eventing Broker to a simplified representation that is easier to consume by the Backstage plugin.
Expand All @@ -17,7 +19,7 @@ func convertBroker(br *eventingv1.Broker) Broker {
Namespace: br.Namespace,
UID: string(br.UID),
Labels: br.Labels,
Annotations: FilterAnnotations(br.Annotations),
Annotations: util.FilterAnnotations(br.Annotations),
// this field will be populated later on, when we have the list of event types
ProvidedEventTypes: []string{},
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eventmesh
package v1

import (
"context"
Expand All @@ -11,6 +11,8 @@ import (
"knative.dev/eventing/pkg/client/clientset/versioned"
duckv1 "knative.dev/pkg/apis/duck/v1"

"knative.dev/backstage-plugins/backends/pkg/util"

"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -131,7 +133,7 @@ func processTrigger(ctx context.Context, trigger *eventingv1.Trigger, brokerMap
logger.Errorw("Trigger has no broker", "namespace", trigger.Namespace, "trigger", trigger.Name)
return nil
}
brokerRef := NamespacedName(trigger.Namespace, trigger.Spec.Broker)
brokerRef := util.NamespacedName(trigger.Namespace, trigger.Spec.Broker)
if _, ok := brokerMap[brokerRef]; !ok {
logger.Infow("Broker not found", "namespace", trigger.Namespace, "trigger", trigger.Name, "broker", trigger.Spec.Broker)
return nil
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eventmesh
package v1

import (
"context"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package eventmesh
package v1

import (
"context"
"fmt"
"log"

"knative.dev/backstage-plugins/backends/pkg/eventmesh/auth"

"go.uber.org/zap"

"k8s.io/client-go/dynamic"
Expand All @@ -31,7 +33,7 @@ func NewEndpoint(inClusterConfig *rest.Config, logger *zap.SugaredLogger) *Endpo
func (e Endpoint) GetEventMesh(ctx context.Context, _ GetEventMeshRequestObject) (GetEventMeshResponseObject, error) {
logger := e.logger

authToken, ok := GetAuthToken(ctx)
authToken, ok := auth.GetAuthToken(ctx)
if !ok {
return GetEventMesh401JSONResponse{
Error: "Authorization header is missing",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package eventmesh
package v1

import (
"knative.dev/eventing/pkg/apis/eventing/v1beta2"
"knative.dev/eventing/pkg/apis/eventing/v1beta3"

"knative.dev/backstage-plugins/backends/pkg/util"
)

// NamespacedName returns the name and namespace of the event type in the format "<namespace>/<name>"
func (et EventType) NamespacedName() string {
return NamespacedName(et.Namespace, et.Name)
return util.NamespacedName(et.Namespace, et.Name)
}

// NamespacedType returns the type and namespace of the event type in the format "<namespace>/<type>"
func (et EventType) NamespacedType() string {
return NamespacedName(et.Namespace, et.Type)
return util.NamespacedName(et.Namespace, et.Type)
}

// TODO: remove
Expand All @@ -24,12 +26,12 @@ func convertEventType(et *v1beta2.EventType) EventType {
Namespace: et.Namespace,
Type: et.Spec.Type,
Uid: string(et.UID),
Description: ToStrPtrOrNil(et.Spec.Description),
SchemaData: ToStrPtrOrNil(et.Spec.SchemaData),
SchemaURL: ToStrPtrOrNil(et.Spec.Schema.String()),
Description: util.ToStrPtrOrNil(et.Spec.Description),
SchemaData: util.ToStrPtrOrNil(et.Spec.SchemaData),
SchemaURL: util.ToStrPtrOrNil(et.Spec.Schema.String()),
Labels: et.Labels,
Annotations: FilterAnnotations(et.Annotations),
Reference: ToStrPtrOrNil(NamespacedRefName(et.Spec.Reference)),
Annotations: util.FilterAnnotations(et.Annotations),
Reference: util.ToStrPtrOrNil(util.NamespacedRefName(et.Spec.Reference)),
// this field will be populated later on, when we have process the triggers
ConsumedBy: make([]string, 0),
}
Expand All @@ -42,10 +44,10 @@ func convertEventTypev1beta3(et *v1beta3.EventType) EventType {
Name: et.Name,
Namespace: et.Namespace,
Uid: string(et.UID),
Description: ToStrPtrOrNil(et.Spec.Description),
Description: util.ToStrPtrOrNil(et.Spec.Description),
Labels: et.Labels,
Annotations: FilterAnnotations(et.Annotations),
Reference: ToStrPtrOrNil(NamespacedRefName(et.Spec.Reference)),
Annotations: util.FilterAnnotations(et.Annotations),
Reference: util.ToStrPtrOrNil(util.NamespacedRefName(et.Spec.Reference)),
// this field will be populated later on, when we have process the triggers
ConsumedBy: make([]string, 0),
}
Expand All @@ -59,7 +61,7 @@ func convertEventTypev1beta3(et *v1beta3.EventType) EventType {
case "type": // TODO: any CE constant for these?
cet.Type = attr.Value
case "schemadata":
cet.SchemaURL = ToStrPtrOrNil(attr.Value)
cet.SchemaURL = util.ToStrPtrOrNil(attr.Value)
}
}

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 27 additions & 8 deletions backends/pkg/reconciler/eventmesh/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import (
"github.com/gorilla/mux"
middleware "github.com/oapi-codegen/nethttp-middleware"

"knative.dev/backstage-plugins/backends/pkg/eventmesh/auth"
eventmeshv1 "knative.dev/backstage-plugins/backends/pkg/eventmesh/v1"

"knative.dev/eventing/pkg/kncloudevents"
"knative.dev/pkg/injection"
"knative.dev/pkg/logging"
Expand Down Expand Up @@ -38,20 +41,27 @@ func startWebServer(ctx context.Context) {
noTokenConfig.Password = ""
noTokenConfig.BearerTokenFile = ""

swagger, err := GetSwagger()
v1swagger, err := eventmeshv1.GetSwagger()
if err != nil {
log.Fatalf("Error loading swagger spec: %v", err)
}
// the paths in OpenAPI spec are not prefixed with /v1
// but, we want to serve them at /v1
// this spec is used by the request validator middleware
prefixSwaggerPaths(v1swagger, "/v1")

v1endpoint := eventmeshv1.NewEndpoint(noTokenConfig, logger)
v1strictHandler := eventmeshv1.NewStrictHandler(v1endpoint, []eventmeshv1.StrictMiddlewareFunc{})
v1router := mux.NewRouter()
v1router.Use(auth.AuthTokenMiddleware())
v1router.Use(requestValidator(v1swagger))
v1handlerWithMiddleware := eventmeshv1.HandlerFromMuxWithBaseURL(v1strictHandler, v1router, "/v1")

endpoint := NewEndpoint(noTokenConfig, logger)
strictHandler := NewStrictHandler(endpoint, []StrictMiddlewareFunc{})
router := mux.NewRouter()
router.Use(AuthTokenMiddleware())
router.Use(requestValidator(swagger))
handlerWithMiddleware := HandlerFromMux(strictHandler, router)
parentRouter := mux.NewRouter()
parentRouter.PathPrefix("/v1/").Handler(v1handlerWithMiddleware)

r := kncloudevents.NewHTTPEventReceiver(8080)
log.Fatal(r.StartListen(ctx, handlerWithMiddleware))
log.Fatal(r.StartListen(ctx, parentRouter))
}

func requestValidator(swagger *openapi3.T) func(next http.Handler) http.Handler {
Expand All @@ -63,3 +73,12 @@ func requestValidator(swagger *openapi3.T) func(next http.Handler) http.Handler
},
})
}

func prefixSwaggerPaths(swagger *openapi3.T, prefix string) {
// iterate over swagger.Paths.InMatchingOrder()
for _, pathKey := range swagger.Paths.InMatchingOrder() {
pathItem := swagger.Paths.Value(pathKey)
swagger.Paths.Set(prefix+pathKey, pathItem)
swagger.Paths.Delete(pathKey)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eventmesh
package util

var ExcludedAnnotations = map[string]struct{}{
"kubectl.kubernetes.io/last-applied-configuration": {},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eventmesh
package util

import (
"reflect"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eventmesh
package util

import (
"fmt"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ func VerifyBackstageBackendAuthentication() *feature.Feature {
token := string(secret.Data["token"])

eventshub.Install(authenticatedClientName,
eventshub.StartSenderURL("http://eventmesh-backend.knative-eventing.svc.cluster.local:8080/getEventMesh"),
eventshub.StartSenderURL("http://eventmesh-backend.knative-eventing.svc.cluster.local:8080/v1/getEventMesh"),
eventshub.InputHeader("Authorization", "Bearer "+token),
eventshub.InputMethod("GET"),
)(ctx, t)
})
f.Setup("request with unauthenticated client", eventshub.Install(
unauthenticatedClientName,
eventshub.StartSenderURL("http://eventmesh-backend.knative-eventing.svc.cluster.local:8080/getEventMesh"),
eventshub.StartSenderURL("http://eventmesh-backend.knative-eventing.svc.cluster.local:8080/v1/getEventMesh"),
eventshub.InputHeader("Foo", "Bar"),
eventshub.InputMethod("GET")),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ export class KnativeEventMeshProvider implements EntityProvider {
const baseUrl = this.baseUrl.replace(/\/$/, '');
const token = this.token;

const url = `${baseUrl}/getEventMesh`;
const url = `${baseUrl}/v1/getEventMesh`;

const eventMesh = await getEventMesh(url, token);

Expand Down
4 changes: 2 additions & 2 deletions hack/generate.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package hack

//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen -config oapi-models-config-event-mesh.yaml ../specs/event-mesh.yaml
//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen -config oapi-server-config-event-mesh.yaml ../specs/event-mesh.yaml
//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen -config oapi-models-config-event-mesh-v1.yaml ../specs/event-mesh-v1.yaml
//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen -config oapi-server-config-event-mesh-v1.yaml ../specs/event-mesh-v1.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/oapi-codegen/oapi-codegen/HEAD/configuration-schema.json
package: eventmesh
package: v1
generate:
models: true
output: ../backends/pkg/reconciler/eventmesh/api.gen.go
output: ../backends/pkg/eventmesh/v1/api.gen.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/oapi-codegen/oapi-codegen/HEAD/configuration-schema.json
package: eventmesh
package: v1
generate:
gorilla-server: true
strict-server: true
embedded-spec: true
output: ../backends/pkg/reconciler/eventmesh/server.gen.go
output: ../backends/pkg/eventmesh/v1/server.gen.go
compatibility:
apply-gorilla-middleware-first-to-last: true
File renamed without changes.

0 comments on commit e90b54d

Please sign in to comment.