diff --git a/.github/workflows/trivy.yml b/.github/workflows/trivy.yml index 4262d432..690bd9e1 100644 --- a/.github/workflows/trivy.yml +++ b/.github/workflows/trivy.yml @@ -30,7 +30,7 @@ jobs: - name: Build an image from Dockerfile run: | - docker build -f dev/api/Dockerfile -t docker.io/my-organization/my-app:${{ github.sha }} . + docker build -f doc/api/Dockerfile -t docker.io/my-organization/my-app:${{ github.sha }} . - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@7b7aa264d83dc58691451798b4d117d53d21edfe diff --git a/README.md b/README.md index 1462b351..b537bcbf 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,9 @@ Server and Client Go code is generated from the OpenAPI definition by [oapi-code Run the following command to generate the code, from the root folder: ```bash -oapi-codegen --config=oapi-codegen/schemas.cfg.yaml oapi-codegen/schemas.yaml -oapi-codegen --config=oapi-codegen/harvester.cfg.yaml oapi-codegen/harvester.yaml -oapi-codegen --config=oapi-codegen/server.cfg.yaml oapi-codegen/server.yaml +oapi-codegen --config=spec/api/schemas.cfg.yaml spec/api/schemas.yaml +oapi-codegen --config=spec/api/harvester.cfg.yaml spec/api/harvester.yaml +oapi-codegen --config=spec/api/management.cfg.yaml spec/api/management.yaml ``` Run the following command to have a live view of the API documentation: diff --git a/cmd/server/main.go b/cmd/server/main.go index a26fc7ff..4c743396 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -15,10 +15,7 @@ package main import ( "flag" "fmt" - "os" - serverapi "github.com/HewlettPackard/Galadriel/pkg/server/api/server" - "github.com/deepmap/oapi-codegen/pkg/middleware" "github.com/labstack/echo/v4" echomiddleware "github.com/labstack/echo/v4/middleware" ) @@ -27,17 +24,10 @@ func main() { var port = flag.Int("port", 8080, "Port for HTTP Galadriel server") flag.Parse() - swagger, err := serverapi.GetSwagger() - if err != nil { - fmt.Fprintf(os.Stderr, "Error loading swagger spec\n: %s", err) - os.Exit(1) - } - // Clear out the servers array in the swagger spec, that skips validating // that server names match. We don't know how this thing will be run. - swagger.Servers = nil - galadriel_server := serverapi.MyDumbServer{} + // galadriel_server := management.MyDumbServer{} // This is how you set up a basic Echo router router := echo.New() @@ -45,12 +35,8 @@ func main() { // Log all requests router.Use(echomiddleware.Logger()) - // Use our validation middleware to check all requests against the - // OpenAPI schema. - router.Use(middleware.OapiRequestValidator(swagger)) - // We now register our store above as the handler for the interface - serverapi.RegisterHandlers(router, galadriel_server) + // management.RegisterHandlers(router, galadriel_server) // And we serve HTTP until the world ends. router.Logger.Fatal(router.Start(fmt.Sprintf("0.0.0.0:%d", *port))) diff --git a/dev/api/Dockerfile b/doc/api/Dockerfile similarity index 88% rename from dev/api/Dockerfile rename to doc/api/Dockerfile index 2d66f203..7ef31841 100644 --- a/dev/api/Dockerfile +++ b/doc/api/Dockerfile @@ -5,7 +5,7 @@ EXPOSE 8000 WORKDIR /app -ADD dev/api/index.html /app/ +ADD doc/api/index.html /app/ ENTRYPOINT [ "python" ] diff --git a/dev/api/index.html b/doc/api/index.html similarity index 100% rename from dev/api/index.html rename to doc/api/index.html diff --git a/pkg/server/api/harvester/harvester.gen.go b/pkg/server/api/harvester/harvester.gen.go index b0f8046c..9bf5a131 100644 --- a/pkg/server/api/harvester/harvester.gen.go +++ b/pkg/server/api/harvester/harvester.gen.go @@ -4,17 +4,10 @@ package harvester import ( - "bytes" - "compress/gzip" - "encoding/base64" "fmt" "net/http" - "net/url" - "path" - "strings" "github.com/deepmap/oapi-codegen/pkg/runtime" - "github.com/getkin/kin-openapi/openapi3" "github.com/labstack/echo/v4" ) @@ -165,93 +158,3 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.PUT(baseURL+"/trustBundles/:trustBundleId", wrapper.UpdateTrustBundle) } - -// Base64 encoded, gzipped, json marshaled Swagger object -var swaggerSpec = []string{ - - "H4sIAAAAAAAC/9yWUWvkNhCA/4oYCn1x1tvLUYrfLlwv9VtIek/lHrTW2KsiS8podDl38X8vkuPGTnZ7", - "6VHSUAgY26PMp9E34z1A43rvLFoOUB3GArRtHVQHUBga0p61s1DBu6tasBM7FDGgEq0joS0jyYa17cSd", - "5r34RdJnDIwUNlAAazYIFdxc1dc/iwvSqkNxJi6lkYo0mimcUrx4d1VDAeluyvbDZrvZwliA82il11DB", - "eX5UgJe8T6RQfkCFJBPfNZp8DXvt06sO+ekOrpEj2SCkMaKdlqIStFgahGuFFBNwwEQntBW8xwX19Bwy", - "2pS9VlDBJfJxnpCZSfaYCgPVb4+5Wm1SCdYgu0EErwlv5mw6hd5GpAEKsLJPlV1HhGaPvUz7bh31klMA", - "k7ZdOovB48P9OBbPhmDJMZzKP798+dTtX7W+JBd9rY5TaMs/vn2ASMZ2SDCOnwogDN7ZgFmmN9ttujTO", - "Mtosj/Te6CanKH8PifSwyKAZ+7zwO8IWKthsyumvcX3vbDlFhs0ge5M8vgeQRHKAcRyLR0XokNcV+D6I", - "GRBydCuj4X/E+Cy0pyjR4hePTWoOJHKpWinoRLuVhyV2/X482X9pi0qyzLPDWRSOOmn1H3nxsX5aptkN", - "9fuvNVKtUv+mbl0i3U8tQiaNn1HNQqU58uDTehOQ7LiNmlBBxRTxZeX6xoN77NDrUqgAH49YEb2SjEJO", - "Y3bq+WkMrw5xN4h8LGtJPubFH+ZhvhTmZp4e36jMxPVSstxGDHzh1PA3p/Pl7O7u7iz9w7NIBm3jVMr4", - "LxzXfcIw18JRN3/rcxVU0ueR0W+fHqV1YkZ/HROLKQa+iFYZDOVhcVerPKaOCvnRGyeVkOLXh/gT4q0j", - "nilaxhC7vOproq2Q/3+enSjF+N+NzyXRK/sCjwVMPz0nvSIZqGDP7KuyNK6RZu8CV+dvzrc/lTB+Gv8M", - "AAD///73VeLZCwAA", -} - -// GetSwagger returns the content of the embedded swagger specification file -// or error if failed to decode -func decodeSpec() ([]byte, error) { - zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, "")) - if err != nil { - return nil, fmt.Errorf("error base64 decoding spec: %s", err) - } - zr, err := gzip.NewReader(bytes.NewReader(zipped)) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %s", err) - } - var buf bytes.Buffer - _, err = buf.ReadFrom(zr) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %s", err) - } - - return buf.Bytes(), nil -} - -var rawSpec = decodeSpecCached() - -// a naive cached of a decoded swagger spec -func decodeSpecCached() func() ([]byte, error) { - data, err := decodeSpec() - return func() ([]byte, error) { - return data, err - } -} - -// Constructs a synthetic filesystem for resolving external references when loading openapi specifications. -func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { - var res = make(map[string]func() ([]byte, error)) - if len(pathToFile) > 0 { - res[pathToFile] = rawSpec - } - - return res -} - -// GetSwagger returns the Swagger specification corresponding to the generated code -// in this file. The external references of Swagger specification are resolved. -// The logic of resolving external references is tightly connected to "import-mapping" feature. -// Externally referenced files must be embedded in the corresponding golang packages. -// Urls can be supported but this task was out of the scope. -func GetSwagger() (swagger *openapi3.T, err error) { - var resolvePath = PathToRawSpec("") - - loader := openapi3.NewLoader() - loader.IsExternalRefsAllowed = true - loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) { - var pathToFile = url.String() - pathToFile = path.Clean(pathToFile) - getSpec, ok := resolvePath[pathToFile] - if !ok { - err1 := fmt.Errorf("path not found: %s", pathToFile) - return nil, err1 - } - return getSpec() - } - var specData []byte - specData, err = rawSpec() - if err != nil { - return - } - swagger, err = loader.LoadFromData(specData) - if err != nil { - return - } - return -} diff --git a/pkg/server/api/server/handler.go b/pkg/server/api/management/handler.go similarity index 97% rename from pkg/server/api/server/handler.go rename to pkg/server/api/management/handler.go index 4672c98e..b9417152 100644 --- a/pkg/server/api/server/handler.go +++ b/pkg/server/api/management/handler.go @@ -1,4 +1,4 @@ -package server +package management import ( "errors" diff --git a/pkg/server/api/server/server.gen.go b/pkg/server/api/management/management.gen.go similarity index 85% rename from pkg/server/api/server/server.gen.go rename to pkg/server/api/management/management.gen.go index 1e54cd9f..957dd55e 100644 --- a/pkg/server/api/server/server.gen.go +++ b/pkg/server/api/management/management.gen.go @@ -1,20 +1,13 @@ -// Package server provides primitives to interact with the openapi HTTP API. +// Package management provides primitives to interact with the openapi HTTP API. // // Code generated by github.com/deepmap/oapi-codegen version v1.11.0 DO NOT EDIT. -package server +package management import ( - "bytes" - "compress/gzip" - "encoding/base64" "fmt" "net/http" - "net/url" - "path" - "strings" "github.com/deepmap/oapi-codegen/pkg/runtime" - "github.com/getkin/kin-openapi/openapi3" "github.com/labstack/echo/v4" ) @@ -705,109 +698,3 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.PUT(baseURL+"/trustBundles/:trustBundleId", wrapper.UpdateTrustBundle) } - -// Base64 encoded, gzipped, json marshaled Swagger object -var swaggerSpec = []string{ - - "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", - "hUAAAA==", -} - -// GetSwagger returns the content of the embedded swagger specification file -// or error if failed to decode -func decodeSpec() ([]byte, error) { - zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, "")) - if err != nil { - return nil, fmt.Errorf("error base64 decoding spec: %s", err) - } - zr, err := gzip.NewReader(bytes.NewReader(zipped)) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %s", err) - } - var buf bytes.Buffer - _, err = buf.ReadFrom(zr) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %s", err) - } - - return buf.Bytes(), nil -} - -var rawSpec = decodeSpecCached() - -// a naive cached of a decoded swagger spec -func decodeSpecCached() func() ([]byte, error) { - data, err := decodeSpec() - return func() ([]byte, error) { - return data, err - } -} - -// Constructs a synthetic filesystem for resolving external references when loading openapi specifications. -func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { - var res = make(map[string]func() ([]byte, error)) - if len(pathToFile) > 0 { - res[pathToFile] = rawSpec - } - - return res -} - -// GetSwagger returns the Swagger specification corresponding to the generated code -// in this file. The external references of Swagger specification are resolved. -// The logic of resolving external references is tightly connected to "import-mapping" feature. -// Externally referenced files must be embedded in the corresponding golang packages. -// Urls can be supported but this task was out of the scope. -func GetSwagger() (swagger *openapi3.T, err error) { - var resolvePath = PathToRawSpec("") - - loader := openapi3.NewLoader() - loader.IsExternalRefsAllowed = true - loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) { - var pathToFile = url.String() - pathToFile = path.Clean(pathToFile) - getSpec, ok := resolvePath[pathToFile] - if !ok { - err1 := fmt.Errorf("path not found: %s", pathToFile) - return nil, err1 - } - return getSpec() - } - var specData []byte - specData, err = rawSpec() - if err != nil { - return - } - swagger, err = loader.LoadFromData(specData) - if err != nil { - return - } - return -} diff --git a/pkg/server/api/server/handler_test.go b/pkg/server/api/server/handler_test.go deleted file mode 100644 index abb4e431..00000000 --- a/pkg/server/api/server/handler_test.go +++ /dev/null @@ -1 +0,0 @@ -package server diff --git a/oapi-codegen/harvester.cfg.yaml b/spec/api/harvester.cfg.yaml similarity index 87% rename from oapi-codegen/harvester.cfg.yaml rename to spec/api/harvester.cfg.yaml index 83355cad..7ef1df50 100644 --- a/oapi-codegen/harvester.cfg.yaml +++ b/spec/api/harvester.cfg.yaml @@ -3,7 +3,7 @@ generate: echo-server: true client: false models: true - embedded-spec: true + embedded-spec: false output: pkg/server/api/harvester/harvester.gen.go output-options: skip-prune: true \ No newline at end of file diff --git a/oapi-codegen/harvester.yaml b/spec/api/harvester.yaml similarity index 100% rename from oapi-codegen/harvester.yaml rename to spec/api/harvester.yaml diff --git a/oapi-codegen/server.cfg.yaml b/spec/api/management.cfg.yaml similarity index 50% rename from oapi-codegen/server.cfg.yaml rename to spec/api/management.cfg.yaml index 1b506fd1..24f5440b 100644 --- a/oapi-codegen/server.cfg.yaml +++ b/spec/api/management.cfg.yaml @@ -1,9 +1,9 @@ -package: server +package: management generate: echo-server: true client: false models: true - embedded-spec: true -output: pkg/server/api/server/server.gen.go + embedded-spec: false +output: pkg/server/api/management/management.gen.go output-options: skip-prune: true \ No newline at end of file diff --git a/oapi-codegen/server.yaml b/spec/api/management.yaml similarity index 100% rename from oapi-codegen/server.yaml rename to spec/api/management.yaml diff --git a/oapi-codegen/schemas.cfg.yaml b/spec/api/schemas.cfg.yaml similarity index 100% rename from oapi-codegen/schemas.cfg.yaml rename to spec/api/schemas.cfg.yaml diff --git a/oapi-codegen/schemas.yaml b/spec/api/schemas.yaml similarity index 100% rename from oapi-codegen/schemas.yaml rename to spec/api/schemas.yaml