mirror of
https://github.com/project-zot/zot.git
synced 2024-12-30 22:34:13 -05:00
feat(GraphQL): playground, served by zot in specific binary (#753)
Signed-off-by: Catalin Hofnar <catalin.hofnar@gmail.com>
This commit is contained in:
parent
c146448f01
commit
ffc9929c1a
9 changed files with 317 additions and 0 deletions
21
examples/config-search.json
Normal file
21
examples/config-search.json
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"distSpecVersion": "1.0.1-dev",
|
||||||
|
"storage": {
|
||||||
|
"rootDirectory": "/tmp/zot"
|
||||||
|
},
|
||||||
|
"http": {
|
||||||
|
"address": "127.0.0.1",
|
||||||
|
"port": "5000"
|
||||||
|
},
|
||||||
|
"log": {
|
||||||
|
"level": "debug"
|
||||||
|
},
|
||||||
|
"extensions": {
|
||||||
|
"search": {
|
||||||
|
"enable": true,
|
||||||
|
"cve": {
|
||||||
|
"updateInterval": "24h"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,7 @@ import (
|
||||||
artifactspec "github.com/oras-project/artifacts-spec/specs-go/v1"
|
artifactspec "github.com/oras-project/artifacts-spec/specs-go/v1"
|
||||||
zerr "zotregistry.io/zot/errors"
|
zerr "zotregistry.io/zot/errors"
|
||||||
"zotregistry.io/zot/pkg/api/constants"
|
"zotregistry.io/zot/pkg/api/constants"
|
||||||
|
gqlPlayground "zotregistry.io/zot/pkg/debug/gqlplayground"
|
||||||
debug "zotregistry.io/zot/pkg/debug/swagger"
|
debug "zotregistry.io/zot/pkg/debug/swagger"
|
||||||
ext "zotregistry.io/zot/pkg/extensions"
|
ext "zotregistry.io/zot/pkg/extensions"
|
||||||
"zotregistry.io/zot/pkg/log"
|
"zotregistry.io/zot/pkg/log"
|
||||||
|
@ -117,6 +118,7 @@ func (rh *RouteHandler) SetupRoutes() {
|
||||||
// extended build
|
// extended build
|
||||||
ext.SetupMetricsRoutes(rh.c.Config, rh.c.Router, rh.c.StoreController, rh.c.Log)
|
ext.SetupMetricsRoutes(rh.c.Config, rh.c.Router, rh.c.StoreController, rh.c.Log)
|
||||||
ext.SetupSearchRoutes(rh.c.Config, rh.c.Router, rh.c.StoreController, rh.c.Log)
|
ext.SetupSearchRoutes(rh.c.Config, rh.c.Router, rh.c.StoreController, rh.c.Log)
|
||||||
|
gqlPlayground.SetupGQLPlaygroundRoutes(rh.c.Config, rh.c.Router, rh.c.StoreController, rh.c.Log)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
6
pkg/debug/constants/consts.go
Normal file
6
pkg/debug/constants/consts.go
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
package constants
|
||||||
|
|
||||||
|
const (
|
||||||
|
Debug = "/_zot/debug"
|
||||||
|
GQLPlaygroundEndpoint = Debug + "/graphql-playground"
|
||||||
|
)
|
53
pkg/debug/gqlplayground/gqlplayground.go
Normal file
53
pkg/debug/gqlplayground/gqlplayground.go
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
//go:build debug
|
||||||
|
// +build debug
|
||||||
|
|
||||||
|
package debug
|
||||||
|
|
||||||
|
import (
|
||||||
|
"embed"
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"zotregistry.io/zot/pkg/api/config"
|
||||||
|
"zotregistry.io/zot/pkg/api/constants"
|
||||||
|
debugCst "zotregistry.io/zot/pkg/debug/constants"
|
||||||
|
"zotregistry.io/zot/pkg/log"
|
||||||
|
"zotregistry.io/zot/pkg/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
//go:embed index.html.tmpl
|
||||||
|
var playgroundHTML embed.FS
|
||||||
|
|
||||||
|
// SetupGQLPlaygroundRoutes ...
|
||||||
|
func SetupGQLPlaygroundRoutes(conf *config.Config, router *mux.Router,
|
||||||
|
storeController storage.StoreController, l log.Logger,
|
||||||
|
) {
|
||||||
|
log := log.Logger{Logger: l.With().Caller().Timestamp().Logger()}
|
||||||
|
log.Info().Msg("setting up graphql playground route")
|
||||||
|
|
||||||
|
templ, err := template.ParseFS(playgroundHTML, "gqlplayground/index.html.tmpl")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal().Err(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
//nolint:lll
|
||||||
|
router.PathPrefix(constants.RoutePrefix + debugCst.GQLPlaygroundEndpoint).HandlerFunc(func(writer http.ResponseWriter, req *http.Request) {
|
||||||
|
writer.Header().Add("Content-Type", "text/html")
|
||||||
|
|
||||||
|
proto := ""
|
||||||
|
|
||||||
|
if req.TLS == nil {
|
||||||
|
proto += "http://"
|
||||||
|
} else {
|
||||||
|
proto += "https://"
|
||||||
|
}
|
||||||
|
|
||||||
|
target := proto + req.Host + constants.ExtSearchPrefix
|
||||||
|
|
||||||
|
// respond with the output of template execution
|
||||||
|
_ = templ.Execute(writer, struct {
|
||||||
|
Target string
|
||||||
|
}{Target: target})
|
||||||
|
})
|
||||||
|
}
|
19
pkg/debug/gqlplayground/gqlplayground_disabled.go
Normal file
19
pkg/debug/gqlplayground/gqlplayground_disabled.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
//go:build !debug
|
||||||
|
// +build !debug
|
||||||
|
|
||||||
|
package debug
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"zotregistry.io/zot/pkg/api/config"
|
||||||
|
"zotregistry.io/zot/pkg/log"
|
||||||
|
"zotregistry.io/zot/pkg/storage"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SetupGQLPlaygroundRoutes ...
|
||||||
|
func SetupGQLPlaygroundRoutes(conf *config.Config, router *mux.Router,
|
||||||
|
storeController storage.StoreController, log log.Logger,
|
||||||
|
) {
|
||||||
|
log.Warn().Msg("skipping enabling graphql playground extension because given zot binary" +
|
||||||
|
"doesn't include this feature, please build a binary that does so")
|
||||||
|
}
|
67
pkg/debug/gqlplayground/index.html.tmpl
Normal file
67
pkg/debug/gqlplayground/index.html.tmpl
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<!--
|
||||||
|
* Copyright (c) 2021 GraphQL Contributors
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
-->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>zot GraphQL playground</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#graphiql {
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This GraphiQL example depends on Promise and fetch, which are available in
|
||||||
|
modern browsers, but can be "polyfilled" for older browsers.
|
||||||
|
GraphiQL itself depends on React DOM.
|
||||||
|
If you do not want to rely on a CDN, you can host these files locally or
|
||||||
|
include them directly in your favored resource bundler.
|
||||||
|
-->
|
||||||
|
<script
|
||||||
|
crossorigin
|
||||||
|
src="https://unpkg.com/react@17/umd/react.development.js"
|
||||||
|
></script>
|
||||||
|
<script
|
||||||
|
crossorigin
|
||||||
|
src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"
|
||||||
|
></script>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
These two files can be found in the npm module, however you may wish to
|
||||||
|
copy them directly into your environment, or perhaps include them in your
|
||||||
|
favored resource bundler.
|
||||||
|
-->
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/graphiql/graphiql.min.css" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="graphiql">Loading...</div>
|
||||||
|
<script
|
||||||
|
src="https://unpkg.com/graphiql/graphiql.min.js"
|
||||||
|
type="application/javascript"
|
||||||
|
></script>
|
||||||
|
<script>
|
||||||
|
ReactDOM.render(
|
||||||
|
React.createElement(GraphiQL, {
|
||||||
|
fetcher: GraphiQL.createFetcher({
|
||||||
|
url: {{.Target}},
|
||||||
|
}),
|
||||||
|
defaultEditorToolsVisibility: true,
|
||||||
|
}),
|
||||||
|
document.getElementById('graphiql'),
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -776,11 +776,17 @@ func (ec *executionContext) introspectType(name string) (*introspection.Type, er
|
||||||
var sources = []*ast.Source{
|
var sources = []*ast.Source{
|
||||||
{Name: "../schema.graphql", Input: `scalar Time
|
{Name: "../schema.graphql", Input: `scalar Time
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains the tag of the image and a list of CVEs
|
||||||
|
"""
|
||||||
type CVEResultForImage {
|
type CVEResultForImage {
|
||||||
Tag: String
|
Tag: String
|
||||||
CVEList: [CVE]
|
CVEList: [CVE]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains various details about the CVE and a list of PackageInfo about the affected packages
|
||||||
|
"""
|
||||||
type CVE {
|
type CVE {
|
||||||
Id: String
|
Id: String
|
||||||
Title: String
|
Title: String
|
||||||
|
@ -789,12 +795,18 @@ type CVE {
|
||||||
PackageList: [PackageInfo]
|
PackageList: [PackageInfo]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains the name of the package, the current installed version and the version where the CVE was fixed
|
||||||
|
"""
|
||||||
type PackageInfo {
|
type PackageInfo {
|
||||||
Name: String
|
Name: String
|
||||||
InstalledVersion: String
|
InstalledVersion: String
|
||||||
FixedVersion: String
|
FixedVersion: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains details about the repo: a list of image summaries and a summary of the repo
|
||||||
|
"""
|
||||||
type RepoInfo {
|
type RepoInfo {
|
||||||
Images: [ImageSummary]
|
Images: [ImageSummary]
|
||||||
Summary: RepoSummary
|
Summary: RepoSummary
|
||||||
|
@ -802,6 +814,9 @@ type RepoInfo {
|
||||||
|
|
||||||
# Search results in all repos/images/layers
|
# Search results in all repos/images/layers
|
||||||
# There will be other more structures for more detailed information
|
# There will be other more structures for more detailed information
|
||||||
|
"""
|
||||||
|
Search everything. Can search Images, Repos and Layers
|
||||||
|
"""
|
||||||
type GlobalSearchResult {
|
type GlobalSearchResult {
|
||||||
Images: [ImageSummary]
|
Images: [ImageSummary]
|
||||||
Repos: [RepoSummary]
|
Repos: [RepoSummary]
|
||||||
|
@ -810,6 +825,9 @@ type GlobalSearchResult {
|
||||||
|
|
||||||
# Brief on a specific image to be used in queries returning a list of images
|
# Brief on a specific image to be used in queries returning a list of images
|
||||||
# We define an image as a pairing or a repo and a tag belonging to that repo
|
# We define an image as a pairing or a repo and a tag belonging to that repo
|
||||||
|
"""
|
||||||
|
Contains details about the image
|
||||||
|
"""
|
||||||
type ImageSummary {
|
type ImageSummary {
|
||||||
RepoName: String
|
RepoName: String
|
||||||
Tag: String
|
Tag: String
|
||||||
|
@ -839,6 +857,9 @@ type ImageVulnerabilitySummary {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Brief on a specific repo to be used in queries returning a list of repos
|
# Brief on a specific repo to be used in queries returning a list of repos
|
||||||
|
"""
|
||||||
|
Contains details about the repo
|
||||||
|
"""
|
||||||
type RepoSummary {
|
type RepoSummary {
|
||||||
Name: String
|
Name: String
|
||||||
LastUpdated: Time
|
LastUpdated: Time
|
||||||
|
@ -854,6 +875,9 @@ type RepoSummary {
|
||||||
|
|
||||||
# Currently the same as LayerInfo, we can refactor later
|
# Currently the same as LayerInfo, we can refactor later
|
||||||
# For detailed information on the layer a ImageListForDigest call can be made
|
# For detailed information on the layer a ImageListForDigest call can be made
|
||||||
|
"""
|
||||||
|
Contains details about the layer
|
||||||
|
"""
|
||||||
type LayerSummary {
|
type LayerSummary {
|
||||||
Size: String # Int64 is not supported.
|
Size: String # Int64 is not supported.
|
||||||
Digest: String
|
Digest: String
|
||||||
|
@ -885,22 +909,68 @@ type LayerHistory {
|
||||||
HistoryDescription: HistoryDescription
|
HistoryDescription: HistoryDescription
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains details about the supported OS and architecture of the image
|
||||||
|
"""
|
||||||
type OsArch {
|
type OsArch {
|
||||||
Os: String
|
Os: String
|
||||||
Arch: String
|
Arch: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
|
"""
|
||||||
|
Returns a CVE list for the image specified in the arugment
|
||||||
|
"""
|
||||||
CVEListForImage(image: String!): CVEResultForImage!
|
CVEListForImage(image: String!): CVEResultForImage!
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of images vulnerable to the CVE of the specified ID
|
||||||
|
"""
|
||||||
ImageListForCVE(id: String!): [ImageSummary!]
|
ImageListForCVE(id: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of images that are no longer vulnerable to the CVE of the specified ID, from the specified image (repo)
|
||||||
|
"""
|
||||||
ImageListWithCVEFixed(id: String!, image: String!): [ImageSummary!]
|
ImageListWithCVEFixed(id: String!, image: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of images which contain the specified digest
|
||||||
|
"""
|
||||||
ImageListForDigest(id: String!): [ImageSummary!]
|
ImageListForDigest(id: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of repos with the newest tag within
|
||||||
|
"""
|
||||||
RepoListWithNewestImage: [RepoSummary!]! # Newest based on created timestamp
|
RepoListWithNewestImage: [RepoSummary!]! # Newest based on created timestamp
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns all the images from the specified repo
|
||||||
|
"""
|
||||||
ImageList(repo: String!): [ImageSummary!]
|
ImageList(repo: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns information about the specified repo
|
||||||
|
"""
|
||||||
ExpandedRepoInfo(repo: String!): RepoInfo!
|
ExpandedRepoInfo(repo: String!): RepoInfo!
|
||||||
|
|
||||||
|
"""
|
||||||
|
Searches within repos, images, and layers
|
||||||
|
"""
|
||||||
GlobalSearch(query: String!): GlobalSearchResult!
|
GlobalSearch(query: String!): GlobalSearchResult!
|
||||||
|
|
||||||
|
"""
|
||||||
|
List of images which use the argument image
|
||||||
|
"""
|
||||||
DerivedImageList(image: String!): [ImageSummary!]
|
DerivedImageList(image: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
List of images on which the argument image depends on
|
||||||
|
"""
|
||||||
BaseImageList(image: String!): [ImageSummary!]
|
BaseImageList(image: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Search for a specific image using its name
|
||||||
|
"""
|
||||||
Image(image: String!): ImageSummary
|
Image(image: String!): ImageSummary
|
||||||
}
|
}
|
||||||
`, BuiltIn: false},
|
`, BuiltIn: false},
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Contains various details about the CVE and a list of PackageInfo about the affected packages
|
||||||
type Cve struct {
|
type Cve struct {
|
||||||
ID *string `json:"Id"`
|
ID *string `json:"Id"`
|
||||||
Title *string `json:"Title"`
|
Title *string `json:"Title"`
|
||||||
|
@ -14,11 +15,13 @@ type Cve struct {
|
||||||
PackageList []*PackageInfo `json:"PackageList"`
|
PackageList []*PackageInfo `json:"PackageList"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains the tag of the image and a list of CVEs
|
||||||
type CVEResultForImage struct {
|
type CVEResultForImage struct {
|
||||||
Tag *string `json:"Tag"`
|
Tag *string `json:"Tag"`
|
||||||
CVEList []*Cve `json:"CVEList"`
|
CVEList []*Cve `json:"CVEList"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Search everything. Can search Images, Repos and Layers
|
||||||
type GlobalSearchResult struct {
|
type GlobalSearchResult struct {
|
||||||
Images []*ImageSummary `json:"Images"`
|
Images []*ImageSummary `json:"Images"`
|
||||||
Repos []*RepoSummary `json:"Repos"`
|
Repos []*RepoSummary `json:"Repos"`
|
||||||
|
@ -37,6 +40,7 @@ type HistoryDescription struct {
|
||||||
EmptyLayer *bool `json:"EmptyLayer"`
|
EmptyLayer *bool `json:"EmptyLayer"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains details about the image
|
||||||
type ImageSummary struct {
|
type ImageSummary struct {
|
||||||
RepoName *string `json:"RepoName"`
|
RepoName *string `json:"RepoName"`
|
||||||
Tag *string `json:"Tag"`
|
Tag *string `json:"Tag"`
|
||||||
|
@ -70,28 +74,33 @@ type LayerHistory struct {
|
||||||
HistoryDescription *HistoryDescription `json:"HistoryDescription"`
|
HistoryDescription *HistoryDescription `json:"HistoryDescription"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains details about the layer
|
||||||
type LayerSummary struct {
|
type LayerSummary struct {
|
||||||
Size *string `json:"Size"`
|
Size *string `json:"Size"`
|
||||||
Digest *string `json:"Digest"`
|
Digest *string `json:"Digest"`
|
||||||
Score *int `json:"Score"`
|
Score *int `json:"Score"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains details about the supported OS and architecture of the image
|
||||||
type OsArch struct {
|
type OsArch struct {
|
||||||
Os *string `json:"Os"`
|
Os *string `json:"Os"`
|
||||||
Arch *string `json:"Arch"`
|
Arch *string `json:"Arch"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains the name of the package, the current installed version and the version where the CVE was fixed
|
||||||
type PackageInfo struct {
|
type PackageInfo struct {
|
||||||
Name *string `json:"Name"`
|
Name *string `json:"Name"`
|
||||||
InstalledVersion *string `json:"InstalledVersion"`
|
InstalledVersion *string `json:"InstalledVersion"`
|
||||||
FixedVersion *string `json:"FixedVersion"`
|
FixedVersion *string `json:"FixedVersion"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains details about the repo: a list of image summaries and a summary of the repo
|
||||||
type RepoInfo struct {
|
type RepoInfo struct {
|
||||||
Images []*ImageSummary `json:"Images"`
|
Images []*ImageSummary `json:"Images"`
|
||||||
Summary *RepoSummary `json:"Summary"`
|
Summary *RepoSummary `json:"Summary"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Contains details about the repo
|
||||||
type RepoSummary struct {
|
type RepoSummary struct {
|
||||||
Name *string `json:"Name"`
|
Name *string `json:"Name"`
|
||||||
LastUpdated *time.Time `json:"LastUpdated"`
|
LastUpdated *time.Time `json:"LastUpdated"`
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
scalar Time
|
scalar Time
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains the tag of the image and a list of CVEs
|
||||||
|
"""
|
||||||
type CVEResultForImage {
|
type CVEResultForImage {
|
||||||
Tag: String
|
Tag: String
|
||||||
CVEList: [CVE]
|
CVEList: [CVE]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains various details about the CVE and a list of PackageInfo about the affected packages
|
||||||
|
"""
|
||||||
type CVE {
|
type CVE {
|
||||||
Id: String
|
Id: String
|
||||||
Title: String
|
Title: String
|
||||||
|
@ -13,12 +19,18 @@ type CVE {
|
||||||
PackageList: [PackageInfo]
|
PackageList: [PackageInfo]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains the name of the package, the current installed version and the version where the CVE was fixed
|
||||||
|
"""
|
||||||
type PackageInfo {
|
type PackageInfo {
|
||||||
Name: String
|
Name: String
|
||||||
InstalledVersion: String
|
InstalledVersion: String
|
||||||
FixedVersion: String
|
FixedVersion: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains details about the repo: a list of image summaries and a summary of the repo
|
||||||
|
"""
|
||||||
type RepoInfo {
|
type RepoInfo {
|
||||||
Images: [ImageSummary]
|
Images: [ImageSummary]
|
||||||
Summary: RepoSummary
|
Summary: RepoSummary
|
||||||
|
@ -26,6 +38,9 @@ type RepoInfo {
|
||||||
|
|
||||||
# Search results in all repos/images/layers
|
# Search results in all repos/images/layers
|
||||||
# There will be other more structures for more detailed information
|
# There will be other more structures for more detailed information
|
||||||
|
"""
|
||||||
|
Search everything. Can search Images, Repos and Layers
|
||||||
|
"""
|
||||||
type GlobalSearchResult {
|
type GlobalSearchResult {
|
||||||
Images: [ImageSummary]
|
Images: [ImageSummary]
|
||||||
Repos: [RepoSummary]
|
Repos: [RepoSummary]
|
||||||
|
@ -34,6 +49,9 @@ type GlobalSearchResult {
|
||||||
|
|
||||||
# Brief on a specific image to be used in queries returning a list of images
|
# Brief on a specific image to be used in queries returning a list of images
|
||||||
# We define an image as a pairing or a repo and a tag belonging to that repo
|
# We define an image as a pairing or a repo and a tag belonging to that repo
|
||||||
|
"""
|
||||||
|
Contains details about the image
|
||||||
|
"""
|
||||||
type ImageSummary {
|
type ImageSummary {
|
||||||
RepoName: String
|
RepoName: String
|
||||||
Tag: String
|
Tag: String
|
||||||
|
@ -63,6 +81,9 @@ type ImageVulnerabilitySummary {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Brief on a specific repo to be used in queries returning a list of repos
|
# Brief on a specific repo to be used in queries returning a list of repos
|
||||||
|
"""
|
||||||
|
Contains details about the repo
|
||||||
|
"""
|
||||||
type RepoSummary {
|
type RepoSummary {
|
||||||
Name: String
|
Name: String
|
||||||
LastUpdated: Time
|
LastUpdated: Time
|
||||||
|
@ -78,6 +99,9 @@ type RepoSummary {
|
||||||
|
|
||||||
# Currently the same as LayerInfo, we can refactor later
|
# Currently the same as LayerInfo, we can refactor later
|
||||||
# For detailed information on the layer a ImageListForDigest call can be made
|
# For detailed information on the layer a ImageListForDigest call can be made
|
||||||
|
"""
|
||||||
|
Contains details about the layer
|
||||||
|
"""
|
||||||
type LayerSummary {
|
type LayerSummary {
|
||||||
Size: String # Int64 is not supported.
|
Size: String # Int64 is not supported.
|
||||||
Digest: String
|
Digest: String
|
||||||
|
@ -109,21 +133,67 @@ type LayerHistory {
|
||||||
HistoryDescription: HistoryDescription
|
HistoryDescription: HistoryDescription
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
Contains details about the supported OS and architecture of the image
|
||||||
|
"""
|
||||||
type OsArch {
|
type OsArch {
|
||||||
Os: String
|
Os: String
|
||||||
Arch: String
|
Arch: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type Query {
|
type Query {
|
||||||
|
"""
|
||||||
|
Returns a CVE list for the image specified in the arugment
|
||||||
|
"""
|
||||||
CVEListForImage(image: String!): CVEResultForImage!
|
CVEListForImage(image: String!): CVEResultForImage!
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of images vulnerable to the CVE of the specified ID
|
||||||
|
"""
|
||||||
ImageListForCVE(id: String!): [ImageSummary!]
|
ImageListForCVE(id: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of images that are no longer vulnerable to the CVE of the specified ID, from the specified image (repo)
|
||||||
|
"""
|
||||||
ImageListWithCVEFixed(id: String!, image: String!): [ImageSummary!]
|
ImageListWithCVEFixed(id: String!, image: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of images which contain the specified digest
|
||||||
|
"""
|
||||||
ImageListForDigest(id: String!): [ImageSummary!]
|
ImageListForDigest(id: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns a list of repos with the newest tag within
|
||||||
|
"""
|
||||||
RepoListWithNewestImage: [RepoSummary!]! # Newest based on created timestamp
|
RepoListWithNewestImage: [RepoSummary!]! # Newest based on created timestamp
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns all the images from the specified repo
|
||||||
|
"""
|
||||||
ImageList(repo: String!): [ImageSummary!]
|
ImageList(repo: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Returns information about the specified repo
|
||||||
|
"""
|
||||||
ExpandedRepoInfo(repo: String!): RepoInfo!
|
ExpandedRepoInfo(repo: String!): RepoInfo!
|
||||||
|
|
||||||
|
"""
|
||||||
|
Searches within repos, images, and layers
|
||||||
|
"""
|
||||||
GlobalSearch(query: String!): GlobalSearchResult!
|
GlobalSearch(query: String!): GlobalSearchResult!
|
||||||
|
|
||||||
|
"""
|
||||||
|
List of images which use the argument image
|
||||||
|
"""
|
||||||
DerivedImageList(image: String!): [ImageSummary!]
|
DerivedImageList(image: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
List of images on which the argument image depends on
|
||||||
|
"""
|
||||||
BaseImageList(image: String!): [ImageSummary!]
|
BaseImageList(image: String!): [ImageSummary!]
|
||||||
|
|
||||||
|
"""
|
||||||
|
Search for a specific image using its name
|
||||||
|
"""
|
||||||
Image(image: String!): ImageSummary
|
Image(image: String!): ImageSummary
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue