Merge pull request #603 from Random-Liu/support-shared-pid
Support shared pid
This commit is contained in:
commit
5e7347db53
@ -7,7 +7,7 @@
|
|||||||
[](https://travis-ci.org/containerd/cri-containerd)
|
[](https://travis-ci.org/containerd/cri-containerd)
|
||||||
[](https://goreportcard.com/report/github.com/containerd/cri-containerd)
|
[](https://goreportcard.com/report/github.com/containerd/cri-containerd)
|
||||||
|
|
||||||
`cri-containerd` is a [containerd](https://containerd.io/) based implementation of Kubernetes [container runtime interface (CRI)](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto).
|
`cri-containerd` is a [containerd](https://containerd.io/) based implementation of Kubernetes [container runtime interface (CRI)](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto).
|
||||||
|
|
||||||
With it, you could run Kubernetes using containerd as the container runtime.
|
With it, you could run Kubernetes using containerd as the container runtime.
|
||||||

|

|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Architecture of CRI-Containerd
|
# Architecture of CRI-Containerd
|
||||||
This document describes the architecture of `cri-containerd`.
|
This document describes the architecture of `cri-containerd`.
|
||||||
|
|
||||||
Cri-containerd is a containerd based implementation of Kubernetes [container runtime interface (CRI)](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/apis/cri/v1alpha1/runtime/api.proto). It operates on the same node as the [Kubelet](https://kubernetes.io/docs/reference/generated/kubelet/) and [containerd](https://github.com/containerd/containerd). Layered between Kubernetes and containerd, cri-containerd handles all CRI service requests from the Kubelet and uses containerd to manage containers and container images.
|
Cri-containerd is a containerd based implementation of Kubernetes [container runtime interface (CRI)](https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto). It operates on the same node as the [Kubelet](https://kubernetes.io/docs/reference/generated/kubelet/) and [containerd](https://github.com/containerd/containerd). Layered between Kubernetes and containerd, cri-containerd handles all CRI service requests from the Kubelet and uses containerd to manage containers and container images.
|
||||||
|
|
||||||
Cri-containerd uses containerd to manage the full container lifecycle and all container images. As also shown below, cri-containerd manages pod networking via [CNI](https://github.com/containernetworking/cni) (another CNCF project).
|
Cri-containerd uses containerd to manage the full container lifecycle and all container images. As also shown below, cri-containerd manages pod networking via [CNI](https://github.com/containernetworking/cni) (another CNCF project).
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ e1c83b0b8d481d4af8ba98d5f7812577fc175a37b10dc824335951f52addbb4e
|
|||||||
$ crictl pods
|
$ crictl pods
|
||||||
PODSANDBOX ID CREATED STATE NAME NAMESPACE ATTEMPT
|
PODSANDBOX ID CREATED STATE NAME NAMESPACE ATTEMPT
|
||||||
e1c83b0b8d481 2 hours ago SANDBOX_READY nginx-sandbox default 1
|
e1c83b0b8d481 2 hours ago SANDBOX_READY nginx-sandbox default 1
|
||||||
$ crictl inspects e1c8
|
$ crictl inspectp e1c8
|
||||||
... displays information about the pod and the pod sandbox pause container.
|
... displays information about the pod and the pod sandbox pause container.
|
||||||
```
|
```
|
||||||
* Note: As shown above, you may use truncated IDs if they are unique.
|
* Note: As shown above, you may use truncated IDs if they are unique.
|
||||||
|
@ -31,13 +31,13 @@ crictl_rm_stopped_containers() {
|
|||||||
|
|
||||||
crictl_stop_pods() {
|
crictl_stop_pods() {
|
||||||
for x in $($CRICTL_CLI pods | awk '{ print $1 }' | awk '{if(NR>1)print}') ;do
|
for x in $($CRICTL_CLI pods | awk '{ print $1 }' | awk '{if(NR>1)print}') ;do
|
||||||
$CRICTL_CLI stops $x
|
$CRICTL_CLI stopp $x
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
crictl_rm_pods() {
|
crictl_rm_pods() {
|
||||||
for x in $($CRICTL_CLI pods | awk '{ print $1 }' | awk '{if(NR>1)print}') ;do
|
for x in $($CRICTL_CLI pods | awk '{ print $1 }' | awk '{if(NR>1)print}') ;do
|
||||||
$CRICTL_CLI rms $x
|
$CRICTL_CLI rmp $x
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,5 +2,5 @@ RUNC_VERSION=9f9c96235cc97674e935002fc3d78361b696a69e
|
|||||||
CNI_VERSION=v0.6.0
|
CNI_VERSION=v0.6.0
|
||||||
CONTAINERD_VERSION=f12ba2407e328c98f8be5eacbb9c510b073dd4c0
|
CONTAINERD_VERSION=f12ba2407e328c98f8be5eacbb9c510b073dd4c0
|
||||||
CONTAINERD_REPO=
|
CONTAINERD_REPO=
|
||||||
CRITOOL_VERSION=ded07bb08aa23492fa0233bb3af8c4629875f286
|
CRITOOL_VERSION=240a840375cdabb5860c75c99e8b0d0a776006b4
|
||||||
KUBERNETES_VERSION=v1.9.0
|
KUBERNETES_VERSION=0caa20c65f147e15f5545862510eb7e81c42b0a3
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Test to verify for a container ID
|
// Test to verify for a container ID
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func checkMemoryLimit(t *testing.T, spec *runtimespec.Spec, memLimit int64) {
|
func checkMemoryLimit(t *testing.T, spec *runtimespec.Spec, memLimit int64) {
|
||||||
|
@ -25,7 +25,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
api "github.com/containerd/cri-containerd/pkg/api/v1"
|
api "github.com/containerd/cri-containerd/pkg/api/v1"
|
||||||
)
|
)
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestImageFSInfo(t *testing.T) {
|
func TestImageFSInfo(t *testing.T) {
|
||||||
|
@ -27,7 +27,7 @@ import (
|
|||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Restart test must run sequentially.
|
// Restart test must run sequentially.
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSandboxCleanRemove(t *testing.T) {
|
func TestSandboxCleanRemove(t *testing.T) {
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"github.com/containerd/containerd"
|
"github.com/containerd/containerd"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri"
|
"k8s.io/kubernetes/pkg/kubelet/apis/cri"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/remote"
|
"k8s.io/kubernetes/pkg/kubelet/remote"
|
||||||
|
|
||||||
api "github.com/containerd/cri-containerd/pkg/api/v1"
|
api "github.com/containerd/cri-containerd/pkg/api/v1"
|
||||||
@ -104,7 +104,7 @@ func WithHostNetwork(p *runtime.PodSandboxConfig) {
|
|||||||
}
|
}
|
||||||
if p.Linux.SecurityContext.NamespaceOptions == nil {
|
if p.Linux.SecurityContext.NamespaceOptions == nil {
|
||||||
p.Linux.SecurityContext.NamespaceOptions = &runtime.NamespaceOption{
|
p.Linux.SecurityContext.NamespaceOptions = &runtime.NamespaceOption{
|
||||||
HostNetwork: true,
|
Network: runtime.NamespaceMode_NODE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtimeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func genTruncIndex(normalName string) string {
|
func genTruncIndex(normalName string) string {
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestVolumeCopyUp(t *testing.T) {
|
func TestVolumeCopyUp(t *testing.T) {
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/client-go/tools/remotecommand"
|
"k8s.io/client-go/tools/remotecommand"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
||||||
)
|
)
|
||||||
|
@ -43,7 +43,7 @@ import (
|
|||||||
"github.com/syndtr/gocapability/capability"
|
"github.com/syndtr/gocapability/capability"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/annotations"
|
"github.com/containerd/cri-containerd/pkg/annotations"
|
||||||
customopts "github.com/containerd/cri-containerd/pkg/containerd/opts"
|
customopts "github.com/containerd/cri-containerd/pkg/containerd/opts"
|
||||||
@ -427,7 +427,7 @@ func (c *criContainerdService) generateContainerMounts(sandboxRootDir string, co
|
|||||||
|
|
||||||
if !isInCRIMounts(devShm, config.GetMounts()) {
|
if !isInCRIMounts(devShm, config.GetMounts()) {
|
||||||
sandboxDevShm := getSandboxDevShm(sandboxRootDir)
|
sandboxDevShm := getSandboxDevShm(sandboxRootDir)
|
||||||
if securityContext.GetNamespaceOptions().GetHostIpc() {
|
if securityContext.GetNamespaceOptions().GetIpc() == runtime.NamespaceMode_NODE {
|
||||||
sandboxDevShm = devShm
|
sandboxDevShm = devShm
|
||||||
}
|
}
|
||||||
mounts = append(mounts, &runtime.Mount{
|
mounts = append(mounts, &runtime.Mount{
|
||||||
@ -718,9 +718,9 @@ func setOCINamespaces(g *generate.Generator, namespaces *runtime.NamespaceOption
|
|||||||
g.AddOrReplaceLinuxNamespace(string(runtimespec.NetworkNamespace), getNetworkNamespace(sandboxPid)) // nolint: errcheck
|
g.AddOrReplaceLinuxNamespace(string(runtimespec.NetworkNamespace), getNetworkNamespace(sandboxPid)) // nolint: errcheck
|
||||||
g.AddOrReplaceLinuxNamespace(string(runtimespec.IPCNamespace), getIPCNamespace(sandboxPid)) // nolint: errcheck
|
g.AddOrReplaceLinuxNamespace(string(runtimespec.IPCNamespace), getIPCNamespace(sandboxPid)) // nolint: errcheck
|
||||||
g.AddOrReplaceLinuxNamespace(string(runtimespec.UTSNamespace), getUTSNamespace(sandboxPid)) // nolint: errcheck
|
g.AddOrReplaceLinuxNamespace(string(runtimespec.UTSNamespace), getUTSNamespace(sandboxPid)) // nolint: errcheck
|
||||||
// Do not share pid namespace for now.
|
// Do not share pid namespace if namespace mode is CONTAINER.
|
||||||
if namespaces.GetHostPid() {
|
if namespaces.GetPid() != runtime.NamespaceMode_CONTAINER {
|
||||||
g.RemoveLinuxNamespace(string(runtimespec.PIDNamespace)) // nolint: errcheck
|
g.AddOrReplaceLinuxNamespace(string(runtimespec.PIDNamespace), getPIDNamespace(sandboxPid)) // nolint: errcheck
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ import (
|
|||||||
"github.com/opencontainers/runtime-tools/generate"
|
"github.com/opencontainers/runtime-tools/generate"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/annotations"
|
"github.com/containerd/cri-containerd/pkg/annotations"
|
||||||
ostesting "github.com/containerd/cri-containerd/pkg/os/testing"
|
ostesting "github.com/containerd/cri-containerd/pkg/os/testing"
|
||||||
@ -169,6 +169,10 @@ func getCreateContainerTestData() (*runtime.ContainerConfig, *runtime.PodSandbox
|
|||||||
Type: runtimespec.UTSNamespace,
|
Type: runtimespec.UTSNamespace,
|
||||||
Path: getUTSNamespace(sandboxPid),
|
Path: getUTSNamespace(sandboxPid),
|
||||||
})
|
})
|
||||||
|
assert.Contains(t, spec.Linux.Namespaces, runtimespec.LinuxNamespace{
|
||||||
|
Type: runtimespec.PIDNamespace,
|
||||||
|
Path: getPIDNamespace(sandboxPid),
|
||||||
|
})
|
||||||
|
|
||||||
t.Logf("Check PodSandbox annotations")
|
t.Logf("Check PodSandbox annotations")
|
||||||
assert.Contains(t, spec.Annotations, annotations.SandboxID)
|
assert.Contains(t, spec.Annotations, annotations.SandboxID)
|
||||||
@ -543,7 +547,7 @@ func TestGenerateContainerMounts(t *testing.T) {
|
|||||||
},
|
},
|
||||||
"should use host /dev/shm when host ipc is set": {
|
"should use host /dev/shm when host ipc is set": {
|
||||||
securityContext: &runtime.LinuxContainerSecurityContext{
|
securityContext: &runtime.LinuxContainerSecurityContext{
|
||||||
NamespaceOptions: &runtime.NamespaceOption{HostIpc: true},
|
NamespaceOptions: &runtime.NamespaceOption{Ipc: runtime.NamespaceMode_NODE},
|
||||||
},
|
},
|
||||||
expectedMounts: []*runtime.Mount{
|
expectedMounts: []*runtime.Mount{
|
||||||
{
|
{
|
||||||
@ -748,25 +752,39 @@ func TestPidNamespace(t *testing.T) {
|
|||||||
testID := "test-id"
|
testID := "test-id"
|
||||||
testPid := uint32(1234)
|
testPid := uint32(1234)
|
||||||
testSandboxID := "sandbox-id"
|
testSandboxID := "sandbox-id"
|
||||||
config, sandboxConfig, imageConfig, specCheck := getCreateContainerTestData()
|
config, sandboxConfig, imageConfig, _ := getCreateContainerTestData()
|
||||||
c := newTestCRIContainerdService()
|
c := newTestCRIContainerdService()
|
||||||
t.Logf("should not set pid namespace when host pid is true")
|
for desc, test := range map[string]struct {
|
||||||
config.Linux.SecurityContext.NamespaceOptions = &runtime.NamespaceOption{HostPid: true}
|
pidNS runtime.NamespaceMode
|
||||||
spec, err := c.generateContainerSpec(testID, testSandboxID, testPid, config, sandboxConfig, imageConfig, nil)
|
expected runtimespec.LinuxNamespace
|
||||||
require.NoError(t, err)
|
}{
|
||||||
specCheck(t, testID, testSandboxID, testPid, spec)
|
"node namespace mode": {
|
||||||
for _, ns := range spec.Linux.Namespaces {
|
pidNS: runtime.NamespaceMode_NODE,
|
||||||
assert.NotEqual(t, ns.Type, runtimespec.PIDNamespace)
|
expected: runtimespec.LinuxNamespace{
|
||||||
|
Type: runtimespec.PIDNamespace,
|
||||||
|
Path: getPIDNamespace(testPid),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"container namespace mode": {
|
||||||
|
pidNS: runtime.NamespaceMode_CONTAINER,
|
||||||
|
expected: runtimespec.LinuxNamespace{
|
||||||
|
Type: runtimespec.PIDNamespace,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"pod namespace mode": {
|
||||||
|
pidNS: runtime.NamespaceMode_POD,
|
||||||
|
expected: runtimespec.LinuxNamespace{
|
||||||
|
Type: runtimespec.PIDNamespace,
|
||||||
|
Path: getPIDNamespace(testPid),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} {
|
||||||
|
t.Logf("TestCase %q", desc)
|
||||||
|
config.Linux.SecurityContext.NamespaceOptions = &runtime.NamespaceOption{Pid: test.pidNS}
|
||||||
|
spec, err := c.generateContainerSpec(testID, testSandboxID, testPid, config, sandboxConfig, imageConfig, nil)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Contains(t, spec.Linux.Namespaces, test.expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Logf("should set pid namespace when host pid is false")
|
|
||||||
config.Linux.SecurityContext.NamespaceOptions = &runtime.NamespaceOption{HostPid: false}
|
|
||||||
spec, err = c.generateContainerSpec(testID, testSandboxID, testPid, config, sandboxConfig, imageConfig, nil)
|
|
||||||
require.NoError(t, err)
|
|
||||||
specCheck(t, testID, testSandboxID, testPid, spec)
|
|
||||||
assert.Contains(t, spec.Linux.Namespaces, runtimespec.LinuxNamespace{
|
|
||||||
Type: runtimespec.PIDNamespace,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDefaultRuntimeSpec(t *testing.T) {
|
func TestDefaultRuntimeSpec(t *testing.T) {
|
||||||
|
@ -20,7 +20,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Exec prepares a streaming endpoint to execute a command in the container, and returns the address.
|
// Exec prepares a streaming endpoint to execute a command in the container, and returns the address.
|
||||||
|
@ -29,7 +29,7 @@ import (
|
|||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
"k8s.io/client-go/tools/remotecommand"
|
"k8s.io/client-go/tools/remotecommand"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cioutil "github.com/containerd/cri-containerd/pkg/ioutil"
|
cioutil "github.com/containerd/cri-containerd/pkg/ioutil"
|
||||||
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
||||||
|
@ -19,7 +19,7 @@ package server
|
|||||||
import (
|
import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
)
|
)
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
|
31
pkg/server/container_log_reopen.go
Normal file
31
pkg/server/container_log_reopen.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2018 The Containerd Authors.
|
||||||
|
|
||||||
|
Licensed 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 server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ReopenContainerLog asks cri-containerd to reopen the stdout/stderr log file for the container.
|
||||||
|
// This is often called after the log file has been rotated.
|
||||||
|
// TODO(random-liu): Implement this for kubelet log rotation.
|
||||||
|
func (c *criContainerdService) ReopenContainerLog(ctx context.Context, r *runtime.ReopenContainerLogRequest) (*runtime.ReopenContainerLogResponse, error) {
|
||||||
|
return nil, errors.New("not implemented")
|
||||||
|
}
|
@ -24,7 +24,7 @@ import (
|
|||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/log"
|
"github.com/containerd/cri-containerd/pkg/log"
|
||||||
"github.com/containerd/cri-containerd/pkg/store"
|
"github.com/containerd/cri-containerd/pkg/store"
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
tasks "github.com/containerd/containerd/api/services/tasks/v1"
|
tasks "github.com/containerd/containerd/api/services/tasks/v1"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ContainerStats returns stats of the container. If the container does not
|
// ContainerStats returns stats of the container. If the container does not
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
"github.com/containerd/containerd/api/types"
|
"github.com/containerd/containerd/api/types"
|
||||||
"github.com/containerd/typeurl"
|
"github.com/containerd/typeurl"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
)
|
)
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
)
|
)
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
)
|
)
|
||||||
|
@ -27,7 +27,7 @@ import (
|
|||||||
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
"github.com/containerd/cri-containerd/pkg/util"
|
"github.com/containerd/cri-containerd/pkg/util"
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestUpdateOCILinuxResource(t *testing.T) {
|
func TestUpdateOCILinuxResource(t *testing.T) {
|
||||||
|
@ -36,7 +36,7 @@ import (
|
|||||||
"github.com/opencontainers/selinux/go-selinux"
|
"github.com/opencontainers/selinux/go-selinux"
|
||||||
"github.com/opencontainers/selinux/go-selinux/label"
|
"github.com/opencontainers/selinux/go-selinux/label"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
"k8s.io/kubernetes/pkg/util/sysctl"
|
"k8s.io/kubernetes/pkg/util/sysctl"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/store"
|
"github.com/containerd/cri-containerd/pkg/store"
|
||||||
@ -84,6 +84,8 @@ const (
|
|||||||
ipcNSFormat = "/proc/%v/ns/ipc"
|
ipcNSFormat = "/proc/%v/ns/ipc"
|
||||||
// utsNSFormat is the format of uts namespace of a process.
|
// utsNSFormat is the format of uts namespace of a process.
|
||||||
utsNSFormat = "/proc/%v/ns/uts"
|
utsNSFormat = "/proc/%v/ns/uts"
|
||||||
|
// pidNSFormat is the format of pid namespace of a process.
|
||||||
|
pidNSFormat = "/proc/%v/ns/pid"
|
||||||
// devShm is the default path of /dev/shm.
|
// devShm is the default path of /dev/shm.
|
||||||
devShm = "/dev/shm"
|
devShm = "/dev/shm"
|
||||||
// etcHosts is the default path of /etc/hosts file.
|
// etcHosts is the default path of /etc/hosts file.
|
||||||
@ -183,6 +185,11 @@ func getUTSNamespace(pid uint32) string {
|
|||||||
return fmt.Sprintf(utsNSFormat, pid)
|
return fmt.Sprintf(utsNSFormat, pid)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getPIDNamespace returns the pid namespace of a process.
|
||||||
|
func getPIDNamespace(pid uint32) string {
|
||||||
|
return fmt.Sprintf(pidNSFormat, pid)
|
||||||
|
}
|
||||||
|
|
||||||
// criContainerStateToString formats CRI container state to string.
|
// criContainerStateToString formats CRI container state to string.
|
||||||
func criContainerStateToString(state runtime.ContainerState) string {
|
func criContainerStateToString(state runtime.ContainerState) string {
|
||||||
return runtime.ContainerState_name[int32(state)]
|
return runtime.ContainerState_name[int32(state)]
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
|
|
||||||
"github.com/opencontainers/selinux/go-selinux"
|
"github.com/opencontainers/selinux/go-selinux"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestInitSelinuxOpts(t *testing.T) {
|
func TestInitSelinuxOpts(t *testing.T) {
|
||||||
|
@ -18,7 +18,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
||||||
)
|
)
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
||||||
)
|
)
|
||||||
|
@ -28,7 +28,7 @@ import (
|
|||||||
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
containerdresolver "github.com/containerd/cri-containerd/pkg/containerd/resolver"
|
containerdresolver "github.com/containerd/cri-containerd/pkg/containerd/resolver"
|
||||||
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestParseAuth(t *testing.T) {
|
func TestParseAuth(t *testing.T) {
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"github.com/containerd/containerd/images"
|
"github.com/containerd/containerd/images"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RemoveImage removes the image.
|
// RemoveImage removes the image.
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
||||||
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
imagespec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
imagestore "github.com/containerd/cri-containerd/pkg/store/image"
|
||||||
)
|
)
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ImageFsInfo returns information of the filesystem that is used to store images.
|
// ImageFsInfo returns information of the filesystem that is used to store images.
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
snapshotstore "github.com/containerd/cri-containerd/pkg/store/snapshot"
|
snapshotstore "github.com/containerd/cri-containerd/pkg/store/snapshot"
|
||||||
)
|
)
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
api "github.com/containerd/cri-containerd/pkg/api/v1"
|
api "github.com/containerd/cri-containerd/pkg/api/v1"
|
||||||
"github.com/containerd/cri-containerd/pkg/log"
|
"github.com/containerd/cri-containerd/pkg/log"
|
||||||
@ -461,3 +461,18 @@ func (in *instrumentedService) LoadImage(ctx context.Context, r *api.LoadImageRe
|
|||||||
}()
|
}()
|
||||||
return in.c.LoadImage(ctx, r)
|
return in.c.LoadImage(ctx, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (in *instrumentedService) ReopenContainerLog(ctx context.Context, r *runtime.ReopenContainerLogRequest) (res *runtime.ReopenContainerLogResponse, err error) {
|
||||||
|
if err := in.checkInitialized(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
logrus.Debugf("ReopenContainerLog for %q", r.GetContainerId())
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
logrus.WithError(err).Errorf("ReopenContainerLog for %q failed", r.GetContainerId())
|
||||||
|
} else {
|
||||||
|
logrus.Debugf("ReopenContainerLog for %q returns successfully", r.GetContainerId())
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return in.c.ReopenContainerLog(ctx, r)
|
||||||
|
}
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"github.com/containerd/containerd/cio"
|
"github.com/containerd/containerd/cio"
|
||||||
"github.com/containerd/fifo"
|
"github.com/containerd/fifo"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AttachOptions specifies how to attach to a container.
|
// AttachOptions specifies how to attach to a container.
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cioutil "github.com/containerd/cri-containerd/pkg/ioutil"
|
cioutil "github.com/containerd/cri-containerd/pkg/ioutil"
|
||||||
)
|
)
|
||||||
|
@ -25,7 +25,7 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cioutil "github.com/containerd/cri-containerd/pkg/ioutil"
|
cioutil "github.com/containerd/cri-containerd/pkg/ioutil"
|
||||||
)
|
)
|
||||||
|
@ -33,7 +33,7 @@ import (
|
|||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
||||||
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
containerstore "github.com/containerd/cri-containerd/pkg/store/container"
|
||||||
@ -352,7 +352,7 @@ func loadSandbox(ctx context.Context, cntr containerd.Container) (sandboxstore.S
|
|||||||
sandbox.Container = cntr
|
sandbox.Container = cntr
|
||||||
|
|
||||||
// Load network namespace.
|
// Load network namespace.
|
||||||
if meta.Config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetHostNetwork() {
|
if meta.Config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetNetwork() == runtime.NamespaceMode_NODE {
|
||||||
// Don't need to load netns for host network sandbox.
|
// Don't need to load netns for host network sandbox.
|
||||||
return sandbox, nil
|
return sandbox, nil
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
)
|
)
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
)
|
)
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
)
|
)
|
||||||
|
@ -23,7 +23,7 @@ import (
|
|||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/log"
|
"github.com/containerd/cri-containerd/pkg/log"
|
||||||
"github.com/containerd/cri-containerd/pkg/store"
|
"github.com/containerd/cri-containerd/pkg/store"
|
||||||
|
@ -33,7 +33,7 @@ import (
|
|||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/annotations"
|
"github.com/containerd/cri-containerd/pkg/annotations"
|
||||||
customopts "github.com/containerd/cri-containerd/pkg/containerd/opts"
|
customopts "github.com/containerd/cri-containerd/pkg/containerd/opts"
|
||||||
@ -87,7 +87,7 @@ func (c *criContainerdService) RunPodSandbox(ctx context.Context, r *runtime.Run
|
|||||||
}
|
}
|
||||||
securityContext := config.GetLinux().GetSecurityContext()
|
securityContext := config.GetLinux().GetSecurityContext()
|
||||||
//Create Network Namespace if it is not in host network
|
//Create Network Namespace if it is not in host network
|
||||||
hostNet := securityContext.GetNamespaceOptions().GetHostNetwork()
|
hostNet := securityContext.GetNamespaceOptions().GetNetwork() == runtime.NamespaceMode_NODE
|
||||||
if !hostNet {
|
if !hostNet {
|
||||||
// If it is not in host network namespace then create a namespace and set the sandbox
|
// If it is not in host network namespace then create a namespace and set the sandbox
|
||||||
// handle. NetNSPath in sandbox metadata and NetNS is non empty only for non host network
|
// handle. NetNSPath in sandbox metadata and NetNS is non empty only for non host network
|
||||||
@ -362,17 +362,16 @@ func (c *criContainerdService) generateSandboxContainerSpec(id string, config *r
|
|||||||
// Set namespace options.
|
// Set namespace options.
|
||||||
securityContext := config.GetLinux().GetSecurityContext()
|
securityContext := config.GetLinux().GetSecurityContext()
|
||||||
nsOptions := securityContext.GetNamespaceOptions()
|
nsOptions := securityContext.GetNamespaceOptions()
|
||||||
if nsOptions.GetHostNetwork() {
|
if nsOptions.GetNetwork() == runtime.NamespaceMode_NODE {
|
||||||
g.RemoveLinuxNamespace(string(runtimespec.NetworkNamespace)) // nolint: errcheck
|
g.RemoveLinuxNamespace(string(runtimespec.NetworkNamespace)) // nolint: errcheck
|
||||||
} else {
|
} else {
|
||||||
//TODO(Abhi): May be move this to containerd spec opts (WithLinuxSpaceOption)
|
//TODO(Abhi): May be move this to containerd spec opts (WithLinuxSpaceOption)
|
||||||
g.AddOrReplaceLinuxNamespace(string(runtimespec.NetworkNamespace), nsPath) // nolint: errcheck
|
g.AddOrReplaceLinuxNamespace(string(runtimespec.NetworkNamespace), nsPath) // nolint: errcheck
|
||||||
}
|
}
|
||||||
if nsOptions.GetHostPid() {
|
if nsOptions.GetPid() == runtime.NamespaceMode_NODE {
|
||||||
g.RemoveLinuxNamespace(string(runtimespec.PIDNamespace)) // nolint: errcheck
|
g.RemoveLinuxNamespace(string(runtimespec.PIDNamespace)) // nolint: errcheck
|
||||||
}
|
}
|
||||||
|
if nsOptions.GetIpc() == runtime.NamespaceMode_NODE {
|
||||||
if nsOptions.GetHostIpc() {
|
|
||||||
g.RemoveLinuxNamespace(string(runtimespec.IPCNamespace)) // nolint: errcheck
|
g.RemoveLinuxNamespace(string(runtimespec.IPCNamespace)) // nolint: errcheck
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -439,7 +438,7 @@ func (c *criContainerdService) setupSandboxFiles(rootDir string, config *runtime
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Setup sandbox /dev/shm.
|
// Setup sandbox /dev/shm.
|
||||||
if config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetHostIpc() {
|
if config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetIpc() == runtime.NamespaceMode_NODE {
|
||||||
if _, err := c.os.Stat(devShm); err != nil {
|
if _, err := c.os.Stat(devShm); err != nil {
|
||||||
return fmt.Errorf("host %q is not available for host ipc: %v", devShm, err)
|
return fmt.Errorf("host %q is not available for host ipc: %v", devShm, err)
|
||||||
}
|
}
|
||||||
@ -486,7 +485,7 @@ func parseDNSOptions(servers, searches, options []string) (string, error) {
|
|||||||
// 1) The mount point is already unmounted.
|
// 1) The mount point is already unmounted.
|
||||||
// 2) The mount point doesn't exist.
|
// 2) The mount point doesn't exist.
|
||||||
func (c *criContainerdService) unmountSandboxFiles(rootDir string, config *runtime.PodSandboxConfig) error {
|
func (c *criContainerdService) unmountSandboxFiles(rootDir string, config *runtime.PodSandboxConfig) error {
|
||||||
if !config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetHostIpc() {
|
if config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetIpc() != runtime.NamespaceMode_NODE {
|
||||||
if err := c.os.Unmount(getSandboxDevShm(rootDir), unix.MNT_DETACH); err != nil && !os.IsNotExist(err) {
|
if err := c.os.Unmount(getSandboxDevShm(rootDir), unix.MNT_DETACH); err != nil && !os.IsNotExist(err) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ import (
|
|||||||
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
ostesting "github.com/containerd/cri-containerd/pkg/os/testing"
|
ostesting "github.com/containerd/cri-containerd/pkg/os/testing"
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
@ -105,9 +105,9 @@ func TestGenerateSandboxContainerSpec(t *testing.T) {
|
|||||||
configChange: func(c *runtime.PodSandboxConfig) {
|
configChange: func(c *runtime.PodSandboxConfig) {
|
||||||
c.Linux.SecurityContext = &runtime.LinuxSandboxSecurityContext{
|
c.Linux.SecurityContext = &runtime.LinuxSandboxSecurityContext{
|
||||||
NamespaceOptions: &runtime.NamespaceOption{
|
NamespaceOptions: &runtime.NamespaceOption{
|
||||||
HostNetwork: true,
|
Network: runtime.NamespaceMode_NODE,
|
||||||
HostPid: true,
|
Pid: runtime.NamespaceMode_NODE,
|
||||||
HostIpc: true,
|
Ipc: runtime.NamespaceMode_NODE,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -179,11 +179,11 @@ func TestSetupSandboxFiles(t *testing.T) {
|
|||||||
testRootDir := "test-sandbox-root"
|
testRootDir := "test-sandbox-root"
|
||||||
for desc, test := range map[string]struct {
|
for desc, test := range map[string]struct {
|
||||||
dnsConfig *runtime.DNSConfig
|
dnsConfig *runtime.DNSConfig
|
||||||
hostIpc bool
|
ipcMode runtime.NamespaceMode
|
||||||
expectedCalls []ostesting.CalledDetail
|
expectedCalls []ostesting.CalledDetail
|
||||||
}{
|
}{
|
||||||
"should check host /dev/shm existence when hostIpc is true": {
|
"should check host /dev/shm existence when ipc mode is NODE": {
|
||||||
hostIpc: true,
|
ipcMode: runtime.NamespaceMode_NODE,
|
||||||
expectedCalls: []ostesting.CalledDetail{
|
expectedCalls: []ostesting.CalledDetail{
|
||||||
{
|
{
|
||||||
Name: "CopyFile",
|
Name: "CopyFile",
|
||||||
@ -209,7 +209,7 @@ func TestSetupSandboxFiles(t *testing.T) {
|
|||||||
Searches: []string{"114.114.114.114"},
|
Searches: []string{"114.114.114.114"},
|
||||||
Options: []string{"timeout:1"},
|
Options: []string{"timeout:1"},
|
||||||
},
|
},
|
||||||
hostIpc: true,
|
ipcMode: runtime.NamespaceMode_NODE,
|
||||||
expectedCalls: []ostesting.CalledDetail{
|
expectedCalls: []ostesting.CalledDetail{
|
||||||
{
|
{
|
||||||
Name: "CopyFile",
|
Name: "CopyFile",
|
||||||
@ -232,8 +232,8 @@ options timeout:1
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"should create sandbox shm when hostIpc is false": {
|
"should create sandbox shm when ipc namespace mode is not NODE": {
|
||||||
hostIpc: false,
|
ipcMode: runtime.NamespaceMode_POD,
|
||||||
expectedCalls: []ostesting.CalledDetail{
|
expectedCalls: []ostesting.CalledDetail{
|
||||||
{
|
{
|
||||||
Name: "CopyFile",
|
Name: "CopyFile",
|
||||||
@ -267,7 +267,7 @@ options timeout:1
|
|||||||
Linux: &runtime.LinuxPodSandboxConfig{
|
Linux: &runtime.LinuxPodSandboxConfig{
|
||||||
SecurityContext: &runtime.LinuxSandboxSecurityContext{
|
SecurityContext: &runtime.LinuxSandboxSecurityContext{
|
||||||
NamespaceOptions: &runtime.NamespaceOption{
|
NamespaceOptions: &runtime.NamespaceOption{
|
||||||
HostIpc: test.hostIpc,
|
Ipc: test.ipcMode,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -402,9 +402,9 @@ func TestTypeurlMarshalUnmarshalSandboxMeta(t *testing.T) {
|
|||||||
configChange: func(c *runtime.PodSandboxConfig) {
|
configChange: func(c *runtime.PodSandboxConfig) {
|
||||||
c.Linux.SecurityContext = &runtime.LinuxSandboxSecurityContext{
|
c.Linux.SecurityContext = &runtime.LinuxSandboxSecurityContext{
|
||||||
NamespaceOptions: &runtime.NamespaceOption{
|
NamespaceOptions: &runtime.NamespaceOption{
|
||||||
HostNetwork: true,
|
Network: runtime.NamespaceMode_NODE,
|
||||||
HostPid: true,
|
Pid: runtime.NamespaceMode_NODE,
|
||||||
HostIpc: true,
|
Ipc: runtime.NamespaceMode_NODE,
|
||||||
},
|
},
|
||||||
SupplementalGroups: []int64{1111, 2222},
|
SupplementalGroups: []int64{1111, 2222},
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ import (
|
|||||||
"github.com/containerd/containerd/errdefs"
|
"github.com/containerd/containerd/errdefs"
|
||||||
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
runtimespec "github.com/opencontainers/runtime-spec/specs-go"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
)
|
)
|
||||||
@ -57,8 +57,8 @@ func (c *criContainerdService) PodSandboxStatus(ctx context.Context, r *runtime.
|
|||||||
func (c *criContainerdService) getIP(sandbox sandboxstore.Sandbox) string {
|
func (c *criContainerdService) getIP(sandbox sandboxstore.Sandbox) string {
|
||||||
config := sandbox.Config
|
config := sandbox.Config
|
||||||
|
|
||||||
if config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetHostNetwork() {
|
if config.GetLinux().GetSecurityContext().GetNamespaceOptions().GetNetwork() == runtime.NamespaceMode_NODE {
|
||||||
// For sandboxes using the host network we are not
|
// For sandboxes using the node network we are not
|
||||||
// responsible for reporting the IP.
|
// responsible for reporting the IP.
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
@ -88,9 +88,9 @@ func toCRISandboxStatus(meta sandboxstore.Metadata, status sandboxstore.Status,
|
|||||||
Linux: &runtime.LinuxPodSandboxStatus{
|
Linux: &runtime.LinuxPodSandboxStatus{
|
||||||
Namespaces: &runtime.Namespace{
|
Namespaces: &runtime.Namespace{
|
||||||
Options: &runtime.NamespaceOption{
|
Options: &runtime.NamespaceOption{
|
||||||
HostNetwork: nsOpts.GetHostNetwork(),
|
Network: nsOpts.GetNetwork(),
|
||||||
HostPid: nsOpts.GetHostPid(),
|
Pid: nsOpts.GetPid(),
|
||||||
HostIpc: nsOpts.GetHostIpc(),
|
Ipc: nsOpts.GetIpc(),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
)
|
)
|
||||||
@ -42,9 +42,9 @@ func TestPodSandboxStatus(t *testing.T) {
|
|||||||
Linux: &runtime.LinuxPodSandboxConfig{
|
Linux: &runtime.LinuxPodSandboxConfig{
|
||||||
SecurityContext: &runtime.LinuxSandboxSecurityContext{
|
SecurityContext: &runtime.LinuxSandboxSecurityContext{
|
||||||
NamespaceOptions: &runtime.NamespaceOption{
|
NamespaceOptions: &runtime.NamespaceOption{
|
||||||
HostNetwork: true,
|
Network: runtime.NamespaceMode_NODE,
|
||||||
HostPid: false,
|
Pid: runtime.NamespaceMode_CONTAINER,
|
||||||
HostIpc: true,
|
Ipc: runtime.NamespaceMode_POD,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -65,9 +65,9 @@ func TestPodSandboxStatus(t *testing.T) {
|
|||||||
Linux: &runtime.LinuxPodSandboxStatus{
|
Linux: &runtime.LinuxPodSandboxStatus{
|
||||||
Namespaces: &runtime.Namespace{
|
Namespaces: &runtime.Namespace{
|
||||||
Options: &runtime.NamespaceOption{
|
Options: &runtime.NamespaceOption{
|
||||||
HostNetwork: true,
|
Network: runtime.NamespaceMode_NODE,
|
||||||
HostPid: false,
|
Pid: runtime.NamespaceMode_CONTAINER,
|
||||||
HostIpc: true,
|
Ipc: runtime.NamespaceMode_POD,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -26,7 +26,7 @@ import (
|
|||||||
"github.com/cri-o/ocicni/pkg/ocicni"
|
"github.com/cri-o/ocicni/pkg/ocicni"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
sandboxstore "github.com/containerd/cri-containerd/pkg/store/sandbox"
|
||||||
)
|
)
|
||||||
|
@ -35,7 +35,7 @@ import (
|
|||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/sys/unix"
|
"golang.org/x/sys/unix"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/server/streaming"
|
"k8s.io/kubernetes/pkg/kubelet/server/streaming"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/cmd/cri-containerd/options"
|
"github.com/containerd/cri-containerd/cmd/cri-containerd/options"
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
goruntime "runtime"
|
goruntime "runtime"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -19,7 +19,7 @@ package server
|
|||||||
import (
|
import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UpdateRuntimeConfig updates the runtime config. Currently only handles podCIDR updates.
|
// UpdateRuntimeConfig updates the runtime config. Currently only handles podCIDR updates.
|
||||||
|
@ -18,7 +18,7 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/version"
|
"github.com/containerd/cri-containerd/pkg/version"
|
||||||
)
|
)
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
"github.com/containerd/containerd"
|
"github.com/containerd/containerd"
|
||||||
"github.com/docker/docker/pkg/truncindex"
|
"github.com/docker/docker/pkg/truncindex"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
||||||
"github.com/containerd/cri-containerd/pkg/store"
|
"github.com/containerd/cri-containerd/pkg/store"
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
assertlib "github.com/stretchr/testify/assert"
|
assertlib "github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
cio "github.com/containerd/cri-containerd/pkg/server/io"
|
||||||
"github.com/containerd/cri-containerd/pkg/store"
|
"github.com/containerd/cri-containerd/pkg/store"
|
||||||
|
@ -20,7 +20,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NOTE(random-liu):
|
// NOTE(random-liu):
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
assertlib "github.com/stretchr/testify/assert"
|
assertlib "github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMetadataMarshalUnmarshal(t *testing.T) {
|
func TestMetadataMarshalUnmarshal(t *testing.T) {
|
||||||
|
@ -25,7 +25,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/docker/docker/pkg/ioutils"
|
"github.com/docker/docker/pkg/ioutils"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// statusVersion is current version of container status.
|
// statusVersion is current version of container status.
|
||||||
|
@ -27,7 +27,7 @@ import (
|
|||||||
|
|
||||||
assertlib "github.com/stretchr/testify/assert"
|
assertlib "github.com/stretchr/testify/assert"
|
||||||
requirelib "github.com/stretchr/testify/require"
|
requirelib "github.com/stretchr/testify/require"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestContainerState(t *testing.T) {
|
func TestContainerState(t *testing.T) {
|
||||||
|
@ -20,7 +20,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NOTE(random-liu):
|
// NOTE(random-liu):
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
assertlib "github.com/stretchr/testify/assert"
|
assertlib "github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMetadataMarshalUnmarshal(t *testing.T) {
|
func TestMetadataMarshalUnmarshal(t *testing.T) {
|
||||||
|
@ -20,7 +20,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
assertlib "github.com/stretchr/testify/assert"
|
assertlib "github.com/stretchr/testify/assert"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
|
runtime "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
|
||||||
|
|
||||||
"github.com/containerd/cri-containerd/pkg/store"
|
"github.com/containerd/cri-containerd/pkg/store"
|
||||||
)
|
)
|
||||||
|
25
vendor.conf
25
vendor.conf
@ -22,19 +22,11 @@ github.com/godbus/dbus c7fdd8b5cd55e87b4e1f4e372cdb1db61dd6c66f
|
|||||||
github.com/gogo/protobuf v0.5
|
github.com/gogo/protobuf v0.5
|
||||||
github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed
|
github.com/golang/glog 44145f04b68cf362d9c4df2182967c2275eaefed
|
||||||
github.com/golang/protobuf 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9
|
github.com/golang/protobuf 1643683e1b54a9e88ad26d98f81400c8c9d9f4f9
|
||||||
github.com/google/btree 7d79101e329e5a3adf994758c578dab82b90c017
|
|
||||||
github.com/google/gofuzz 44d81051d367757e1c7c6a5a86423ece9afcf63c
|
github.com/google/gofuzz 44d81051d367757e1c7c6a5a86423ece9afcf63c
|
||||||
github.com/go-openapi/jsonpointer 46af16f9f7b149af66e5d1bd010e3574dc06de98
|
|
||||||
github.com/go-openapi/jsonreference 13c6e3589ad90f49bd3e3bbe2c2cb3d7a4142272
|
|
||||||
github.com/go-openapi/spec 6aced65f8501fe1217321abf0749d354824ba2ff
|
|
||||||
github.com/go-openapi/swag 1d0bd113de87027671077d3c71eb3ac5d7dbba72
|
|
||||||
github.com/gregjones/httpcache 787624de3eb7bd915c329cba748687a3b22666a6
|
|
||||||
github.com/hashicorp/errwrap 7554cd9344cec97297fa6649b055a8c98c2a1e55
|
github.com/hashicorp/errwrap 7554cd9344cec97297fa6649b055a8c98c2a1e55
|
||||||
github.com/hashicorp/go-multierror ed905158d87462226a13fe39ddf685ea65f1c11f
|
github.com/hashicorp/go-multierror ed905158d87462226a13fe39ddf685ea65f1c11f
|
||||||
github.com/inconshreveable/mousetrap 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
|
github.com/inconshreveable/mousetrap 76626ae9c91c4f2a10f34cad8ce83ea42c93bb75
|
||||||
github.com/json-iterator/go 1.0.4
|
github.com/json-iterator/go 1.0.4
|
||||||
github.com/juju/ratelimit 5b9ff866471762aa2ab2dced63c9fb6f53921342
|
|
||||||
github.com/mailru/easyjson d5b7844b561a7bc640052f1b935f7b800330d7e0
|
|
||||||
github.com/Microsoft/go-winio v0.4.5
|
github.com/Microsoft/go-winio v0.4.5
|
||||||
github.com/Microsoft/hcsshim v0.6.7
|
github.com/Microsoft/hcsshim v0.6.7
|
||||||
github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448
|
github.com/opencontainers/go-digest 21dfd564fd89c944783d00d069f33e3e7123c448
|
||||||
@ -43,11 +35,8 @@ github.com/opencontainers/runc 9f9c96235cc97674e935002fc3d78361b696a69e
|
|||||||
github.com/opencontainers/runtime-spec v1.0.1
|
github.com/opencontainers/runtime-spec v1.0.1
|
||||||
github.com/opencontainers/runtime-tools 6073aff4ac61897f75895123f7e24135204a404d
|
github.com/opencontainers/runtime-tools 6073aff4ac61897f75895123f7e24135204a404d
|
||||||
github.com/opencontainers/selinux 4a2974bf1ee960774ffd517717f1f45325af0206
|
github.com/opencontainers/selinux 4a2974bf1ee960774ffd517717f1f45325af0206
|
||||||
github.com/peterbourgon/diskv v2.0.1
|
|
||||||
github.com/pkg/errors v0.8.0
|
github.com/pkg/errors v0.8.0
|
||||||
github.com/pmezard/go-difflib v1.0.0
|
github.com/pmezard/go-difflib v1.0.0
|
||||||
github.com/PuerkitoBio/purell v1.0.0
|
|
||||||
github.com/PuerkitoBio/urlesc 5bd2802263f21d8788851d5305584c82a5c75d7e
|
|
||||||
github.com/renstrom/dedent 020d11c3b9c0c7a3c2efcc8e5cf5b9ef7bcea21f
|
github.com/renstrom/dedent 020d11c3b9c0c7a3c2efcc8e5cf5b9ef7bcea21f
|
||||||
github.com/seccomp/libseccomp-golang 32f571b70023028bd57d9288c20efbcb237f3ce0
|
github.com/seccomp/libseccomp-golang 32f571b70023028bd57d9288c20efbcb237f3ce0
|
||||||
github.com/sirupsen/logrus v1.0.0
|
github.com/sirupsen/logrus v1.0.0
|
||||||
@ -60,14 +49,14 @@ golang.org/x/net 7dcfb8076726a3fdd9353b6b8a1f1b6be6811bd6
|
|||||||
golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
|
golang.org/x/sync 450f422ab23cf9881c94e2db30cac0eb1b7cf80c
|
||||||
golang.org/x/sys 314a259e304ff91bd6985da2a7149bbf91237993 https://github.com/golang/sys
|
golang.org/x/sys 314a259e304ff91bd6985da2a7149bbf91237993 https://github.com/golang/sys
|
||||||
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
|
golang.org/x/text 19e51611da83d6be54ddafce4a4af510cb3e9ea4
|
||||||
|
golang.org/x/time f51c12702a4d776e4c1fa9b0fabab841babae631
|
||||||
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
|
google.golang.org/genproto d80a6e20e776b0b17a324d0ba1ab50a39c8e8944
|
||||||
google.golang.org/grpc v1.7.4
|
google.golang.org/grpc v1.7.4
|
||||||
gopkg.in/inf.v0 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
|
gopkg.in/inf.v0 3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4
|
||||||
gopkg.in/yaml.v2 53feefa2559fb8dfa8d81baad31be332c97d6c77
|
gopkg.in/yaml.v2 53feefa2559fb8dfa8d81baad31be332c97d6c77
|
||||||
k8s.io/api 9382f5a87a364c195477134986b578d103c7c24d
|
k8s.io/api beab4da9671e79815b7876363175af45aa180eb5
|
||||||
k8s.io/apimachinery 23bc0b9defba312e3b5938fa0d0581f3e882f862
|
k8s.io/apimachinery 6212319467788d635606616d5c6d87ded0321d8c
|
||||||
k8s.io/apiserver cbbf2be01950dbf88df68c3ac331e532b3664464
|
k8s.io/apiserver 340247246b5ea93d9b51908592ed8f6b94f82674
|
||||||
k8s.io/client-go 87887458218a51f3944b2f4c553eb38173458e97
|
k8s.io/client-go 33bd23f75b6de861994706a322b0afab824b2171
|
||||||
k8s.io/kube-openapi b16ebc07f5cad97831f961e4b5a9cc1caed33b7e
|
k8s.io/kubernetes 0caa20c65f147e15f5545862510eb7e81c42b0a3
|
||||||
k8s.io/kubernetes v1.9.0
|
k8s.io/utils a99a3e11a96751670db62ba77c6d278d1136931e
|
||||||
k8s.io/utils 66423a0293c555337adc04fe2c59748151291de8
|
|
||||||
|
12
vendor/github.com/PuerkitoBio/purell/LICENSE
generated
vendored
12
vendor/github.com/PuerkitoBio/purell/LICENSE
generated
vendored
@ -1,12 +0,0 @@
|
|||||||
Copyright (c) 2012, Martin Angers
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
185
vendor/github.com/PuerkitoBio/purell/README.md
generated
vendored
185
vendor/github.com/PuerkitoBio/purell/README.md
generated
vendored
@ -1,185 +0,0 @@
|
|||||||
# Purell
|
|
||||||
|
|
||||||
Purell is a tiny Go library to normalize URLs. It returns a pure URL. Pure-ell. Sanitizer and all. Yeah, I know...
|
|
||||||
|
|
||||||
Based on the [wikipedia paper][wiki] and the [RFC 3986 document][rfc].
|
|
||||||
|
|
||||||
[](http://travis-ci.org/PuerkitoBio/purell)
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
`go get github.com/PuerkitoBio/purell`
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
* **2016-07-27 (v1.0.0)** : Normalize IDN to ASCII (thanks to @zenovich).
|
|
||||||
* **2015-02-08** : Add fix for relative paths issue ([PR #5][pr5]) and add fix for unnecessary encoding of reserved characters ([see issue #7][iss7]).
|
|
||||||
* **v0.2.0** : Add benchmarks, Attempt IDN support.
|
|
||||||
* **v0.1.0** : Initial release.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
From `example_test.go` (note that in your code, you would import "github.com/PuerkitoBio/purell", and would prefix references to its methods and constants with "purell."):
|
|
||||||
|
|
||||||
```go
|
|
||||||
package purell
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
)
|
|
||||||
|
|
||||||
func ExampleNormalizeURLString() {
|
|
||||||
if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/",
|
|
||||||
FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
fmt.Print(normalized)
|
|
||||||
}
|
|
||||||
// Output: http://somewebsite.com:80/Amazing%3F/url/
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleMustNormalizeURLString() {
|
|
||||||
normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/",
|
|
||||||
FlagsUnsafeGreedy)
|
|
||||||
fmt.Print(normalized)
|
|
||||||
|
|
||||||
// Output: http://somewebsite.com/Amazing%FA/url
|
|
||||||
}
|
|
||||||
|
|
||||||
func ExampleNormalizeURL() {
|
|
||||||
if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil {
|
|
||||||
panic(err)
|
|
||||||
} else {
|
|
||||||
normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment)
|
|
||||||
fmt.Print(normalized)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
As seen in the examples above, purell offers three methods, `NormalizeURLString(string, NormalizationFlags) (string, error)`, `MustNormalizeURLString(string, NormalizationFlags) (string)` and `NormalizeURL(*url.URL, NormalizationFlags) (string)`. They all normalize the provided URL based on the specified flags. Here are the available flags:
|
|
||||||
|
|
||||||
```go
|
|
||||||
const (
|
|
||||||
// Safe normalizations
|
|
||||||
FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
|
|
||||||
FlagLowercaseHost // http://HOST -> http://host
|
|
||||||
FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
|
|
||||||
FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
|
|
||||||
FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
|
|
||||||
FlagRemoveDefaultPort // http://host:80 -> http://host
|
|
||||||
FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
|
|
||||||
|
|
||||||
// Usually safe normalizations
|
|
||||||
FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
|
|
||||||
FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
|
|
||||||
FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
|
|
||||||
|
|
||||||
// Unsafe normalizations
|
|
||||||
FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
|
|
||||||
FlagRemoveFragment // http://host/path#fragment -> http://host/path
|
|
||||||
FlagForceHTTP // https://host -> http://host
|
|
||||||
FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
|
|
||||||
FlagRemoveWWW // http://www.host/ -> http://host/
|
|
||||||
FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
|
|
||||||
FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
|
|
||||||
|
|
||||||
// Normalizations not in the wikipedia article, required to cover tests cases
|
|
||||||
// submitted by jehiah
|
|
||||||
FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
|
|
||||||
FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
|
|
||||||
FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
|
|
||||||
FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
|
|
||||||
FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
|
|
||||||
|
|
||||||
// Convenience set of safe normalizations
|
|
||||||
FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
|
|
||||||
|
|
||||||
// For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
|
|
||||||
// while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
|
|
||||||
|
|
||||||
// Convenience set of usually safe normalizations (includes FlagsSafe)
|
|
||||||
FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
|
|
||||||
FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
|
|
||||||
|
|
||||||
// Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
|
|
||||||
FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
|
|
||||||
FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
|
|
||||||
|
|
||||||
// Convenience set of all available flags
|
|
||||||
FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
|
||||||
FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
For convenience, the set of flags `FlagsSafe`, `FlagsUsuallySafe[Greedy|NonGreedy]`, `FlagsUnsafe[Greedy|NonGreedy]` and `FlagsAll[Greedy|NonGreedy]` are provided for the similarly grouped normalizations on [wikipedia's URL normalization page][wiki]. You can add (using the bitwise OR `|` operator) or remove (using the bitwise AND NOT `&^` operator) individual flags from the sets if required, to build your own custom set.
|
|
||||||
|
|
||||||
The [full godoc reference is available on gopkgdoc][godoc].
|
|
||||||
|
|
||||||
Some things to note:
|
|
||||||
|
|
||||||
* `FlagDecodeUnnecessaryEscapes`, `FlagEncodeNecessaryEscapes`, `FlagUppercaseEscapes` and `FlagRemoveEmptyQuerySeparator` are always implicitly set, because internally, the URL string is parsed as an URL object, which automatically decodes unnecessary escapes, uppercases and encodes necessary ones, and removes empty query separators (an unnecessary `?` at the end of the url). So this operation cannot **not** be done. For this reason, `FlagRemoveEmptyQuerySeparator` (as well as the other three) has been included in the `FlagsSafe` convenience set, instead of `FlagsUnsafe`, where Wikipedia puts it.
|
|
||||||
|
|
||||||
* The `FlagDecodeUnnecessaryEscapes` decodes the following escapes (*from -> to*):
|
|
||||||
- %24 -> $
|
|
||||||
- %26 -> &
|
|
||||||
- %2B-%3B -> +,-./0123456789:;
|
|
||||||
- %3D -> =
|
|
||||||
- %40-%5A -> @ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
||||||
- %5F -> _
|
|
||||||
- %61-%7A -> abcdefghijklmnopqrstuvwxyz
|
|
||||||
- %7E -> ~
|
|
||||||
|
|
||||||
|
|
||||||
* When the `NormalizeURL` function is used (passing an URL object), this source URL object is modified (that is, after the call, the URL object will be modified to reflect the normalization).
|
|
||||||
|
|
||||||
* The *replace IP with domain name* normalization (`http://208.77.188.166/ → http://www.example.com/`) is obviously not possible for a library without making some network requests. This is not implemented in purell.
|
|
||||||
|
|
||||||
* The *remove unused query string parameters* and *remove default query parameters* are also not implemented, since this is a very case-specific normalization, and it is quite trivial to do with an URL object.
|
|
||||||
|
|
||||||
### Safe vs Usually Safe vs Unsafe
|
|
||||||
|
|
||||||
Purell allows you to control the level of risk you take while normalizing an URL. You can aggressively normalize, play it totally safe, or anything in between.
|
|
||||||
|
|
||||||
Consider the following URL:
|
|
||||||
|
|
||||||
`HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
|
|
||||||
|
|
||||||
Normalizing with the `FlagsSafe` gives:
|
|
||||||
|
|
||||||
`https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
|
|
||||||
|
|
||||||
With the `FlagsUsuallySafeGreedy`:
|
|
||||||
|
|
||||||
`https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid`
|
|
||||||
|
|
||||||
And with `FlagsUnsafeGreedy`:
|
|
||||||
|
|
||||||
`http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3`
|
|
||||||
|
|
||||||
## TODOs
|
|
||||||
|
|
||||||
* Add a class/default instance to allow specifying custom directory index names? At the moment, removing directory index removes `(^|/)((?:default|index)\.\w{1,4})$`.
|
|
||||||
|
|
||||||
## Thanks / Contributions
|
|
||||||
|
|
||||||
@rogpeppe
|
|
||||||
@jehiah
|
|
||||||
@opennota
|
|
||||||
@pchristopher1275
|
|
||||||
@zenovich
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
The [BSD 3-Clause license][bsd].
|
|
||||||
|
|
||||||
[bsd]: http://opensource.org/licenses/BSD-3-Clause
|
|
||||||
[wiki]: http://en.wikipedia.org/wiki/URL_normalization
|
|
||||||
[rfc]: http://tools.ietf.org/html/rfc3986#section-6
|
|
||||||
[godoc]: http://go.pkgdoc.org/github.com/PuerkitoBio/purell
|
|
||||||
[pr5]: https://github.com/PuerkitoBio/purell/pull/5
|
|
||||||
[iss7]: https://github.com/PuerkitoBio/purell/issues/7
|
|
375
vendor/github.com/PuerkitoBio/purell/purell.go
generated
vendored
375
vendor/github.com/PuerkitoBio/purell/purell.go
generated
vendored
@ -1,375 +0,0 @@
|
|||||||
/*
|
|
||||||
Package purell offers URL normalization as described on the wikipedia page:
|
|
||||||
http://en.wikipedia.org/wiki/URL_normalization
|
|
||||||
*/
|
|
||||||
package purell
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"regexp"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/PuerkitoBio/urlesc"
|
|
||||||
"golang.org/x/net/idna"
|
|
||||||
"golang.org/x/text/secure/precis"
|
|
||||||
"golang.org/x/text/unicode/norm"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A set of normalization flags determines how a URL will
|
|
||||||
// be normalized.
|
|
||||||
type NormalizationFlags uint
|
|
||||||
|
|
||||||
const (
|
|
||||||
// Safe normalizations
|
|
||||||
FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
|
|
||||||
FlagLowercaseHost // http://HOST -> http://host
|
|
||||||
FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
|
|
||||||
FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
|
|
||||||
FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
|
|
||||||
FlagRemoveDefaultPort // http://host:80 -> http://host
|
|
||||||
FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
|
|
||||||
|
|
||||||
// Usually safe normalizations
|
|
||||||
FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
|
|
||||||
FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
|
|
||||||
FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
|
|
||||||
|
|
||||||
// Unsafe normalizations
|
|
||||||
FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
|
|
||||||
FlagRemoveFragment // http://host/path#fragment -> http://host/path
|
|
||||||
FlagForceHTTP // https://host -> http://host
|
|
||||||
FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
|
|
||||||
FlagRemoveWWW // http://www.host/ -> http://host/
|
|
||||||
FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
|
|
||||||
FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
|
|
||||||
|
|
||||||
// Normalizations not in the wikipedia article, required to cover tests cases
|
|
||||||
// submitted by jehiah
|
|
||||||
FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
|
|
||||||
FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
|
|
||||||
FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
|
|
||||||
FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
|
|
||||||
FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
|
|
||||||
|
|
||||||
// Convenience set of safe normalizations
|
|
||||||
FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
|
|
||||||
|
|
||||||
// For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
|
|
||||||
// while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
|
|
||||||
|
|
||||||
// Convenience set of usually safe normalizations (includes FlagsSafe)
|
|
||||||
FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
|
|
||||||
FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
|
|
||||||
|
|
||||||
// Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
|
|
||||||
FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
|
|
||||||
FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
|
|
||||||
|
|
||||||
// Convenience set of all available flags
|
|
||||||
FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
|
||||||
FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
defaultHttpPort = ":80"
|
|
||||||
defaultHttpsPort = ":443"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Regular expressions used by the normalizations
|
|
||||||
var rxPort = regexp.MustCompile(`(:\d+)/?$`)
|
|
||||||
var rxDirIndex = regexp.MustCompile(`(^|/)((?:default|index)\.\w{1,4})$`)
|
|
||||||
var rxDupSlashes = regexp.MustCompile(`/{2,}`)
|
|
||||||
var rxDWORDHost = regexp.MustCompile(`^(\d+)((?:\.+)?(?:\:\d*)?)$`)
|
|
||||||
var rxOctalHost = regexp.MustCompile(`^(0\d*)\.(0\d*)\.(0\d*)\.(0\d*)((?:\.+)?(?:\:\d*)?)$`)
|
|
||||||
var rxHexHost = regexp.MustCompile(`^0x([0-9A-Fa-f]+)((?:\.+)?(?:\:\d*)?)$`)
|
|
||||||
var rxHostDots = regexp.MustCompile(`^(.+?)(:\d+)?$`)
|
|
||||||
var rxEmptyPort = regexp.MustCompile(`:+$`)
|
|
||||||
|
|
||||||
// Map of flags to implementation function.
|
|
||||||
// FlagDecodeUnnecessaryEscapes has no action, since it is done automatically
|
|
||||||
// by parsing the string as an URL. Same for FlagUppercaseEscapes and FlagRemoveEmptyQuerySeparator.
|
|
||||||
|
|
||||||
// Since maps have undefined traversing order, make a slice of ordered keys
|
|
||||||
var flagsOrder = []NormalizationFlags{
|
|
||||||
FlagLowercaseScheme,
|
|
||||||
FlagLowercaseHost,
|
|
||||||
FlagRemoveDefaultPort,
|
|
||||||
FlagRemoveDirectoryIndex,
|
|
||||||
FlagRemoveDotSegments,
|
|
||||||
FlagRemoveFragment,
|
|
||||||
FlagForceHTTP, // Must be after remove default port (because https=443/http=80)
|
|
||||||
FlagRemoveDuplicateSlashes,
|
|
||||||
FlagRemoveWWW,
|
|
||||||
FlagAddWWW,
|
|
||||||
FlagSortQuery,
|
|
||||||
FlagDecodeDWORDHost,
|
|
||||||
FlagDecodeOctalHost,
|
|
||||||
FlagDecodeHexHost,
|
|
||||||
FlagRemoveUnnecessaryHostDots,
|
|
||||||
FlagRemoveEmptyPortSeparator,
|
|
||||||
FlagRemoveTrailingSlash, // These two (add/remove trailing slash) must be last
|
|
||||||
FlagAddTrailingSlash,
|
|
||||||
}
|
|
||||||
|
|
||||||
// ... and then the map, where order is unimportant
|
|
||||||
var flags = map[NormalizationFlags]func(*url.URL){
|
|
||||||
FlagLowercaseScheme: lowercaseScheme,
|
|
||||||
FlagLowercaseHost: lowercaseHost,
|
|
||||||
FlagRemoveDefaultPort: removeDefaultPort,
|
|
||||||
FlagRemoveDirectoryIndex: removeDirectoryIndex,
|
|
||||||
FlagRemoveDotSegments: removeDotSegments,
|
|
||||||
FlagRemoveFragment: removeFragment,
|
|
||||||
FlagForceHTTP: forceHTTP,
|
|
||||||
FlagRemoveDuplicateSlashes: removeDuplicateSlashes,
|
|
||||||
FlagRemoveWWW: removeWWW,
|
|
||||||
FlagAddWWW: addWWW,
|
|
||||||
FlagSortQuery: sortQuery,
|
|
||||||
FlagDecodeDWORDHost: decodeDWORDHost,
|
|
||||||
FlagDecodeOctalHost: decodeOctalHost,
|
|
||||||
FlagDecodeHexHost: decodeHexHost,
|
|
||||||
FlagRemoveUnnecessaryHostDots: removeUnncessaryHostDots,
|
|
||||||
FlagRemoveEmptyPortSeparator: removeEmptyPortSeparator,
|
|
||||||
FlagRemoveTrailingSlash: removeTrailingSlash,
|
|
||||||
FlagAddTrailingSlash: addTrailingSlash,
|
|
||||||
}
|
|
||||||
|
|
||||||
// MustNormalizeURLString returns the normalized string, and panics if an error occurs.
|
|
||||||
// It takes an URL string as input, as well as the normalization flags.
|
|
||||||
func MustNormalizeURLString(u string, f NormalizationFlags) string {
|
|
||||||
result, e := NormalizeURLString(u, f)
|
|
||||||
if e != nil {
|
|
||||||
panic(e)
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// NormalizeURLString returns the normalized string, or an error if it can't be parsed into an URL object.
|
|
||||||
// It takes an URL string as input, as well as the normalization flags.
|
|
||||||
func NormalizeURLString(u string, f NormalizationFlags) (string, error) {
|
|
||||||
if parsed, e := url.Parse(u); e != nil {
|
|
||||||
return "", e
|
|
||||||
} else {
|
|
||||||
options := make([]precis.Option, 1, 3)
|
|
||||||
options[0] = precis.IgnoreCase
|
|
||||||
if f&FlagLowercaseHost == FlagLowercaseHost {
|
|
||||||
options = append(options, precis.FoldCase())
|
|
||||||
}
|
|
||||||
options = append(options, precis.Norm(norm.NFC))
|
|
||||||
profile := precis.NewFreeform(options...)
|
|
||||||
if parsed.Host, e = idna.ToASCII(profile.NewTransformer().String(parsed.Host)); e != nil {
|
|
||||||
return "", e
|
|
||||||
}
|
|
||||||
return NormalizeURL(parsed, f), nil
|
|
||||||
}
|
|
||||||
panic("Unreachable code.")
|
|
||||||
}
|
|
||||||
|
|
||||||
// NormalizeURL returns the normalized string.
|
|
||||||
// It takes a parsed URL object as input, as well as the normalization flags.
|
|
||||||
func NormalizeURL(u *url.URL, f NormalizationFlags) string {
|
|
||||||
for _, k := range flagsOrder {
|
|
||||||
if f&k == k {
|
|
||||||
flags[k](u)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return urlesc.Escape(u)
|
|
||||||
}
|
|
||||||
|
|
||||||
func lowercaseScheme(u *url.URL) {
|
|
||||||
if len(u.Scheme) > 0 {
|
|
||||||
u.Scheme = strings.ToLower(u.Scheme)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func lowercaseHost(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 {
|
|
||||||
u.Host = strings.ToLower(u.Host)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeDefaultPort(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 {
|
|
||||||
scheme := strings.ToLower(u.Scheme)
|
|
||||||
u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string {
|
|
||||||
if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return val
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeTrailingSlash(u *url.URL) {
|
|
||||||
if l := len(u.Path); l > 0 {
|
|
||||||
if strings.HasSuffix(u.Path, "/") {
|
|
||||||
u.Path = u.Path[:l-1]
|
|
||||||
}
|
|
||||||
} else if l = len(u.Host); l > 0 {
|
|
||||||
if strings.HasSuffix(u.Host, "/") {
|
|
||||||
u.Host = u.Host[:l-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func addTrailingSlash(u *url.URL) {
|
|
||||||
if l := len(u.Path); l > 0 {
|
|
||||||
if !strings.HasSuffix(u.Path, "/") {
|
|
||||||
u.Path += "/"
|
|
||||||
}
|
|
||||||
} else if l = len(u.Host); l > 0 {
|
|
||||||
if !strings.HasSuffix(u.Host, "/") {
|
|
||||||
u.Host += "/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeDotSegments(u *url.URL) {
|
|
||||||
if len(u.Path) > 0 {
|
|
||||||
var dotFree []string
|
|
||||||
var lastIsDot bool
|
|
||||||
|
|
||||||
sections := strings.Split(u.Path, "/")
|
|
||||||
for _, s := range sections {
|
|
||||||
if s == ".." {
|
|
||||||
if len(dotFree) > 0 {
|
|
||||||
dotFree = dotFree[:len(dotFree)-1]
|
|
||||||
}
|
|
||||||
} else if s != "." {
|
|
||||||
dotFree = append(dotFree, s)
|
|
||||||
}
|
|
||||||
lastIsDot = (s == "." || s == "..")
|
|
||||||
}
|
|
||||||
// Special case if host does not end with / and new path does not begin with /
|
|
||||||
u.Path = strings.Join(dotFree, "/")
|
|
||||||
if u.Host != "" && !strings.HasSuffix(u.Host, "/") && !strings.HasPrefix(u.Path, "/") {
|
|
||||||
u.Path = "/" + u.Path
|
|
||||||
}
|
|
||||||
// Special case if the last segment was a dot, make sure the path ends with a slash
|
|
||||||
if lastIsDot && !strings.HasSuffix(u.Path, "/") {
|
|
||||||
u.Path += "/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeDirectoryIndex(u *url.URL) {
|
|
||||||
if len(u.Path) > 0 {
|
|
||||||
u.Path = rxDirIndex.ReplaceAllString(u.Path, "$1")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeFragment(u *url.URL) {
|
|
||||||
u.Fragment = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func forceHTTP(u *url.URL) {
|
|
||||||
if strings.ToLower(u.Scheme) == "https" {
|
|
||||||
u.Scheme = "http"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeDuplicateSlashes(u *url.URL) {
|
|
||||||
if len(u.Path) > 0 {
|
|
||||||
u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeWWW(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 && strings.HasPrefix(strings.ToLower(u.Host), "www.") {
|
|
||||||
u.Host = u.Host[4:]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func addWWW(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 && !strings.HasPrefix(strings.ToLower(u.Host), "www.") {
|
|
||||||
u.Host = "www." + u.Host
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func sortQuery(u *url.URL) {
|
|
||||||
q := u.Query()
|
|
||||||
|
|
||||||
if len(q) > 0 {
|
|
||||||
arKeys := make([]string, len(q))
|
|
||||||
i := 0
|
|
||||||
for k, _ := range q {
|
|
||||||
arKeys[i] = k
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
sort.Strings(arKeys)
|
|
||||||
buf := new(bytes.Buffer)
|
|
||||||
for _, k := range arKeys {
|
|
||||||
sort.Strings(q[k])
|
|
||||||
for _, v := range q[k] {
|
|
||||||
if buf.Len() > 0 {
|
|
||||||
buf.WriteRune('&')
|
|
||||||
}
|
|
||||||
buf.WriteString(fmt.Sprintf("%s=%s", k, urlesc.QueryEscape(v)))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rebuild the raw query string
|
|
||||||
u.RawQuery = buf.String()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func decodeDWORDHost(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 {
|
|
||||||
if matches := rxDWORDHost.FindStringSubmatch(u.Host); len(matches) > 2 {
|
|
||||||
var parts [4]int64
|
|
||||||
|
|
||||||
dword, _ := strconv.ParseInt(matches[1], 10, 0)
|
|
||||||
for i, shift := range []uint{24, 16, 8, 0} {
|
|
||||||
parts[i] = dword >> shift & 0xFF
|
|
||||||
}
|
|
||||||
u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[2])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func decodeOctalHost(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 {
|
|
||||||
if matches := rxOctalHost.FindStringSubmatch(u.Host); len(matches) > 5 {
|
|
||||||
var parts [4]int64
|
|
||||||
|
|
||||||
for i := 1; i <= 4; i++ {
|
|
||||||
parts[i-1], _ = strconv.ParseInt(matches[i], 8, 0)
|
|
||||||
}
|
|
||||||
u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[5])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func decodeHexHost(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 {
|
|
||||||
if matches := rxHexHost.FindStringSubmatch(u.Host); len(matches) > 2 {
|
|
||||||
// Conversion is safe because of regex validation
|
|
||||||
parsed, _ := strconv.ParseInt(matches[1], 16, 0)
|
|
||||||
// Set host as DWORD (base 10) encoded host
|
|
||||||
u.Host = fmt.Sprintf("%d%s", parsed, matches[2])
|
|
||||||
// The rest is the same as decoding a DWORD host
|
|
||||||
decodeDWORDHost(u)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeUnncessaryHostDots(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 {
|
|
||||||
if matches := rxHostDots.FindStringSubmatch(u.Host); len(matches) > 1 {
|
|
||||||
// Trim the leading and trailing dots
|
|
||||||
u.Host = strings.Trim(matches[1], ".")
|
|
||||||
if len(matches) > 2 {
|
|
||||||
u.Host += matches[2]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeEmptyPortSeparator(u *url.URL) {
|
|
||||||
if len(u.Host) > 0 {
|
|
||||||
u.Host = rxEmptyPort.ReplaceAllString(u.Host, "")
|
|
||||||
}
|
|
||||||
}
|
|
16
vendor/github.com/PuerkitoBio/urlesc/README.md
generated
vendored
16
vendor/github.com/PuerkitoBio/urlesc/README.md
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
urlesc [](https://travis-ci.org/PuerkitoBio/urlesc) [](http://godoc.org/github.com/PuerkitoBio/urlesc)
|
|
||||||
======
|
|
||||||
|
|
||||||
Package urlesc implements query escaping as per RFC 3986.
|
|
||||||
|
|
||||||
It contains some parts of the net/url package, modified so as to allow
|
|
||||||
some reserved characters incorrectly escaped by net/url (see [issue 5684](https://github.com/golang/go/issues/5684)).
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
go get github.com/PuerkitoBio/urlesc
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Go license (BSD-3-Clause)
|
|
||||||
|
|
180
vendor/github.com/PuerkitoBio/urlesc/urlesc.go
generated
vendored
180
vendor/github.com/PuerkitoBio/urlesc/urlesc.go
generated
vendored
@ -1,180 +0,0 @@
|
|||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package urlesc implements query escaping as per RFC 3986.
|
|
||||||
// It contains some parts of the net/url package, modified so as to allow
|
|
||||||
// some reserved characters incorrectly escaped by net/url.
|
|
||||||
// See https://github.com/golang/go/issues/5684
|
|
||||||
package urlesc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
type encoding int
|
|
||||||
|
|
||||||
const (
|
|
||||||
encodePath encoding = 1 + iota
|
|
||||||
encodeUserPassword
|
|
||||||
encodeQueryComponent
|
|
||||||
encodeFragment
|
|
||||||
)
|
|
||||||
|
|
||||||
// Return true if the specified character should be escaped when
|
|
||||||
// appearing in a URL string, according to RFC 3986.
|
|
||||||
func shouldEscape(c byte, mode encoding) bool {
|
|
||||||
// §2.3 Unreserved characters (alphanum)
|
|
||||||
if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
switch c {
|
|
||||||
case '-', '.', '_', '~': // §2.3 Unreserved characters (mark)
|
|
||||||
return false
|
|
||||||
|
|
||||||
// §2.2 Reserved characters (reserved)
|
|
||||||
case ':', '/', '?', '#', '[', ']', '@', // gen-delims
|
|
||||||
'!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // sub-delims
|
|
||||||
// Different sections of the URL allow a few of
|
|
||||||
// the reserved characters to appear unescaped.
|
|
||||||
switch mode {
|
|
||||||
case encodePath: // §3.3
|
|
||||||
// The RFC allows sub-delims and : @.
|
|
||||||
// '/', '[' and ']' can be used to assign meaning to individual path
|
|
||||||
// segments. This package only manipulates the path as a whole,
|
|
||||||
// so we allow those as well. That leaves only ? and # to escape.
|
|
||||||
return c == '?' || c == '#'
|
|
||||||
|
|
||||||
case encodeUserPassword: // §3.2.1
|
|
||||||
// The RFC allows : and sub-delims in
|
|
||||||
// userinfo. The parsing of userinfo treats ':' as special so we must escape
|
|
||||||
// all the gen-delims.
|
|
||||||
return c == ':' || c == '/' || c == '?' || c == '#' || c == '[' || c == ']' || c == '@'
|
|
||||||
|
|
||||||
case encodeQueryComponent: // §3.4
|
|
||||||
// The RFC allows / and ?.
|
|
||||||
return c != '/' && c != '?'
|
|
||||||
|
|
||||||
case encodeFragment: // §4.1
|
|
||||||
// The RFC text is silent but the grammar allows
|
|
||||||
// everything, so escape nothing but #
|
|
||||||
return c == '#'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Everything else must be escaped.
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// QueryEscape escapes the string so it can be safely placed
|
|
||||||
// inside a URL query.
|
|
||||||
func QueryEscape(s string) string {
|
|
||||||
return escape(s, encodeQueryComponent)
|
|
||||||
}
|
|
||||||
|
|
||||||
func escape(s string, mode encoding) string {
|
|
||||||
spaceCount, hexCount := 0, 0
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
c := s[i]
|
|
||||||
if shouldEscape(c, mode) {
|
|
||||||
if c == ' ' && mode == encodeQueryComponent {
|
|
||||||
spaceCount++
|
|
||||||
} else {
|
|
||||||
hexCount++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if spaceCount == 0 && hexCount == 0 {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
t := make([]byte, len(s)+2*hexCount)
|
|
||||||
j := 0
|
|
||||||
for i := 0; i < len(s); i++ {
|
|
||||||
switch c := s[i]; {
|
|
||||||
case c == ' ' && mode == encodeQueryComponent:
|
|
||||||
t[j] = '+'
|
|
||||||
j++
|
|
||||||
case shouldEscape(c, mode):
|
|
||||||
t[j] = '%'
|
|
||||||
t[j+1] = "0123456789ABCDEF"[c>>4]
|
|
||||||
t[j+2] = "0123456789ABCDEF"[c&15]
|
|
||||||
j += 3
|
|
||||||
default:
|
|
||||||
t[j] = s[i]
|
|
||||||
j++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return string(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
var uiReplacer = strings.NewReplacer(
|
|
||||||
"%21", "!",
|
|
||||||
"%27", "'",
|
|
||||||
"%28", "(",
|
|
||||||
"%29", ")",
|
|
||||||
"%2A", "*",
|
|
||||||
)
|
|
||||||
|
|
||||||
// unescapeUserinfo unescapes some characters that need not to be escaped as per RFC3986.
|
|
||||||
func unescapeUserinfo(s string) string {
|
|
||||||
return uiReplacer.Replace(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Escape reassembles the URL into a valid URL string.
|
|
||||||
// The general form of the result is one of:
|
|
||||||
//
|
|
||||||
// scheme:opaque
|
|
||||||
// scheme://userinfo@host/path?query#fragment
|
|
||||||
//
|
|
||||||
// If u.Opaque is non-empty, String uses the first form;
|
|
||||||
// otherwise it uses the second form.
|
|
||||||
//
|
|
||||||
// In the second form, the following rules apply:
|
|
||||||
// - if u.Scheme is empty, scheme: is omitted.
|
|
||||||
// - if u.User is nil, userinfo@ is omitted.
|
|
||||||
// - if u.Host is empty, host/ is omitted.
|
|
||||||
// - if u.Scheme and u.Host are empty and u.User is nil,
|
|
||||||
// the entire scheme://userinfo@host/ is omitted.
|
|
||||||
// - if u.Host is non-empty and u.Path begins with a /,
|
|
||||||
// the form host/path does not add its own /.
|
|
||||||
// - if u.RawQuery is empty, ?query is omitted.
|
|
||||||
// - if u.Fragment is empty, #fragment is omitted.
|
|
||||||
func Escape(u *url.URL) string {
|
|
||||||
var buf bytes.Buffer
|
|
||||||
if u.Scheme != "" {
|
|
||||||
buf.WriteString(u.Scheme)
|
|
||||||
buf.WriteByte(':')
|
|
||||||
}
|
|
||||||
if u.Opaque != "" {
|
|
||||||
buf.WriteString(u.Opaque)
|
|
||||||
} else {
|
|
||||||
if u.Scheme != "" || u.Host != "" || u.User != nil {
|
|
||||||
buf.WriteString("//")
|
|
||||||
if ui := u.User; ui != nil {
|
|
||||||
buf.WriteString(unescapeUserinfo(ui.String()))
|
|
||||||
buf.WriteByte('@')
|
|
||||||
}
|
|
||||||
if h := u.Host; h != "" {
|
|
||||||
buf.WriteString(h)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if u.Path != "" && u.Path[0] != '/' && u.Host != "" {
|
|
||||||
buf.WriteByte('/')
|
|
||||||
}
|
|
||||||
buf.WriteString(escape(u.Path, encodePath))
|
|
||||||
}
|
|
||||||
if u.RawQuery != "" {
|
|
||||||
buf.WriteByte('?')
|
|
||||||
buf.WriteString(u.RawQuery)
|
|
||||||
}
|
|
||||||
if u.Fragment != "" {
|
|
||||||
buf.WriteByte('#')
|
|
||||||
buf.WriteString(escape(u.Fragment, encodeFragment))
|
|
||||||
}
|
|
||||||
return buf.String()
|
|
||||||
}
|
|
202
vendor/github.com/go-openapi/jsonpointer/LICENSE
generated
vendored
202
vendor/github.com/go-openapi/jsonpointer/LICENSE
generated
vendored
@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed 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.
|
|
15
vendor/github.com/go-openapi/jsonpointer/README.md
generated
vendored
15
vendor/github.com/go-openapi/jsonpointer/README.md
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
# gojsonpointer [](https://ci.vmware.run/go-openapi/jsonpointer) [](https://coverage.vmware.run/go-openapi/jsonpointer) [](https://slackin.goswagger.io)
|
|
||||||
|
|
||||||
[](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) [](http://godoc.org/github.com/go-openapi/jsonpointer)
|
|
||||||
An implementation of JSON Pointer - Go language
|
|
||||||
|
|
||||||
## Status
|
|
||||||
Completed YES
|
|
||||||
|
|
||||||
Tested YES
|
|
||||||
|
|
||||||
## References
|
|
||||||
http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
|
|
||||||
|
|
||||||
### Note
|
|
||||||
The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented.
|
|
238
vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
238
vendor/github.com/go-openapi/jsonpointer/pointer.go
generated
vendored
@ -1,238 +0,0 @@
|
|||||||
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
|
|
||||||
//
|
|
||||||
// Licensed 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.
|
|
||||||
|
|
||||||
// author sigu-399
|
|
||||||
// author-github https://github.com/sigu-399
|
|
||||||
// author-mail sigu.399@gmail.com
|
|
||||||
//
|
|
||||||
// repository-name jsonpointer
|
|
||||||
// repository-desc An implementation of JSON Pointer - Go language
|
|
||||||
//
|
|
||||||
// description Main and unique file.
|
|
||||||
//
|
|
||||||
// created 25-02-2013
|
|
||||||
|
|
||||||
package jsonpointer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
emptyPointer = ``
|
|
||||||
pointerSeparator = `/`
|
|
||||||
|
|
||||||
invalidStart = `JSON pointer must be empty or start with a "` + pointerSeparator
|
|
||||||
)
|
|
||||||
|
|
||||||
var jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem()
|
|
||||||
|
|
||||||
// JSONPointable is an interface for structs to implement when they need to customize the
|
|
||||||
// json pointer process
|
|
||||||
type JSONPointable interface {
|
|
||||||
JSONLookup(string) (interface{}, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
type implStruct struct {
|
|
||||||
mode string // "SET" or "GET"
|
|
||||||
|
|
||||||
inDocument interface{}
|
|
||||||
|
|
||||||
setInValue interface{}
|
|
||||||
|
|
||||||
getOutNode interface{}
|
|
||||||
getOutKind reflect.Kind
|
|
||||||
outError error
|
|
||||||
}
|
|
||||||
|
|
||||||
// New creates a new json pointer for the given string
|
|
||||||
func New(jsonPointerString string) (Pointer, error) {
|
|
||||||
|
|
||||||
var p Pointer
|
|
||||||
err := p.parse(jsonPointerString)
|
|
||||||
return p, err
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pointer the json pointer reprsentation
|
|
||||||
type Pointer struct {
|
|
||||||
referenceTokens []string
|
|
||||||
}
|
|
||||||
|
|
||||||
// "Constructor", parses the given string JSON pointer
|
|
||||||
func (p *Pointer) parse(jsonPointerString string) error {
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
if jsonPointerString != emptyPointer {
|
|
||||||
if !strings.HasPrefix(jsonPointerString, pointerSeparator) {
|
|
||||||
err = errors.New(invalidStart)
|
|
||||||
} else {
|
|
||||||
referenceTokens := strings.Split(jsonPointerString, pointerSeparator)
|
|
||||||
for _, referenceToken := range referenceTokens[1:] {
|
|
||||||
p.referenceTokens = append(p.referenceTokens, referenceToken)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get uses the pointer to retrieve a value from a JSON document
|
|
||||||
func (p *Pointer) Get(document interface{}) (interface{}, reflect.Kind, error) {
|
|
||||||
return p.get(document, swag.DefaultJSONNameProvider)
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetForToken gets a value for a json pointer token 1 level deep
|
|
||||||
func GetForToken(document interface{}, decodedToken string) (interface{}, reflect.Kind, error) {
|
|
||||||
return getSingleImpl(document, decodedToken, swag.DefaultJSONNameProvider)
|
|
||||||
}
|
|
||||||
|
|
||||||
func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
|
||||||
kind := reflect.Invalid
|
|
||||||
rValue := reflect.Indirect(reflect.ValueOf(node))
|
|
||||||
kind = rValue.Kind()
|
|
||||||
switch kind {
|
|
||||||
|
|
||||||
case reflect.Struct:
|
|
||||||
if rValue.Type().Implements(jsonPointableType) {
|
|
||||||
r, err := node.(JSONPointable).JSONLookup(decodedToken)
|
|
||||||
if err != nil {
|
|
||||||
return nil, kind, err
|
|
||||||
}
|
|
||||||
return r, kind, nil
|
|
||||||
}
|
|
||||||
nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken)
|
|
||||||
if !ok {
|
|
||||||
return nil, kind, fmt.Errorf("object has no field %q", decodedToken)
|
|
||||||
}
|
|
||||||
fld := rValue.FieldByName(nm)
|
|
||||||
return fld.Interface(), kind, nil
|
|
||||||
|
|
||||||
case reflect.Map:
|
|
||||||
kv := reflect.ValueOf(decodedToken)
|
|
||||||
mv := rValue.MapIndex(kv)
|
|
||||||
if mv.IsValid() && !swag.IsZero(mv) {
|
|
||||||
return mv.Interface(), kind, nil
|
|
||||||
}
|
|
||||||
return nil, kind, fmt.Errorf("object has no key %q", decodedToken)
|
|
||||||
|
|
||||||
case reflect.Slice:
|
|
||||||
tokenIndex, err := strconv.Atoi(decodedToken)
|
|
||||||
if err != nil {
|
|
||||||
return nil, kind, err
|
|
||||||
}
|
|
||||||
sLength := rValue.Len()
|
|
||||||
if tokenIndex < 0 || tokenIndex >= sLength {
|
|
||||||
return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d'", sLength, tokenIndex)
|
|
||||||
}
|
|
||||||
|
|
||||||
elem := rValue.Index(tokenIndex)
|
|
||||||
return elem.Interface(), kind, nil
|
|
||||||
|
|
||||||
default:
|
|
||||||
return nil, kind, fmt.Errorf("invalid token reference %q", decodedToken)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Pointer) get(node interface{}, nameProvider *swag.NameProvider) (interface{}, reflect.Kind, error) {
|
|
||||||
|
|
||||||
if nameProvider == nil {
|
|
||||||
nameProvider = swag.DefaultJSONNameProvider
|
|
||||||
}
|
|
||||||
|
|
||||||
kind := reflect.Invalid
|
|
||||||
|
|
||||||
// Full document when empty
|
|
||||||
if len(p.referenceTokens) == 0 {
|
|
||||||
return node, kind, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, token := range p.referenceTokens {
|
|
||||||
|
|
||||||
decodedToken := Unescape(token)
|
|
||||||
|
|
||||||
r, knd, err := getSingleImpl(node, decodedToken, nameProvider)
|
|
||||||
if err != nil {
|
|
||||||
return nil, knd, err
|
|
||||||
}
|
|
||||||
node, kind = r, knd
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
rValue := reflect.ValueOf(node)
|
|
||||||
kind = rValue.Kind()
|
|
||||||
|
|
||||||
return node, kind, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// DecodedTokens returns the decoded tokens
|
|
||||||
func (p *Pointer) DecodedTokens() []string {
|
|
||||||
result := make([]string, 0, len(p.referenceTokens))
|
|
||||||
for _, t := range p.referenceTokens {
|
|
||||||
result = append(result, Unescape(t))
|
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsEmpty returns true if this is an empty json pointer
|
|
||||||
// this indicates that it points to the root document
|
|
||||||
func (p *Pointer) IsEmpty() bool {
|
|
||||||
return len(p.referenceTokens) == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pointer to string representation function
|
|
||||||
func (p *Pointer) String() string {
|
|
||||||
|
|
||||||
if len(p.referenceTokens) == 0 {
|
|
||||||
return emptyPointer
|
|
||||||
}
|
|
||||||
|
|
||||||
pointerString := pointerSeparator + strings.Join(p.referenceTokens, pointerSeparator)
|
|
||||||
|
|
||||||
return pointerString
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specific JSON pointer encoding here
|
|
||||||
// ~0 => ~
|
|
||||||
// ~1 => /
|
|
||||||
// ... and vice versa
|
|
||||||
|
|
||||||
const (
|
|
||||||
encRefTok0 = `~0`
|
|
||||||
encRefTok1 = `~1`
|
|
||||||
decRefTok0 = `~`
|
|
||||||
decRefTok1 = `/`
|
|
||||||
)
|
|
||||||
|
|
||||||
// Unescape unescapes a json pointer reference token string to the original representation
|
|
||||||
func Unescape(token string) string {
|
|
||||||
step1 := strings.Replace(token, encRefTok1, decRefTok1, -1)
|
|
||||||
step2 := strings.Replace(step1, encRefTok0, decRefTok0, -1)
|
|
||||||
return step2
|
|
||||||
}
|
|
||||||
|
|
||||||
// Escape escapes a pointer reference token string
|
|
||||||
func Escape(token string) string {
|
|
||||||
step1 := strings.Replace(token, decRefTok0, encRefTok0, -1)
|
|
||||||
step2 := strings.Replace(step1, decRefTok1, encRefTok1, -1)
|
|
||||||
return step2
|
|
||||||
}
|
|
202
vendor/github.com/go-openapi/jsonreference/LICENSE
generated
vendored
202
vendor/github.com/go-openapi/jsonreference/LICENSE
generated
vendored
@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed 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.
|
|
15
vendor/github.com/go-openapi/jsonreference/README.md
generated
vendored
15
vendor/github.com/go-openapi/jsonreference/README.md
generated
vendored
@ -1,15 +0,0 @@
|
|||||||
# gojsonreference [](https://ci.vmware.run/go-openapi/jsonreference) [](https://coverage.vmware.run/go-openapi/jsonreference) [](https://slackin.goswagger.io)
|
|
||||||
|
|
||||||
[](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) [](http://godoc.org/github.com/go-openapi/jsonreference)
|
|
||||||
An implementation of JSON Reference - Go language
|
|
||||||
|
|
||||||
## Status
|
|
||||||
Work in progress ( 90% done )
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
https://github.com/xeipuuv/gojsonpointer
|
|
||||||
|
|
||||||
## References
|
|
||||||
http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07
|
|
||||||
|
|
||||||
http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03
|
|
156
vendor/github.com/go-openapi/jsonreference/reference.go
generated
vendored
156
vendor/github.com/go-openapi/jsonreference/reference.go
generated
vendored
@ -1,156 +0,0 @@
|
|||||||
// Copyright 2013 sigu-399 ( https://github.com/sigu-399 )
|
|
||||||
//
|
|
||||||
// Licensed 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.
|
|
||||||
|
|
||||||
// author sigu-399
|
|
||||||
// author-github https://github.com/sigu-399
|
|
||||||
// author-mail sigu.399@gmail.com
|
|
||||||
//
|
|
||||||
// repository-name jsonreference
|
|
||||||
// repository-desc An implementation of JSON Reference - Go language
|
|
||||||
//
|
|
||||||
// description Main and unique file.
|
|
||||||
//
|
|
||||||
// created 26-02-2013
|
|
||||||
|
|
||||||
package jsonreference
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/PuerkitoBio/purell"
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
fragmentRune = `#`
|
|
||||||
)
|
|
||||||
|
|
||||||
// New creates a new reference for the given string
|
|
||||||
func New(jsonReferenceString string) (Ref, error) {
|
|
||||||
|
|
||||||
var r Ref
|
|
||||||
err := r.parse(jsonReferenceString)
|
|
||||||
return r, err
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// MustCreateRef parses the ref string and panics when it's invalid.
|
|
||||||
// Use the New method for a version that returns an error
|
|
||||||
func MustCreateRef(ref string) Ref {
|
|
||||||
r, err := New(ref)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ref represents a json reference object
|
|
||||||
type Ref struct {
|
|
||||||
referenceURL *url.URL
|
|
||||||
referencePointer jsonpointer.Pointer
|
|
||||||
|
|
||||||
HasFullURL bool
|
|
||||||
HasURLPathOnly bool
|
|
||||||
HasFragmentOnly bool
|
|
||||||
HasFileScheme bool
|
|
||||||
HasFullFilePath bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetURL gets the URL for this reference
|
|
||||||
func (r *Ref) GetURL() *url.URL {
|
|
||||||
return r.referenceURL
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPointer gets the json pointer for this reference
|
|
||||||
func (r *Ref) GetPointer() *jsonpointer.Pointer {
|
|
||||||
return &r.referencePointer
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns the best version of the url for this reference
|
|
||||||
func (r *Ref) String() string {
|
|
||||||
|
|
||||||
if r.referenceURL != nil {
|
|
||||||
return r.referenceURL.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
if r.HasFragmentOnly {
|
|
||||||
return fragmentRune + r.referencePointer.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.referencePointer.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsRoot returns true if this reference is a root document
|
|
||||||
func (r *Ref) IsRoot() bool {
|
|
||||||
return r.referenceURL != nil &&
|
|
||||||
!r.IsCanonical() &&
|
|
||||||
!r.HasURLPathOnly &&
|
|
||||||
r.referenceURL.Fragment == ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsCanonical returns true when this pointer starts with http(s):// or file://
|
|
||||||
func (r *Ref) IsCanonical() bool {
|
|
||||||
return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL)
|
|
||||||
}
|
|
||||||
|
|
||||||
// "Constructor", parses the given string JSON reference
|
|
||||||
func (r *Ref) parse(jsonReferenceString string) error {
|
|
||||||
|
|
||||||
parsed, err := url.Parse(jsonReferenceString)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
r.referenceURL, _ = url.Parse(purell.NormalizeURL(parsed, purell.FlagsSafe|purell.FlagRemoveDuplicateSlashes))
|
|
||||||
refURL := r.referenceURL
|
|
||||||
|
|
||||||
if refURL.Scheme != "" && refURL.Host != "" {
|
|
||||||
r.HasFullURL = true
|
|
||||||
} else {
|
|
||||||
if refURL.Path != "" {
|
|
||||||
r.HasURLPathOnly = true
|
|
||||||
} else if refURL.RawQuery == "" && refURL.Fragment != "" {
|
|
||||||
r.HasFragmentOnly = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r.HasFileScheme = refURL.Scheme == "file"
|
|
||||||
r.HasFullFilePath = strings.HasPrefix(refURL.Path, "/")
|
|
||||||
|
|
||||||
// invalid json-pointer error means url has no json-pointer fragment. simply ignore error
|
|
||||||
r.referencePointer, _ = jsonpointer.New(refURL.Fragment)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inherits creates a new reference from a parent and a child
|
|
||||||
// If the child cannot inherit from the parent, an error is returned
|
|
||||||
func (r *Ref) Inherits(child Ref) (*Ref, error) {
|
|
||||||
childURL := child.GetURL()
|
|
||||||
parentURL := r.GetURL()
|
|
||||||
if childURL == nil {
|
|
||||||
return nil, errors.New("child url is nil")
|
|
||||||
}
|
|
||||||
if parentURL == nil {
|
|
||||||
return &child, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
ref, err := New(parentURL.ResolveReference(childURL).String())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &ref, nil
|
|
||||||
}
|
|
202
vendor/github.com/go-openapi/spec/LICENSE
generated
vendored
202
vendor/github.com/go-openapi/spec/LICENSE
generated
vendored
@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed 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.
|
|
5
vendor/github.com/go-openapi/spec/README.md
generated
vendored
5
vendor/github.com/go-openapi/spec/README.md
generated
vendored
@ -1,5 +0,0 @@
|
|||||||
# OAI object model [](https://ci.vmware.run/go-openapi/spec) [](https://coverage.vmware.run/go-openapi/spec) [](https://slackin.goswagger.io)
|
|
||||||
|
|
||||||
[](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE) [](http://godoc.org/github.com/go-openapi/spec)
|
|
||||||
|
|
||||||
The object model for OpenAPI specification documents
|
|
274
vendor/github.com/go-openapi/spec/bindata.go
generated
vendored
274
vendor/github.com/go-openapi/spec/bindata.go
generated
vendored
File diff suppressed because one or more lines are too long
24
vendor/github.com/go-openapi/spec/contact_info.go
generated
vendored
24
vendor/github.com/go-openapi/spec/contact_info.go
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
// ContactInfo contact information for the exposed API.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#contactObject
|
|
||||||
type ContactInfo struct {
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
URL string `json:"url,omitempty"`
|
|
||||||
Email string `json:"email,omitempty"`
|
|
||||||
}
|
|
626
vendor/github.com/go-openapi/spec/expander.go
generated
vendored
626
vendor/github.com/go-openapi/spec/expander.go
generated
vendored
@ -1,626 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"reflect"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ResolutionCache a cache for resolving urls
|
|
||||||
type ResolutionCache interface {
|
|
||||||
Get(string) (interface{}, bool)
|
|
||||||
Set(string, interface{})
|
|
||||||
}
|
|
||||||
|
|
||||||
type simpleCache struct {
|
|
||||||
lock sync.Mutex
|
|
||||||
store map[string]interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
var resCache = initResolutionCache()
|
|
||||||
|
|
||||||
func initResolutionCache() ResolutionCache {
|
|
||||||
return &simpleCache{store: map[string]interface{}{
|
|
||||||
"http://swagger.io/v2/schema.json": MustLoadSwagger20Schema(),
|
|
||||||
"http://json-schema.org/draft-04/schema": MustLoadJSONSchemaDraft04(),
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *simpleCache) Get(uri string) (interface{}, bool) {
|
|
||||||
s.lock.Lock()
|
|
||||||
v, ok := s.store[uri]
|
|
||||||
s.lock.Unlock()
|
|
||||||
return v, ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *simpleCache) Set(uri string, data interface{}) {
|
|
||||||
s.lock.Lock()
|
|
||||||
s.store[uri] = data
|
|
||||||
s.lock.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolveRef resolves a reference against a context root
|
|
||||||
func ResolveRef(root interface{}, ref *Ref) (*Schema, error) {
|
|
||||||
resolver, err := defaultSchemaLoader(root, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result := new(Schema)
|
|
||||||
if err := resolver.Resolve(ref, result); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolveParameter resolves a paramter reference against a context root
|
|
||||||
func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) {
|
|
||||||
resolver, err := defaultSchemaLoader(root, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result := new(Parameter)
|
|
||||||
if err := resolver.Resolve(&ref, result); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResolveResponse resolves response a reference against a context root
|
|
||||||
func ResolveResponse(root interface{}, ref Ref) (*Response, error) {
|
|
||||||
resolver, err := defaultSchemaLoader(root, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
result := new(Response)
|
|
||||||
if err := resolver.Resolve(&ref, result); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type schemaLoader struct {
|
|
||||||
loadingRef *Ref
|
|
||||||
startingRef *Ref
|
|
||||||
currentRef *Ref
|
|
||||||
root interface{}
|
|
||||||
cache ResolutionCache
|
|
||||||
loadDoc func(string) (json.RawMessage, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
var idPtr, _ = jsonpointer.New("/id")
|
|
||||||
var schemaPtr, _ = jsonpointer.New("/$schema")
|
|
||||||
var refPtr, _ = jsonpointer.New("/$ref")
|
|
||||||
|
|
||||||
func defaultSchemaLoader(root interface{}, ref *Ref, cache ResolutionCache) (*schemaLoader, error) {
|
|
||||||
if cache == nil {
|
|
||||||
cache = resCache
|
|
||||||
}
|
|
||||||
|
|
||||||
var ptr *jsonpointer.Pointer
|
|
||||||
if ref != nil {
|
|
||||||
ptr = ref.GetPointer()
|
|
||||||
}
|
|
||||||
|
|
||||||
currentRef := nextRef(root, ref, ptr)
|
|
||||||
|
|
||||||
return &schemaLoader{
|
|
||||||
root: root,
|
|
||||||
loadingRef: ref,
|
|
||||||
startingRef: ref,
|
|
||||||
cache: cache,
|
|
||||||
loadDoc: func(path string) (json.RawMessage, error) {
|
|
||||||
data, err := swag.LoadFromFileOrHTTP(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return json.RawMessage(data), nil
|
|
||||||
},
|
|
||||||
currentRef: currentRef,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func idFromNode(node interface{}) (*Ref, error) {
|
|
||||||
if idValue, _, err := idPtr.Get(node); err == nil {
|
|
||||||
if refStr, ok := idValue.(string); ok && refStr != "" {
|
|
||||||
idRef, err := NewRef(refStr)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &idRef, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func nextRef(startingNode interface{}, startingRef *Ref, ptr *jsonpointer.Pointer) *Ref {
|
|
||||||
if startingRef == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if ptr == nil {
|
|
||||||
return startingRef
|
|
||||||
}
|
|
||||||
|
|
||||||
ret := startingRef
|
|
||||||
var idRef *Ref
|
|
||||||
node := startingNode
|
|
||||||
|
|
||||||
for _, tok := range ptr.DecodedTokens() {
|
|
||||||
node, _, _ = jsonpointer.GetForToken(node, tok)
|
|
||||||
if node == nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
idRef, _ = idFromNode(node)
|
|
||||||
if idRef != nil {
|
|
||||||
nw, err := ret.Inherits(*idRef)
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
ret = nw
|
|
||||||
}
|
|
||||||
|
|
||||||
refRef, _, _ := refPtr.Get(node)
|
|
||||||
if refRef != nil {
|
|
||||||
rf, _ := NewRef(refRef.(string))
|
|
||||||
nw, err := ret.Inherits(rf)
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
ret = nw
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *schemaLoader) resolveRef(currentRef, ref *Ref, node, target interface{}) error {
|
|
||||||
tgt := reflect.ValueOf(target)
|
|
||||||
if tgt.Kind() != reflect.Ptr {
|
|
||||||
return fmt.Errorf("resolve ref: target needs to be a pointer")
|
|
||||||
}
|
|
||||||
|
|
||||||
oldRef := currentRef
|
|
||||||
if currentRef != nil {
|
|
||||||
var err error
|
|
||||||
currentRef, err = currentRef.Inherits(*nextRef(node, ref, currentRef.GetPointer()))
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if currentRef == nil {
|
|
||||||
currentRef = ref
|
|
||||||
}
|
|
||||||
|
|
||||||
refURL := currentRef.GetURL()
|
|
||||||
if refURL == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if currentRef.IsRoot() {
|
|
||||||
nv := reflect.ValueOf(node)
|
|
||||||
reflect.Indirect(tgt).Set(reflect.Indirect(nv))
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.HasPrefix(refURL.String(), "#") {
|
|
||||||
res, _, err := ref.GetPointer().Get(node)
|
|
||||||
if err != nil {
|
|
||||||
res, _, err = ref.GetPointer().Get(r.root)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rv := reflect.Indirect(reflect.ValueOf(res))
|
|
||||||
tgtType := reflect.Indirect(tgt).Type()
|
|
||||||
if rv.Type().AssignableTo(tgtType) {
|
|
||||||
reflect.Indirect(tgt).Set(reflect.Indirect(reflect.ValueOf(res)))
|
|
||||||
} else {
|
|
||||||
if err := swag.DynamicJSONToStruct(rv.Interface(), target); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if refURL.Scheme != "" && refURL.Host != "" {
|
|
||||||
// most definitely take the red pill
|
|
||||||
data, _, _, err := r.load(refURL)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((oldRef == nil && currentRef != nil) ||
|
|
||||||
(oldRef != nil && currentRef == nil) ||
|
|
||||||
oldRef.String() != currentRef.String()) &&
|
|
||||||
((oldRef == nil && ref != nil) ||
|
|
||||||
(oldRef != nil && ref == nil) ||
|
|
||||||
(oldRef.String() != ref.String())) {
|
|
||||||
|
|
||||||
return r.resolveRef(currentRef, ref, data, target)
|
|
||||||
}
|
|
||||||
|
|
||||||
var res interface{}
|
|
||||||
if currentRef.String() != "" {
|
|
||||||
res, _, err = currentRef.GetPointer().Get(data)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
res = data
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := swag.DynamicJSONToStruct(res, target); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) {
|
|
||||||
toFetch := *refURL
|
|
||||||
toFetch.Fragment = ""
|
|
||||||
|
|
||||||
data, fromCache := r.cache.Get(toFetch.String())
|
|
||||||
if !fromCache {
|
|
||||||
b, err := r.loadDoc(toFetch.String())
|
|
||||||
if err != nil {
|
|
||||||
return nil, url.URL{}, false, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := json.Unmarshal(b, &data); err != nil {
|
|
||||||
return nil, url.URL{}, false, err
|
|
||||||
}
|
|
||||||
r.cache.Set(toFetch.String(), data)
|
|
||||||
}
|
|
||||||
|
|
||||||
return data, toFetch, fromCache, nil
|
|
||||||
}
|
|
||||||
func (r *schemaLoader) Resolve(ref *Ref, target interface{}) error {
|
|
||||||
if err := r.resolveRef(r.currentRef, ref, r.root, target); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type specExpander struct {
|
|
||||||
spec *Swagger
|
|
||||||
resolver *schemaLoader
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExpandSpec expands the references in a swagger spec
|
|
||||||
func ExpandSpec(spec *Swagger) error {
|
|
||||||
resolver, err := defaultSchemaLoader(spec, nil, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for key, defintition := range spec.Definitions {
|
|
||||||
var def *Schema
|
|
||||||
var err error
|
|
||||||
if def, err = expandSchema(defintition, []string{"#/definitions/" + key}, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
spec.Definitions[key] = *def
|
|
||||||
}
|
|
||||||
|
|
||||||
for key, parameter := range spec.Parameters {
|
|
||||||
if err := expandParameter(¶meter, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
spec.Parameters[key] = parameter
|
|
||||||
}
|
|
||||||
|
|
||||||
for key, response := range spec.Responses {
|
|
||||||
if err := expandResponse(&response, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
spec.Responses[key] = response
|
|
||||||
}
|
|
||||||
|
|
||||||
if spec.Paths != nil {
|
|
||||||
for key, path := range spec.Paths.Paths {
|
|
||||||
if err := expandPathItem(&path, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
spec.Paths.Paths[key] = path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExpandSchema expands the refs in the schema object
|
|
||||||
func ExpandSchema(schema *Schema, root interface{}, cache ResolutionCache) error {
|
|
||||||
|
|
||||||
if schema == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if root == nil {
|
|
||||||
root = schema
|
|
||||||
}
|
|
||||||
|
|
||||||
nrr, _ := NewRef(schema.ID)
|
|
||||||
var rrr *Ref
|
|
||||||
if nrr.String() != "" {
|
|
||||||
switch root.(type) {
|
|
||||||
case *Schema:
|
|
||||||
rid, _ := NewRef(root.(*Schema).ID)
|
|
||||||
rrr, _ = rid.Inherits(nrr)
|
|
||||||
case *Swagger:
|
|
||||||
rid, _ := NewRef(root.(*Swagger).ID)
|
|
||||||
rrr, _ = rid.Inherits(nrr)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
resolver, err := defaultSchemaLoader(root, rrr, cache)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
refs := []string{""}
|
|
||||||
if rrr != nil {
|
|
||||||
refs[0] = rrr.String()
|
|
||||||
}
|
|
||||||
var s *Schema
|
|
||||||
if s, err = expandSchema(*schema, refs, resolver); err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
*schema = *s
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func expandItems(target Schema, parentRefs []string, resolver *schemaLoader) (*Schema, error) {
|
|
||||||
if target.Items != nil {
|
|
||||||
if target.Items.Schema != nil {
|
|
||||||
t, err := expandSchema(*target.Items.Schema, parentRefs, resolver)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
*target.Items.Schema = *t
|
|
||||||
}
|
|
||||||
for i := range target.Items.Schemas {
|
|
||||||
t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
target.Items.Schemas[i] = *t
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &target, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader) (schema *Schema, err error) {
|
|
||||||
defer func() {
|
|
||||||
schema = &target
|
|
||||||
}()
|
|
||||||
if target.Ref.String() == "" && target.Ref.IsRoot() {
|
|
||||||
target = *resolver.root.(*Schema)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// t is the new expanded schema
|
|
||||||
var t *Schema
|
|
||||||
for target.Ref.String() != "" {
|
|
||||||
// var newTarget Schema
|
|
||||||
pRefs := strings.Join(parentRefs, ",")
|
|
||||||
pRefs += ","
|
|
||||||
if strings.Contains(pRefs, target.Ref.String()+",") {
|
|
||||||
err = nil
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = resolver.Resolve(&target.Ref, &t); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
parentRefs = append(parentRefs, target.Ref.String())
|
|
||||||
target = *t
|
|
||||||
}
|
|
||||||
|
|
||||||
if t, err = expandItems(target, parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
target = *t
|
|
||||||
|
|
||||||
for i := range target.AllOf {
|
|
||||||
if t, err = expandSchema(target.AllOf[i], parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
target.AllOf[i] = *t
|
|
||||||
}
|
|
||||||
for i := range target.AnyOf {
|
|
||||||
if t, err = expandSchema(target.AnyOf[i], parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
target.AnyOf[i] = *t
|
|
||||||
}
|
|
||||||
for i := range target.OneOf {
|
|
||||||
if t, err = expandSchema(target.OneOf[i], parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
target.OneOf[i] = *t
|
|
||||||
}
|
|
||||||
if target.Not != nil {
|
|
||||||
if t, err = expandSchema(*target.Not, parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
*target.Not = *t
|
|
||||||
}
|
|
||||||
for k, _ := range target.Properties {
|
|
||||||
if t, err = expandSchema(target.Properties[k], parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
target.Properties[k] = *t
|
|
||||||
}
|
|
||||||
if target.AdditionalProperties != nil && target.AdditionalProperties.Schema != nil {
|
|
||||||
if t, err = expandSchema(*target.AdditionalProperties.Schema, parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
*target.AdditionalProperties.Schema = *t
|
|
||||||
}
|
|
||||||
for k, _ := range target.PatternProperties {
|
|
||||||
if t, err = expandSchema(target.PatternProperties[k], parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
target.PatternProperties[k] = *t
|
|
||||||
}
|
|
||||||
for k, _ := range target.Dependencies {
|
|
||||||
if target.Dependencies[k].Schema != nil {
|
|
||||||
if t, err = expandSchema(*target.Dependencies[k].Schema, parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
*target.Dependencies[k].Schema = *t
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if target.AdditionalItems != nil && target.AdditionalItems.Schema != nil {
|
|
||||||
if t, err = expandSchema(*target.AdditionalItems.Schema, parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
*target.AdditionalItems.Schema = *t
|
|
||||||
}
|
|
||||||
for k, _ := range target.Definitions {
|
|
||||||
if t, err = expandSchema(target.Definitions[k], parentRefs, resolver); err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
target.Definitions[k] = *t
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func expandPathItem(pathItem *PathItem, resolver *schemaLoader) error {
|
|
||||||
if pathItem == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if pathItem.Ref.String() != "" {
|
|
||||||
if err := resolver.Resolve(&pathItem.Ref, &pathItem); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for idx := range pathItem.Parameters {
|
|
||||||
if err := expandParameter(&(pathItem.Parameters[idx]), resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := expandOperation(pathItem.Get, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := expandOperation(pathItem.Head, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := expandOperation(pathItem.Options, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := expandOperation(pathItem.Put, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := expandOperation(pathItem.Post, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := expandOperation(pathItem.Patch, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := expandOperation(pathItem.Delete, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func expandOperation(op *Operation, resolver *schemaLoader) error {
|
|
||||||
if op == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
for i, param := range op.Parameters {
|
|
||||||
if err := expandParameter(¶m, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
op.Parameters[i] = param
|
|
||||||
}
|
|
||||||
|
|
||||||
if op.Responses != nil {
|
|
||||||
responses := op.Responses
|
|
||||||
if err := expandResponse(responses.Default, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for code, response := range responses.StatusCodeResponses {
|
|
||||||
if err := expandResponse(&response, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
responses.StatusCodeResponses[code] = response
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func expandResponse(response *Response, resolver *schemaLoader) error {
|
|
||||||
if response == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.Ref.String() != "" {
|
|
||||||
if err := resolver.Resolve(&response.Ref, response); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.Schema != nil {
|
|
||||||
parentRefs := []string{response.Schema.Ref.String()}
|
|
||||||
if err := resolver.Resolve(&response.Schema.Ref, &response.Schema); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if s, err := expandSchema(*response.Schema, parentRefs, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
*response.Schema = *s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func expandParameter(parameter *Parameter, resolver *schemaLoader) error {
|
|
||||||
if parameter == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if parameter.Ref.String() != "" {
|
|
||||||
if err := resolver.Resolve(¶meter.Ref, parameter); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if parameter.Schema != nil {
|
|
||||||
parentRefs := []string{parameter.Schema.Ref.String()}
|
|
||||||
if err := resolver.Resolve(¶meter.Schema.Ref, ¶meter.Schema); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if s, err := expandSchema(*parameter.Schema, parentRefs, resolver); err != nil {
|
|
||||||
return err
|
|
||||||
} else {
|
|
||||||
*parameter.Schema = *s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
24
vendor/github.com/go-openapi/spec/external_docs.go
generated
vendored
24
vendor/github.com/go-openapi/spec/external_docs.go
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
// ExternalDocumentation allows referencing an external resource for
|
|
||||||
// extended documentation.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#externalDocumentationObject
|
|
||||||
type ExternalDocumentation struct {
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
URL string `json:"url,omitempty"`
|
|
||||||
}
|
|
165
vendor/github.com/go-openapi/spec/header.go
generated
vendored
165
vendor/github.com/go-openapi/spec/header.go
generated
vendored
@ -1,165 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
type HeaderProps struct {
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Header describes a header for a response of the API
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#headerObject
|
|
||||||
type Header struct {
|
|
||||||
CommonValidations
|
|
||||||
SimpleSchema
|
|
||||||
HeaderProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResponseHeader creates a new header instance for use in a response
|
|
||||||
func ResponseHeader() *Header {
|
|
||||||
return new(Header)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDescription sets the description on this response, allows for chaining
|
|
||||||
func (h *Header) WithDescription(description string) *Header {
|
|
||||||
h.Description = description
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// Typed a fluent builder method for the type of parameter
|
|
||||||
func (h *Header) Typed(tpe, format string) *Header {
|
|
||||||
h.Type = tpe
|
|
||||||
h.Format = format
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// CollectionOf a fluent builder method for an array item
|
|
||||||
func (h *Header) CollectionOf(items *Items, format string) *Header {
|
|
||||||
h.Type = "array"
|
|
||||||
h.Items = items
|
|
||||||
h.CollectionFormat = format
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDefault sets the default value on this item
|
|
||||||
func (h *Header) WithDefault(defaultValue interface{}) *Header {
|
|
||||||
h.Default = defaultValue
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxLength sets a max length value
|
|
||||||
func (h *Header) WithMaxLength(max int64) *Header {
|
|
||||||
h.MaxLength = &max
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinLength sets a min length value
|
|
||||||
func (h *Header) WithMinLength(min int64) *Header {
|
|
||||||
h.MinLength = &min
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithPattern sets a pattern value
|
|
||||||
func (h *Header) WithPattern(pattern string) *Header {
|
|
||||||
h.Pattern = pattern
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMultipleOf sets a multiple of value
|
|
||||||
func (h *Header) WithMultipleOf(number float64) *Header {
|
|
||||||
h.MultipleOf = &number
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaximum sets a maximum number value
|
|
||||||
func (h *Header) WithMaximum(max float64, exclusive bool) *Header {
|
|
||||||
h.Maximum = &max
|
|
||||||
h.ExclusiveMaximum = exclusive
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinimum sets a minimum number value
|
|
||||||
func (h *Header) WithMinimum(min float64, exclusive bool) *Header {
|
|
||||||
h.Minimum = &min
|
|
||||||
h.ExclusiveMinimum = exclusive
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithEnum sets a the enum values (replace)
|
|
||||||
func (h *Header) WithEnum(values ...interface{}) *Header {
|
|
||||||
h.Enum = append([]interface{}{}, values...)
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxItems sets the max items
|
|
||||||
func (h *Header) WithMaxItems(size int64) *Header {
|
|
||||||
h.MaxItems = &size
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinItems sets the min items
|
|
||||||
func (h *Header) WithMinItems(size int64) *Header {
|
|
||||||
h.MinItems = &size
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// UniqueValues dictates that this array can only have unique items
|
|
||||||
func (h *Header) UniqueValues() *Header {
|
|
||||||
h.UniqueItems = true
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// AllowDuplicates this array can have duplicates
|
|
||||||
func (h *Header) AllowDuplicates() *Header {
|
|
||||||
h.UniqueItems = false
|
|
||||||
return h
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON marshal this to JSON
|
|
||||||
func (h Header) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(h.CommonValidations)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(h.SimpleSchema)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b3, err := json.Marshal(h.HeaderProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return swag.ConcatJSON(b1, b2, b3), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON marshal this from JSON
|
|
||||||
func (h *Header) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &h.CommonValidations); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &h.SimpleSchema); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &h.HeaderProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
168
vendor/github.com/go-openapi/spec/info.go
generated
vendored
168
vendor/github.com/go-openapi/spec/info.go
generated
vendored
@ -1,168 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Extensions vendor specific extensions
|
|
||||||
type Extensions map[string]interface{}
|
|
||||||
|
|
||||||
// Add adds a value to these extensions
|
|
||||||
func (e Extensions) Add(key string, value interface{}) {
|
|
||||||
realKey := strings.ToLower(key)
|
|
||||||
e[realKey] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetString gets a string value from the extensions
|
|
||||||
func (e Extensions) GetString(key string) (string, bool) {
|
|
||||||
if v, ok := e[strings.ToLower(key)]; ok {
|
|
||||||
str, ok := v.(string)
|
|
||||||
return str, ok
|
|
||||||
}
|
|
||||||
return "", false
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetBool gets a string value from the extensions
|
|
||||||
func (e Extensions) GetBool(key string) (bool, bool) {
|
|
||||||
if v, ok := e[strings.ToLower(key)]; ok {
|
|
||||||
str, ok := v.(bool)
|
|
||||||
return str, ok
|
|
||||||
}
|
|
||||||
return false, false
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetStringSlice gets a string value from the extensions
|
|
||||||
func (e Extensions) GetStringSlice(key string) ([]string, bool) {
|
|
||||||
if v, ok := e[strings.ToLower(key)]; ok {
|
|
||||||
arr, ok := v.([]interface{})
|
|
||||||
if !ok {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
var strs []string
|
|
||||||
for _, iface := range arr {
|
|
||||||
str, ok := iface.(string)
|
|
||||||
if !ok {
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
strs = append(strs, str)
|
|
||||||
}
|
|
||||||
return strs, ok
|
|
||||||
}
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
// VendorExtensible composition block.
|
|
||||||
type VendorExtensible struct {
|
|
||||||
Extensions Extensions
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddExtension adds an extension to this extensible object
|
|
||||||
func (v *VendorExtensible) AddExtension(key string, value interface{}) {
|
|
||||||
if value == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if v.Extensions == nil {
|
|
||||||
v.Extensions = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
v.Extensions.Add(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON marshals the extensions to json
|
|
||||||
func (v VendorExtensible) MarshalJSON() ([]byte, error) {
|
|
||||||
toser := make(map[string]interface{})
|
|
||||||
for k, v := range v.Extensions {
|
|
||||||
lk := strings.ToLower(k)
|
|
||||||
if strings.HasPrefix(lk, "x-") {
|
|
||||||
toser[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return json.Marshal(toser)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON for this extensible object
|
|
||||||
func (v *VendorExtensible) UnmarshalJSON(data []byte) error {
|
|
||||||
var d map[string]interface{}
|
|
||||||
if err := json.Unmarshal(data, &d); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for k, vv := range d {
|
|
||||||
lk := strings.ToLower(k)
|
|
||||||
if strings.HasPrefix(lk, "x-") {
|
|
||||||
if v.Extensions == nil {
|
|
||||||
v.Extensions = map[string]interface{}{}
|
|
||||||
}
|
|
||||||
v.Extensions[k] = vv
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// InfoProps the properties for an info definition
|
|
||||||
type InfoProps struct {
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
Title string `json:"title,omitempty"`
|
|
||||||
TermsOfService string `json:"termsOfService,omitempty"`
|
|
||||||
Contact *ContactInfo `json:"contact,omitempty"`
|
|
||||||
License *License `json:"license,omitempty"`
|
|
||||||
Version string `json:"version,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Info object provides metadata about the API.
|
|
||||||
// The metadata can be used by the clients if needed, and can be presented in the Swagger-UI for convenience.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#infoObject
|
|
||||||
type Info struct {
|
|
||||||
VendorExtensible
|
|
||||||
InfoProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup look up a value by the json property name
|
|
||||||
func (i Info) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if ex, ok := i.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
r, _, err := jsonpointer.GetForToken(i.InfoProps, token)
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON marshal this to JSON
|
|
||||||
func (i Info) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(i.InfoProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(i.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return swag.ConcatJSON(b1, b2), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON marshal this from JSON
|
|
||||||
func (i *Info) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &i.InfoProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &i.VendorExtensible); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
199
vendor/github.com/go-openapi/spec/items.go
generated
vendored
199
vendor/github.com/go-openapi/spec/items.go
generated
vendored
@ -1,199 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SimpleSchema struct {
|
|
||||||
Type string `json:"type,omitempty"`
|
|
||||||
Format string `json:"format,omitempty"`
|
|
||||||
Items *Items `json:"items,omitempty"`
|
|
||||||
CollectionFormat string `json:"collectionFormat,omitempty"`
|
|
||||||
Default interface{} `json:"default,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SimpleSchema) TypeName() string {
|
|
||||||
if s.Format != "" {
|
|
||||||
return s.Format
|
|
||||||
}
|
|
||||||
return s.Type
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SimpleSchema) ItemsTypeName() string {
|
|
||||||
if s.Items == nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return s.Items.TypeName()
|
|
||||||
}
|
|
||||||
|
|
||||||
type CommonValidations struct {
|
|
||||||
Maximum *float64 `json:"maximum,omitempty"`
|
|
||||||
ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"`
|
|
||||||
Minimum *float64 `json:"minimum,omitempty"`
|
|
||||||
ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"`
|
|
||||||
MaxLength *int64 `json:"maxLength,omitempty"`
|
|
||||||
MinLength *int64 `json:"minLength,omitempty"`
|
|
||||||
Pattern string `json:"pattern,omitempty"`
|
|
||||||
MaxItems *int64 `json:"maxItems,omitempty"`
|
|
||||||
MinItems *int64 `json:"minItems,omitempty"`
|
|
||||||
UniqueItems bool `json:"uniqueItems,omitempty"`
|
|
||||||
MultipleOf *float64 `json:"multipleOf,omitempty"`
|
|
||||||
Enum []interface{} `json:"enum,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Items a limited subset of JSON-Schema's items object.
|
|
||||||
// It is used by parameter definitions that are not located in "body".
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#items-object-
|
|
||||||
type Items struct {
|
|
||||||
Refable
|
|
||||||
CommonValidations
|
|
||||||
SimpleSchema
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewItems creates a new instance of items
|
|
||||||
func NewItems() *Items {
|
|
||||||
return &Items{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Typed a fluent builder method for the type of item
|
|
||||||
func (i *Items) Typed(tpe, format string) *Items {
|
|
||||||
i.Type = tpe
|
|
||||||
i.Format = format
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// CollectionOf a fluent builder method for an array item
|
|
||||||
func (i *Items) CollectionOf(items *Items, format string) *Items {
|
|
||||||
i.Type = "array"
|
|
||||||
i.Items = items
|
|
||||||
i.CollectionFormat = format
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDefault sets the default value on this item
|
|
||||||
func (i *Items) WithDefault(defaultValue interface{}) *Items {
|
|
||||||
i.Default = defaultValue
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxLength sets a max length value
|
|
||||||
func (i *Items) WithMaxLength(max int64) *Items {
|
|
||||||
i.MaxLength = &max
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinLength sets a min length value
|
|
||||||
func (i *Items) WithMinLength(min int64) *Items {
|
|
||||||
i.MinLength = &min
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithPattern sets a pattern value
|
|
||||||
func (i *Items) WithPattern(pattern string) *Items {
|
|
||||||
i.Pattern = pattern
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMultipleOf sets a multiple of value
|
|
||||||
func (i *Items) WithMultipleOf(number float64) *Items {
|
|
||||||
i.MultipleOf = &number
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaximum sets a maximum number value
|
|
||||||
func (i *Items) WithMaximum(max float64, exclusive bool) *Items {
|
|
||||||
i.Maximum = &max
|
|
||||||
i.ExclusiveMaximum = exclusive
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinimum sets a minimum number value
|
|
||||||
func (i *Items) WithMinimum(min float64, exclusive bool) *Items {
|
|
||||||
i.Minimum = &min
|
|
||||||
i.ExclusiveMinimum = exclusive
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithEnum sets a the enum values (replace)
|
|
||||||
func (i *Items) WithEnum(values ...interface{}) *Items {
|
|
||||||
i.Enum = append([]interface{}{}, values...)
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxItems sets the max items
|
|
||||||
func (i *Items) WithMaxItems(size int64) *Items {
|
|
||||||
i.MaxItems = &size
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinItems sets the min items
|
|
||||||
func (i *Items) WithMinItems(size int64) *Items {
|
|
||||||
i.MinItems = &size
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// UniqueValues dictates that this array can only have unique items
|
|
||||||
func (i *Items) UniqueValues() *Items {
|
|
||||||
i.UniqueItems = true
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// AllowDuplicates this array can have duplicates
|
|
||||||
func (i *Items) AllowDuplicates() *Items {
|
|
||||||
i.UniqueItems = false
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON hydrates this items instance with the data from JSON
|
|
||||||
func (i *Items) UnmarshalJSON(data []byte) error {
|
|
||||||
var validations CommonValidations
|
|
||||||
if err := json.Unmarshal(data, &validations); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var ref Refable
|
|
||||||
if err := json.Unmarshal(data, &ref); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
var simpleSchema SimpleSchema
|
|
||||||
if err := json.Unmarshal(data, &simpleSchema); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.Refable = ref
|
|
||||||
i.CommonValidations = validations
|
|
||||||
i.SimpleSchema = simpleSchema
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON converts this items object to JSON
|
|
||||||
func (i Items) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(i.CommonValidations)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(i.SimpleSchema)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b3, err := json.Marshal(i.Refable)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return swag.ConcatJSON(b3, b1, b2), nil
|
|
||||||
}
|
|
23
vendor/github.com/go-openapi/spec/license.go
generated
vendored
23
vendor/github.com/go-openapi/spec/license.go
generated
vendored
@ -1,23 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
// License information for the exposed API.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#licenseObject
|
|
||||||
type License struct {
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
URL string `json:"url,omitempty"`
|
|
||||||
}
|
|
233
vendor/github.com/go-openapi/spec/operation.go
generated
vendored
233
vendor/github.com/go-openapi/spec/operation.go
generated
vendored
@ -1,233 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
type OperationProps struct {
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
Consumes []string `json:"consumes,omitempty"`
|
|
||||||
Produces []string `json:"produces,omitempty"`
|
|
||||||
Schemes []string `json:"schemes,omitempty"` // the scheme, when present must be from [http, https, ws, wss]
|
|
||||||
Tags []string `json:"tags,omitempty"`
|
|
||||||
Summary string `json:"summary,omitempty"`
|
|
||||||
ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"`
|
|
||||||
ID string `json:"operationId,omitempty"`
|
|
||||||
Deprecated bool `json:"deprecated,omitempty"`
|
|
||||||
Security []map[string][]string `json:"security,omitempty"`
|
|
||||||
Parameters []Parameter `json:"parameters,omitempty"`
|
|
||||||
Responses *Responses `json:"responses,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Operation describes a single API operation on a path.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#operationObject
|
|
||||||
type Operation struct {
|
|
||||||
VendorExtensible
|
|
||||||
OperationProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// SuccessResponse gets a success response model
|
|
||||||
func (o *Operation) SuccessResponse() (*Response, int, bool) {
|
|
||||||
if o.Responses == nil {
|
|
||||||
return nil, 0, false
|
|
||||||
}
|
|
||||||
|
|
||||||
for k, v := range o.Responses.StatusCodeResponses {
|
|
||||||
if k/100 == 2 {
|
|
||||||
return &v, k, true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return o.Responses.Default, 0, false
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup look up a value by the json property name
|
|
||||||
func (o Operation) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if ex, ok := o.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
r, _, err := jsonpointer.GetForToken(o.OperationProps, token)
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON hydrates this items instance with the data from JSON
|
|
||||||
func (o *Operation) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &o.OperationProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &o.VendorExtensible); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON converts this items object to JSON
|
|
||||||
func (o Operation) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(o.OperationProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(o.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
concated := swag.ConcatJSON(b1, b2)
|
|
||||||
return concated, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewOperation creates a new operation instance.
|
|
||||||
// It expects an ID as parameter but not passing an ID is also valid.
|
|
||||||
func NewOperation(id string) *Operation {
|
|
||||||
op := new(Operation)
|
|
||||||
op.ID = id
|
|
||||||
return op
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithID sets the ID property on this operation, allows for chaining.
|
|
||||||
func (o *Operation) WithID(id string) *Operation {
|
|
||||||
o.ID = id
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDescription sets the description on this operation, allows for chaining
|
|
||||||
func (o *Operation) WithDescription(description string) *Operation {
|
|
||||||
o.Description = description
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithSummary sets the summary on this operation, allows for chaining
|
|
||||||
func (o *Operation) WithSummary(summary string) *Operation {
|
|
||||||
o.Summary = summary
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithExternalDocs sets/removes the external docs for/from this operation.
|
|
||||||
// When you pass empty strings as params the external documents will be removed.
|
|
||||||
// When you pass non-empty string as one value then those values will be used on the external docs object.
|
|
||||||
// So when you pass a non-empty description, you should also pass the url and vice versa.
|
|
||||||
func (o *Operation) WithExternalDocs(description, url string) *Operation {
|
|
||||||
if description == "" && url == "" {
|
|
||||||
o.ExternalDocs = nil
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
if o.ExternalDocs == nil {
|
|
||||||
o.ExternalDocs = &ExternalDocumentation{}
|
|
||||||
}
|
|
||||||
o.ExternalDocs.Description = description
|
|
||||||
o.ExternalDocs.URL = url
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecate marks the operation as deprecated
|
|
||||||
func (o *Operation) Deprecate() *Operation {
|
|
||||||
o.Deprecated = true
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// Undeprecate marks the operation as not deprected
|
|
||||||
func (o *Operation) Undeprecate() *Operation {
|
|
||||||
o.Deprecated = false
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithConsumes adds media types for incoming body values
|
|
||||||
func (o *Operation) WithConsumes(mediaTypes ...string) *Operation {
|
|
||||||
o.Consumes = append(o.Consumes, mediaTypes...)
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithProduces adds media types for outgoing body values
|
|
||||||
func (o *Operation) WithProduces(mediaTypes ...string) *Operation {
|
|
||||||
o.Produces = append(o.Produces, mediaTypes...)
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithTags adds tags for this operation
|
|
||||||
func (o *Operation) WithTags(tags ...string) *Operation {
|
|
||||||
o.Tags = append(o.Tags, tags...)
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddParam adds a parameter to this operation, when a parameter for that location
|
|
||||||
// and with that name already exists it will be replaced
|
|
||||||
func (o *Operation) AddParam(param *Parameter) *Operation {
|
|
||||||
if param == nil {
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
for i, p := range o.Parameters {
|
|
||||||
if p.Name == param.Name && p.In == param.In {
|
|
||||||
params := append(o.Parameters[:i], *param)
|
|
||||||
params = append(params, o.Parameters[i+1:]...)
|
|
||||||
o.Parameters = params
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
o.Parameters = append(o.Parameters, *param)
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveParam removes a parameter from the operation
|
|
||||||
func (o *Operation) RemoveParam(name, in string) *Operation {
|
|
||||||
for i, p := range o.Parameters {
|
|
||||||
if p.Name == name && p.In == name {
|
|
||||||
o.Parameters = append(o.Parameters[:i], o.Parameters[i+1:]...)
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecuredWith adds a security scope to this operation.
|
|
||||||
func (o *Operation) SecuredWith(name string, scopes ...string) *Operation {
|
|
||||||
o.Security = append(o.Security, map[string][]string{name: scopes})
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDefaultResponse adds a default response to the operation.
|
|
||||||
// Passing a nil value will remove the response
|
|
||||||
func (o *Operation) WithDefaultResponse(response *Response) *Operation {
|
|
||||||
return o.RespondsWith(0, response)
|
|
||||||
}
|
|
||||||
|
|
||||||
// RespondsWith adds a status code response to the operation.
|
|
||||||
// When the code is 0 the value of the response will be used as default response value.
|
|
||||||
// When the value of the response is nil it will be removed from the operation
|
|
||||||
func (o *Operation) RespondsWith(code int, response *Response) *Operation {
|
|
||||||
if o.Responses == nil {
|
|
||||||
o.Responses = new(Responses)
|
|
||||||
}
|
|
||||||
if code == 0 {
|
|
||||||
o.Responses.Default = response
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
if response == nil {
|
|
||||||
delete(o.Responses.StatusCodeResponses, code)
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
if o.Responses.StatusCodeResponses == nil {
|
|
||||||
o.Responses.StatusCodeResponses = make(map[int]Response)
|
|
||||||
}
|
|
||||||
o.Responses.StatusCodeResponses[code] = *response
|
|
||||||
return o
|
|
||||||
}
|
|
299
vendor/github.com/go-openapi/spec/parameter.go
generated
vendored
299
vendor/github.com/go-openapi/spec/parameter.go
generated
vendored
@ -1,299 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// QueryParam creates a query parameter
|
|
||||||
func QueryParam(name string) *Parameter {
|
|
||||||
return &Parameter{ParamProps: ParamProps{Name: name, In: "query"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// HeaderParam creates a header parameter, this is always required by default
|
|
||||||
func HeaderParam(name string) *Parameter {
|
|
||||||
return &Parameter{ParamProps: ParamProps{Name: name, In: "header", Required: true}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathParam creates a path parameter, this is always required
|
|
||||||
func PathParam(name string) *Parameter {
|
|
||||||
return &Parameter{ParamProps: ParamProps{Name: name, In: "path", Required: true}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// BodyParam creates a body parameter
|
|
||||||
func BodyParam(name string, schema *Schema) *Parameter {
|
|
||||||
return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}, SimpleSchema: SimpleSchema{Type: "object"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FormDataParam creates a body parameter
|
|
||||||
func FormDataParam(name string) *Parameter {
|
|
||||||
return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// FileParam creates a body parameter
|
|
||||||
func FileParam(name string) *Parameter {
|
|
||||||
return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}, SimpleSchema: SimpleSchema{Type: "file"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// SimpleArrayParam creates a param for a simple array (string, int, date etc)
|
|
||||||
func SimpleArrayParam(name, tpe, fmt string) *Parameter {
|
|
||||||
return &Parameter{ParamProps: ParamProps{Name: name}, SimpleSchema: SimpleSchema{Type: "array", CollectionFormat: "csv", Items: &Items{SimpleSchema: SimpleSchema{Type: "string", Format: fmt}}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ParamRef creates a parameter that's a json reference
|
|
||||||
func ParamRef(uri string) *Parameter {
|
|
||||||
p := new(Parameter)
|
|
||||||
p.Ref = MustCreateRef(uri)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
type ParamProps struct {
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
Name string `json:"name,omitempty"`
|
|
||||||
In string `json:"in,omitempty"`
|
|
||||||
Required bool `json:"required,omitempty"`
|
|
||||||
Schema *Schema `json:"schema,omitempty"` // when in == "body"
|
|
||||||
AllowEmptyValue bool `json:"allowEmptyValue,omitempty"` // when in == "query" || "formData"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Parameter a unique parameter is defined by a combination of a [name](#parameterName) and [location](#parameterIn).
|
|
||||||
//
|
|
||||||
// There are five possible parameter types.
|
|
||||||
// * Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`, the path parameter is `itemId`.
|
|
||||||
// * Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`.
|
|
||||||
// * Header - Custom headers that are expected as part of the request.
|
|
||||||
// * Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be *one* body parameter. The name of the body parameter has no effect on the parameter itself and is used for documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist together for the same operation.
|
|
||||||
// * Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or `multipart/form-data` are used as the content type of the request (in Swagger's definition, the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be declared together with a body parameter for the same operation. Form parameters have a different format based on the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4):
|
|
||||||
// * `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload. For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple parameters that are being transferred.
|
|
||||||
// * `multipart/form-data` - each parameter takes a section in the payload with an internal header. For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is `submit-name`. This type of form parameters is more commonly used for file transfers.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#parameterObject
|
|
||||||
type Parameter struct {
|
|
||||||
Refable
|
|
||||||
CommonValidations
|
|
||||||
SimpleSchema
|
|
||||||
VendorExtensible
|
|
||||||
ParamProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup look up a value by the json property name
|
|
||||||
func (p Parameter) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if ex, ok := p.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
if token == "$ref" {
|
|
||||||
return &p.Ref, nil
|
|
||||||
}
|
|
||||||
r, _, err := jsonpointer.GetForToken(p.CommonValidations, token)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if r != nil {
|
|
||||||
return r, nil
|
|
||||||
}
|
|
||||||
r, _, err = jsonpointer.GetForToken(p.SimpleSchema, token)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if r != nil {
|
|
||||||
return r, nil
|
|
||||||
}
|
|
||||||
r, _, err = jsonpointer.GetForToken(p.ParamProps, token)
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDescription a fluent builder method for the description of the parameter
|
|
||||||
func (p *Parameter) WithDescription(description string) *Parameter {
|
|
||||||
p.Description = description
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Named a fluent builder method to override the name of the parameter
|
|
||||||
func (p *Parameter) Named(name string) *Parameter {
|
|
||||||
p.Name = name
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithLocation a fluent builder method to override the location of the parameter
|
|
||||||
func (p *Parameter) WithLocation(in string) *Parameter {
|
|
||||||
p.In = in
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Typed a fluent builder method for the type of the parameter value
|
|
||||||
func (p *Parameter) Typed(tpe, format string) *Parameter {
|
|
||||||
p.Type = tpe
|
|
||||||
p.Format = format
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// CollectionOf a fluent builder method for an array parameter
|
|
||||||
func (p *Parameter) CollectionOf(items *Items, format string) *Parameter {
|
|
||||||
p.Type = "array"
|
|
||||||
p.Items = items
|
|
||||||
p.CollectionFormat = format
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDefault sets the default value on this parameter
|
|
||||||
func (p *Parameter) WithDefault(defaultValue interface{}) *Parameter {
|
|
||||||
p.AsOptional() // with default implies optional
|
|
||||||
p.Default = defaultValue
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// AllowsEmptyValues flags this parameter as being ok with empty values
|
|
||||||
func (p *Parameter) AllowsEmptyValues() *Parameter {
|
|
||||||
p.AllowEmptyValue = true
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoEmptyValues flags this parameter as not liking empty values
|
|
||||||
func (p *Parameter) NoEmptyValues() *Parameter {
|
|
||||||
p.AllowEmptyValue = false
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsOptional flags this parameter as optional
|
|
||||||
func (p *Parameter) AsOptional() *Parameter {
|
|
||||||
p.Required = false
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsRequired flags this parameter as required
|
|
||||||
func (p *Parameter) AsRequired() *Parameter {
|
|
||||||
if p.Default != nil { // with a default required makes no sense
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
p.Required = true
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxLength sets a max length value
|
|
||||||
func (p *Parameter) WithMaxLength(max int64) *Parameter {
|
|
||||||
p.MaxLength = &max
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinLength sets a min length value
|
|
||||||
func (p *Parameter) WithMinLength(min int64) *Parameter {
|
|
||||||
p.MinLength = &min
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithPattern sets a pattern value
|
|
||||||
func (p *Parameter) WithPattern(pattern string) *Parameter {
|
|
||||||
p.Pattern = pattern
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMultipleOf sets a multiple of value
|
|
||||||
func (p *Parameter) WithMultipleOf(number float64) *Parameter {
|
|
||||||
p.MultipleOf = &number
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaximum sets a maximum number value
|
|
||||||
func (p *Parameter) WithMaximum(max float64, exclusive bool) *Parameter {
|
|
||||||
p.Maximum = &max
|
|
||||||
p.ExclusiveMaximum = exclusive
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinimum sets a minimum number value
|
|
||||||
func (p *Parameter) WithMinimum(min float64, exclusive bool) *Parameter {
|
|
||||||
p.Minimum = &min
|
|
||||||
p.ExclusiveMinimum = exclusive
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithEnum sets a the enum values (replace)
|
|
||||||
func (p *Parameter) WithEnum(values ...interface{}) *Parameter {
|
|
||||||
p.Enum = append([]interface{}{}, values...)
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxItems sets the max items
|
|
||||||
func (p *Parameter) WithMaxItems(size int64) *Parameter {
|
|
||||||
p.MaxItems = &size
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinItems sets the min items
|
|
||||||
func (p *Parameter) WithMinItems(size int64) *Parameter {
|
|
||||||
p.MinItems = &size
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// UniqueValues dictates that this array can only have unique items
|
|
||||||
func (p *Parameter) UniqueValues() *Parameter {
|
|
||||||
p.UniqueItems = true
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// AllowDuplicates this array can have duplicates
|
|
||||||
func (p *Parameter) AllowDuplicates() *Parameter {
|
|
||||||
p.UniqueItems = false
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON hydrates this items instance with the data from JSON
|
|
||||||
func (p *Parameter) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &p.CommonValidations); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &p.Refable); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &p.SimpleSchema); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &p.VendorExtensible); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &p.ParamProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON converts this items object to JSON
|
|
||||||
func (p Parameter) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(p.CommonValidations)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(p.SimpleSchema)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b3, err := json.Marshal(p.Refable)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b4, err := json.Marshal(p.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b5, err := json.Marshal(p.ParamProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return swag.ConcatJSON(b3, b1, b2, b4, b5), nil
|
|
||||||
}
|
|
90
vendor/github.com/go-openapi/spec/path_item.go
generated
vendored
90
vendor/github.com/go-openapi/spec/path_item.go
generated
vendored
@ -1,90 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// pathItemProps the path item specific properties
|
|
||||||
type PathItemProps struct {
|
|
||||||
Get *Operation `json:"get,omitempty"`
|
|
||||||
Put *Operation `json:"put,omitempty"`
|
|
||||||
Post *Operation `json:"post,omitempty"`
|
|
||||||
Delete *Operation `json:"delete,omitempty"`
|
|
||||||
Options *Operation `json:"options,omitempty"`
|
|
||||||
Head *Operation `json:"head,omitempty"`
|
|
||||||
Patch *Operation `json:"patch,omitempty"`
|
|
||||||
Parameters []Parameter `json:"parameters,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathItem describes the operations available on a single path.
|
|
||||||
// A Path Item may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering).
|
|
||||||
// The path itself is still exposed to the documentation viewer but they will
|
|
||||||
// not know which operations and parameters are available.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#pathItemObject
|
|
||||||
type PathItem struct {
|
|
||||||
Refable
|
|
||||||
VendorExtensible
|
|
||||||
PathItemProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup look up a value by the json property name
|
|
||||||
func (p PathItem) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if ex, ok := p.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
if token == "$ref" {
|
|
||||||
return &p.Ref, nil
|
|
||||||
}
|
|
||||||
r, _, err := jsonpointer.GetForToken(p.PathItemProps, token)
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON hydrates this items instance with the data from JSON
|
|
||||||
func (p *PathItem) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &p.Refable); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &p.VendorExtensible); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &p.PathItemProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON converts this items object to JSON
|
|
||||||
func (p PathItem) MarshalJSON() ([]byte, error) {
|
|
||||||
b3, err := json.Marshal(p.Refable)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b4, err := json.Marshal(p.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b5, err := json.Marshal(p.PathItemProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
concated := swag.ConcatJSON(b3, b4, b5)
|
|
||||||
return concated, nil
|
|
||||||
}
|
|
97
vendor/github.com/go-openapi/spec/paths.go
generated
vendored
97
vendor/github.com/go-openapi/spec/paths.go
generated
vendored
@ -1,97 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Paths holds the relative paths to the individual endpoints.
|
|
||||||
// The path is appended to the [`basePath`](http://goo.gl/8us55a#swaggerBasePath) in order
|
|
||||||
// to construct the full URL.
|
|
||||||
// The Paths may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering).
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#pathsObject
|
|
||||||
type Paths struct {
|
|
||||||
VendorExtensible
|
|
||||||
Paths map[string]PathItem `json:"-"` // custom serializer to flatten this, each entry must start with "/"
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup look up a value by the json property name
|
|
||||||
func (p Paths) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if pi, ok := p.Paths[token]; ok {
|
|
||||||
return &pi, nil
|
|
||||||
}
|
|
||||||
if ex, ok := p.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("object has no field %q", token)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON hydrates this items instance with the data from JSON
|
|
||||||
func (p *Paths) UnmarshalJSON(data []byte) error {
|
|
||||||
var res map[string]json.RawMessage
|
|
||||||
if err := json.Unmarshal(data, &res); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
for k, v := range res {
|
|
||||||
if strings.HasPrefix(strings.ToLower(k), "x-") {
|
|
||||||
if p.Extensions == nil {
|
|
||||||
p.Extensions = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
var d interface{}
|
|
||||||
if err := json.Unmarshal(v, &d); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.Extensions[k] = d
|
|
||||||
}
|
|
||||||
if strings.HasPrefix(k, "/") {
|
|
||||||
if p.Paths == nil {
|
|
||||||
p.Paths = make(map[string]PathItem)
|
|
||||||
}
|
|
||||||
var pi PathItem
|
|
||||||
if err := json.Unmarshal(v, &pi); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
p.Paths[k] = pi
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON converts this items object to JSON
|
|
||||||
func (p Paths) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(p.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
pths := make(map[string]PathItem)
|
|
||||||
for k, v := range p.Paths {
|
|
||||||
if strings.HasPrefix(k, "/") {
|
|
||||||
pths[k] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(pths)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
concated := swag.ConcatJSON(b1, b2)
|
|
||||||
return concated, nil
|
|
||||||
}
|
|
167
vendor/github.com/go-openapi/spec/ref.go
generated
vendored
167
vendor/github.com/go-openapi/spec/ref.go
generated
vendored
@ -1,167 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonreference"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Refable is a struct for things that accept a $ref property
|
|
||||||
type Refable struct {
|
|
||||||
Ref Ref
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON marshals the ref to json
|
|
||||||
func (r Refable) MarshalJSON() ([]byte, error) {
|
|
||||||
return r.Ref.MarshalJSON()
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON unmarshalss the ref from json
|
|
||||||
func (r *Refable) UnmarshalJSON(d []byte) error {
|
|
||||||
return json.Unmarshal(d, &r.Ref)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ref represents a json reference that is potentially resolved
|
|
||||||
type Ref struct {
|
|
||||||
jsonreference.Ref
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoteURI gets the remote uri part of the ref
|
|
||||||
func (r *Ref) RemoteURI() string {
|
|
||||||
if r.String() == "" {
|
|
||||||
return r.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
u := *r.GetURL()
|
|
||||||
u.Fragment = ""
|
|
||||||
return u.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsValidURI returns true when the url the ref points to can be found
|
|
||||||
func (r *Ref) IsValidURI() bool {
|
|
||||||
if r.String() == "" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
v := r.RemoteURI()
|
|
||||||
if v == "" {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if r.HasFullURL {
|
|
||||||
rr, err := http.Get(v)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return rr.StatusCode/100 == 2
|
|
||||||
}
|
|
||||||
|
|
||||||
if !(r.HasFileScheme || r.HasFullFilePath || r.HasURLPathOnly) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for local file
|
|
||||||
pth := v
|
|
||||||
if r.HasURLPathOnly {
|
|
||||||
p, e := filepath.Abs(pth)
|
|
||||||
if e != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
pth = p
|
|
||||||
}
|
|
||||||
|
|
||||||
fi, err := os.Stat(pth)
|
|
||||||
if err != nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return !fi.IsDir()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inherits creates a new reference from a parent and a child
|
|
||||||
// If the child cannot inherit from the parent, an error is returned
|
|
||||||
func (r *Ref) Inherits(child Ref) (*Ref, error) {
|
|
||||||
ref, err := r.Ref.Inherits(child.Ref)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &Ref{Ref: *ref}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewRef creates a new instance of a ref object
|
|
||||||
// returns an error when the reference uri is an invalid uri
|
|
||||||
func NewRef(refURI string) (Ref, error) {
|
|
||||||
ref, err := jsonreference.New(refURI)
|
|
||||||
if err != nil {
|
|
||||||
return Ref{}, err
|
|
||||||
}
|
|
||||||
return Ref{Ref: ref}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MustCreateRef creates a ref object but
|
|
||||||
func MustCreateRef(refURI string) Ref {
|
|
||||||
return Ref{Ref: jsonreference.MustCreateRef(refURI)}
|
|
||||||
}
|
|
||||||
|
|
||||||
// // NewResolvedRef creates a resolved ref
|
|
||||||
// func NewResolvedRef(refURI string, data interface{}) Ref {
|
|
||||||
// return Ref{
|
|
||||||
// Ref: jsonreference.MustCreateRef(refURI),
|
|
||||||
// Resolved: data,
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// MarshalJSON marshals this ref into a JSON object
|
|
||||||
func (r Ref) MarshalJSON() ([]byte, error) {
|
|
||||||
str := r.String()
|
|
||||||
if str == "" {
|
|
||||||
if r.IsRoot() {
|
|
||||||
return []byte(`{"$ref":"#"}`), nil
|
|
||||||
}
|
|
||||||
return []byte("{}"), nil
|
|
||||||
}
|
|
||||||
v := map[string]interface{}{"$ref": str}
|
|
||||||
return json.Marshal(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON unmarshals this ref from a JSON object
|
|
||||||
func (r *Ref) UnmarshalJSON(d []byte) error {
|
|
||||||
var v map[string]interface{}
|
|
||||||
if err := json.Unmarshal(d, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if v == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if vv, ok := v["$ref"]; ok {
|
|
||||||
if str, ok := vv.(string); ok {
|
|
||||||
ref, err := jsonreference.New(str)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
*r = Ref{Ref: ref}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
113
vendor/github.com/go-openapi/spec/response.go
generated
vendored
113
vendor/github.com/go-openapi/spec/response.go
generated
vendored
@ -1,113 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ResponseProps properties specific to a response
|
|
||||||
type ResponseProps struct {
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
Schema *Schema `json:"schema,omitempty"`
|
|
||||||
Headers map[string]Header `json:"headers,omitempty"`
|
|
||||||
Examples map[string]interface{} `json:"examples,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Response describes a single response from an API Operation.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#responseObject
|
|
||||||
type Response struct {
|
|
||||||
Refable
|
|
||||||
ResponseProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON hydrates this items instance with the data from JSON
|
|
||||||
func (r *Response) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &r.ResponseProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &r.Refable); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON converts this items object to JSON
|
|
||||||
func (r Response) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(r.ResponseProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(r.Refable)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return swag.ConcatJSON(b1, b2), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewResponse creates a new response instance
|
|
||||||
func NewResponse() *Response {
|
|
||||||
return new(Response)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ResponseRef creates a response as a json reference
|
|
||||||
func ResponseRef(url string) *Response {
|
|
||||||
resp := NewResponse()
|
|
||||||
resp.Ref = MustCreateRef(url)
|
|
||||||
return resp
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDescription sets the description on this response, allows for chaining
|
|
||||||
func (r *Response) WithDescription(description string) *Response {
|
|
||||||
r.Description = description
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithSchema sets the schema on this response, allows for chaining.
|
|
||||||
// Passing a nil argument removes the schema from this response
|
|
||||||
func (r *Response) WithSchema(schema *Schema) *Response {
|
|
||||||
r.Schema = schema
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddHeader adds a header to this response
|
|
||||||
func (r *Response) AddHeader(name string, header *Header) *Response {
|
|
||||||
if header == nil {
|
|
||||||
return r.RemoveHeader(name)
|
|
||||||
}
|
|
||||||
if r.Headers == nil {
|
|
||||||
r.Headers = make(map[string]Header)
|
|
||||||
}
|
|
||||||
r.Headers[name] = *header
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// RemoveHeader removes a header from this response
|
|
||||||
func (r *Response) RemoveHeader(name string) *Response {
|
|
||||||
delete(r.Headers, name)
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddExample adds an example to this response
|
|
||||||
func (r *Response) AddExample(mediaType string, example interface{}) *Response {
|
|
||||||
if r.Examples == nil {
|
|
||||||
r.Examples = make(map[string]interface{})
|
|
||||||
}
|
|
||||||
r.Examples[mediaType] = example
|
|
||||||
return r
|
|
||||||
}
|
|
122
vendor/github.com/go-openapi/spec/responses.go
generated
vendored
122
vendor/github.com/go-openapi/spec/responses.go
generated
vendored
@ -1,122 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Responses is a container for the expected responses of an operation.
|
|
||||||
// The container maps a HTTP response code to the expected response.
|
|
||||||
// It is not expected from the documentation to necessarily cover all possible HTTP response codes,
|
|
||||||
// since they may not be known in advance. However, it is expected from the documentation to cover
|
|
||||||
// a successful operation response and any known errors.
|
|
||||||
//
|
|
||||||
// The `default` can be used a default response object for all HTTP codes that are not covered
|
|
||||||
// individually by the specification.
|
|
||||||
//
|
|
||||||
// The `Responses Object` MUST contain at least one response code, and it SHOULD be the response
|
|
||||||
// for a successful operation call.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#responsesObject
|
|
||||||
type Responses struct {
|
|
||||||
VendorExtensible
|
|
||||||
ResponsesProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup implements an interface to customize json pointer lookup
|
|
||||||
func (r Responses) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if token == "default" {
|
|
||||||
return r.Default, nil
|
|
||||||
}
|
|
||||||
if ex, ok := r.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
if i, err := strconv.Atoi(token); err == nil {
|
|
||||||
if scr, ok := r.StatusCodeResponses[i]; ok {
|
|
||||||
return &scr, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("object has no field %q", token)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON hydrates this items instance with the data from JSON
|
|
||||||
func (r *Responses) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &r.ResponsesProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &r.VendorExtensible); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if reflect.DeepEqual(ResponsesProps{}, r.ResponsesProps) {
|
|
||||||
r.ResponsesProps = ResponsesProps{}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON converts this items object to JSON
|
|
||||||
func (r Responses) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(r.ResponsesProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(r.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
concated := swag.ConcatJSON(b1, b2)
|
|
||||||
return concated, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type ResponsesProps struct {
|
|
||||||
Default *Response
|
|
||||||
StatusCodeResponses map[int]Response
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r ResponsesProps) MarshalJSON() ([]byte, error) {
|
|
||||||
toser := map[string]Response{}
|
|
||||||
if r.Default != nil {
|
|
||||||
toser["default"] = *r.Default
|
|
||||||
}
|
|
||||||
for k, v := range r.StatusCodeResponses {
|
|
||||||
toser[strconv.Itoa(k)] = v
|
|
||||||
}
|
|
||||||
return json.Marshal(toser)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *ResponsesProps) UnmarshalJSON(data []byte) error {
|
|
||||||
var res map[string]Response
|
|
||||||
if err := json.Unmarshal(data, &res); err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if v, ok := res["default"]; ok {
|
|
||||||
r.Default = &v
|
|
||||||
delete(res, "default")
|
|
||||||
}
|
|
||||||
for k, v := range res {
|
|
||||||
if nk, err := strconv.Atoi(k); err == nil {
|
|
||||||
if r.StatusCodeResponses == nil {
|
|
||||||
r.StatusCodeResponses = map[int]Response{}
|
|
||||||
}
|
|
||||||
r.StatusCodeResponses[nk] = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
628
vendor/github.com/go-openapi/spec/schema.go
generated
vendored
628
vendor/github.com/go-openapi/spec/schema.go
generated
vendored
@ -1,628 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
// BooleanProperty creates a boolean property
|
|
||||||
func BooleanProperty() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"boolean"}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// BoolProperty creates a boolean property
|
|
||||||
func BoolProperty() *Schema { return BooleanProperty() }
|
|
||||||
|
|
||||||
// StringProperty creates a string property
|
|
||||||
func StringProperty() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// CharProperty creates a string property
|
|
||||||
func CharProperty() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float64Property creates a float64/double property
|
|
||||||
func Float64Property() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "double"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Float32Property creates a float32/float property
|
|
||||||
func Float32Property() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "float"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int8Property creates an int8 property
|
|
||||||
func Int8Property() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int8"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int16Property creates an int16 property
|
|
||||||
func Int16Property() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int16"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int32Property creates an int32 property
|
|
||||||
func Int32Property() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int32"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Int64Property creates an int64 property
|
|
||||||
func Int64Property() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int64"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StrFmtProperty creates a property for the named string format
|
|
||||||
func StrFmtProperty(format string) *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: format}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DateProperty creates a date property
|
|
||||||
func DateProperty() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// DateTimeProperty creates a date time property
|
|
||||||
func DateTimeProperty() *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date-time"}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MapProperty creates a map property
|
|
||||||
func MapProperty(property *Schema) *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"object"}, AdditionalProperties: &SchemaOrBool{Allows: true, Schema: property}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RefProperty creates a ref property
|
|
||||||
func RefProperty(name string) *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// RefSchema creates a ref property
|
|
||||||
func RefSchema(name string) *Schema {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ArrayProperty creates an array property
|
|
||||||
func ArrayProperty(items *Schema) *Schema {
|
|
||||||
if items == nil {
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Type: []string{"array"}}}
|
|
||||||
}
|
|
||||||
return &Schema{SchemaProps: SchemaProps{Items: &SchemaOrArray{Schema: items}, Type: []string{"array"}}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ComposedSchema creates a schema with allOf
|
|
||||||
func ComposedSchema(schemas ...Schema) *Schema {
|
|
||||||
s := new(Schema)
|
|
||||||
s.AllOf = schemas
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// SchemaURL represents a schema url
|
|
||||||
type SchemaURL string
|
|
||||||
|
|
||||||
// MarshalJSON marshal this to JSON
|
|
||||||
func (r SchemaURL) MarshalJSON() ([]byte, error) {
|
|
||||||
if r == "" {
|
|
||||||
return []byte("{}"), nil
|
|
||||||
}
|
|
||||||
v := map[string]interface{}{"$schema": string(r)}
|
|
||||||
return json.Marshal(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON unmarshal this from JSON
|
|
||||||
func (r *SchemaURL) UnmarshalJSON(data []byte) error {
|
|
||||||
var v map[string]interface{}
|
|
||||||
if err := json.Unmarshal(data, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if v == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if vv, ok := v["$schema"]; ok {
|
|
||||||
if str, ok := vv.(string); ok {
|
|
||||||
u, err := url.Parse(str)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
*r = SchemaURL(u.String())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// type ExtraSchemaProps map[string]interface{}
|
|
||||||
|
|
||||||
// // JSONSchema represents a structure that is a json schema draft 04
|
|
||||||
// type JSONSchema struct {
|
|
||||||
// SchemaProps
|
|
||||||
// ExtraSchemaProps
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // MarshalJSON marshal this to JSON
|
|
||||||
// func (s JSONSchema) MarshalJSON() ([]byte, error) {
|
|
||||||
// b1, err := json.Marshal(s.SchemaProps)
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// b2, err := s.Ref.MarshalJSON()
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// b3, err := s.Schema.MarshalJSON()
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// b4, err := json.Marshal(s.ExtraSchemaProps)
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// return swag.ConcatJSON(b1, b2, b3, b4), nil
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // UnmarshalJSON marshal this from JSON
|
|
||||||
// func (s *JSONSchema) UnmarshalJSON(data []byte) error {
|
|
||||||
// var sch JSONSchema
|
|
||||||
// if err := json.Unmarshal(data, &sch.SchemaProps); err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
// if err := json.Unmarshal(data, &sch.Ref); err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
// if err := json.Unmarshal(data, &sch.Schema); err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
// if err := json.Unmarshal(data, &sch.ExtraSchemaProps); err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
// *s = sch
|
|
||||||
// return nil
|
|
||||||
// }
|
|
||||||
|
|
||||||
type SchemaProps struct {
|
|
||||||
ID string `json:"id,omitempty"`
|
|
||||||
Ref Ref `json:"-,omitempty"`
|
|
||||||
Schema SchemaURL `json:"-,omitempty"`
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
Type StringOrArray `json:"type,omitempty"`
|
|
||||||
Format string `json:"format,omitempty"`
|
|
||||||
Title string `json:"title,omitempty"`
|
|
||||||
Default interface{} `json:"default,omitempty"`
|
|
||||||
Maximum *float64 `json:"maximum,omitempty"`
|
|
||||||
ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"`
|
|
||||||
Minimum *float64 `json:"minimum,omitempty"`
|
|
||||||
ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"`
|
|
||||||
MaxLength *int64 `json:"maxLength,omitempty"`
|
|
||||||
MinLength *int64 `json:"minLength,omitempty"`
|
|
||||||
Pattern string `json:"pattern,omitempty"`
|
|
||||||
MaxItems *int64 `json:"maxItems,omitempty"`
|
|
||||||
MinItems *int64 `json:"minItems,omitempty"`
|
|
||||||
UniqueItems bool `json:"uniqueItems,omitempty"`
|
|
||||||
MultipleOf *float64 `json:"multipleOf,omitempty"`
|
|
||||||
Enum []interface{} `json:"enum,omitempty"`
|
|
||||||
MaxProperties *int64 `json:"maxProperties,omitempty"`
|
|
||||||
MinProperties *int64 `json:"minProperties,omitempty"`
|
|
||||||
Required []string `json:"required,omitempty"`
|
|
||||||
Items *SchemaOrArray `json:"items,omitempty"`
|
|
||||||
AllOf []Schema `json:"allOf,omitempty"`
|
|
||||||
OneOf []Schema `json:"oneOf,omitempty"`
|
|
||||||
AnyOf []Schema `json:"anyOf,omitempty"`
|
|
||||||
Not *Schema `json:"not,omitempty"`
|
|
||||||
Properties map[string]Schema `json:"properties,omitempty"`
|
|
||||||
AdditionalProperties *SchemaOrBool `json:"additionalProperties,omitempty"`
|
|
||||||
PatternProperties map[string]Schema `json:"patternProperties,omitempty"`
|
|
||||||
Dependencies Dependencies `json:"dependencies,omitempty"`
|
|
||||||
AdditionalItems *SchemaOrBool `json:"additionalItems,omitempty"`
|
|
||||||
Definitions Definitions `json:"definitions,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type SwaggerSchemaProps struct {
|
|
||||||
Discriminator string `json:"discriminator,omitempty"`
|
|
||||||
ReadOnly bool `json:"readOnly,omitempty"`
|
|
||||||
XML *XMLObject `json:"xml,omitempty"`
|
|
||||||
ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"`
|
|
||||||
Example interface{} `json:"example,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// Schema the schema object allows the definition of input and output data types.
|
|
||||||
// These types can be objects, but also primitives and arrays.
|
|
||||||
// This object is based on the [JSON Schema Specification Draft 4](http://json-schema.org/)
|
|
||||||
// and uses a predefined subset of it.
|
|
||||||
// On top of this subset, there are extensions provided by this specification to allow for more complete documentation.
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#schemaObject
|
|
||||||
type Schema struct {
|
|
||||||
VendorExtensible
|
|
||||||
SchemaProps
|
|
||||||
SwaggerSchemaProps
|
|
||||||
ExtraProps map[string]interface{} `json:"-"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup implements an interface to customize json pointer lookup
|
|
||||||
func (s Schema) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if ex, ok := s.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if ex, ok := s.ExtraProps[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
r, _, err := jsonpointer.GetForToken(s.SchemaProps, token)
|
|
||||||
if r != nil || err != nil {
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
r, _, err = jsonpointer.GetForToken(s.SwaggerSchemaProps, token)
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithID sets the id for this schema, allows for chaining
|
|
||||||
func (s *Schema) WithID(id string) *Schema {
|
|
||||||
s.ID = id
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithTitle sets the title for this schema, allows for chaining
|
|
||||||
func (s *Schema) WithTitle(title string) *Schema {
|
|
||||||
s.Title = title
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDescription sets the description for this schema, allows for chaining
|
|
||||||
func (s *Schema) WithDescription(description string) *Schema {
|
|
||||||
s.Description = description
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithProperties sets the properties for this schema
|
|
||||||
func (s *Schema) WithProperties(schemas map[string]Schema) *Schema {
|
|
||||||
s.Properties = schemas
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetProperty sets a property on this schema
|
|
||||||
func (s *Schema) SetProperty(name string, schema Schema) *Schema {
|
|
||||||
if s.Properties == nil {
|
|
||||||
s.Properties = make(map[string]Schema)
|
|
||||||
}
|
|
||||||
s.Properties[name] = schema
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithAllOf sets the all of property
|
|
||||||
func (s *Schema) WithAllOf(schemas ...Schema) *Schema {
|
|
||||||
s.AllOf = schemas
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxProperties sets the max number of properties an object can have
|
|
||||||
func (s *Schema) WithMaxProperties(max int64) *Schema {
|
|
||||||
s.MaxProperties = &max
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinProperties sets the min number of properties an object must have
|
|
||||||
func (s *Schema) WithMinProperties(min int64) *Schema {
|
|
||||||
s.MinProperties = &min
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// Typed sets the type of this schema for a single value item
|
|
||||||
func (s *Schema) Typed(tpe, format string) *Schema {
|
|
||||||
s.Type = []string{tpe}
|
|
||||||
s.Format = format
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddType adds a type with potential format to the types for this schema
|
|
||||||
func (s *Schema) AddType(tpe, format string) *Schema {
|
|
||||||
s.Type = append(s.Type, tpe)
|
|
||||||
if format != "" {
|
|
||||||
s.Format = format
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// CollectionOf a fluent builder method for an array parameter
|
|
||||||
func (s *Schema) CollectionOf(items Schema) *Schema {
|
|
||||||
s.Type = []string{"array"}
|
|
||||||
s.Items = &SchemaOrArray{Schema: &items}
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDefault sets the default value on this parameter
|
|
||||||
func (s *Schema) WithDefault(defaultValue interface{}) *Schema {
|
|
||||||
s.Default = defaultValue
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithRequired flags this parameter as required
|
|
||||||
func (s *Schema) WithRequired(items ...string) *Schema {
|
|
||||||
s.Required = items
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddRequired adds field names to the required properties array
|
|
||||||
func (s *Schema) AddRequired(items ...string) *Schema {
|
|
||||||
s.Required = append(s.Required, items...)
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxLength sets a max length value
|
|
||||||
func (s *Schema) WithMaxLength(max int64) *Schema {
|
|
||||||
s.MaxLength = &max
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinLength sets a min length value
|
|
||||||
func (s *Schema) WithMinLength(min int64) *Schema {
|
|
||||||
s.MinLength = &min
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithPattern sets a pattern value
|
|
||||||
func (s *Schema) WithPattern(pattern string) *Schema {
|
|
||||||
s.Pattern = pattern
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMultipleOf sets a multiple of value
|
|
||||||
func (s *Schema) WithMultipleOf(number float64) *Schema {
|
|
||||||
s.MultipleOf = &number
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaximum sets a maximum number value
|
|
||||||
func (s *Schema) WithMaximum(max float64, exclusive bool) *Schema {
|
|
||||||
s.Maximum = &max
|
|
||||||
s.ExclusiveMaximum = exclusive
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinimum sets a minimum number value
|
|
||||||
func (s *Schema) WithMinimum(min float64, exclusive bool) *Schema {
|
|
||||||
s.Minimum = &min
|
|
||||||
s.ExclusiveMinimum = exclusive
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithEnum sets a the enum values (replace)
|
|
||||||
func (s *Schema) WithEnum(values ...interface{}) *Schema {
|
|
||||||
s.Enum = append([]interface{}{}, values...)
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMaxItems sets the max items
|
|
||||||
func (s *Schema) WithMaxItems(size int64) *Schema {
|
|
||||||
s.MaxItems = &size
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithMinItems sets the min items
|
|
||||||
func (s *Schema) WithMinItems(size int64) *Schema {
|
|
||||||
s.MinItems = &size
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// UniqueValues dictates that this array can only have unique items
|
|
||||||
func (s *Schema) UniqueValues() *Schema {
|
|
||||||
s.UniqueItems = true
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AllowDuplicates this array can have duplicates
|
|
||||||
func (s *Schema) AllowDuplicates() *Schema {
|
|
||||||
s.UniqueItems = false
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddToAllOf adds a schema to the allOf property
|
|
||||||
func (s *Schema) AddToAllOf(schemas ...Schema) *Schema {
|
|
||||||
s.AllOf = append(s.AllOf, schemas...)
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDiscriminator sets the name of the discriminator field
|
|
||||||
func (s *Schema) WithDiscriminator(discriminator string) *Schema {
|
|
||||||
s.Discriminator = discriminator
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsReadOnly flags this schema as readonly
|
|
||||||
func (s *Schema) AsReadOnly() *Schema {
|
|
||||||
s.ReadOnly = true
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsWritable flags this schema as writeable (not read-only)
|
|
||||||
func (s *Schema) AsWritable() *Schema {
|
|
||||||
s.ReadOnly = false
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithExample sets the example for this schema
|
|
||||||
func (s *Schema) WithExample(example interface{}) *Schema {
|
|
||||||
s.Example = example
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithExternalDocs sets/removes the external docs for/from this schema.
|
|
||||||
// When you pass empty strings as params the external documents will be removed.
|
|
||||||
// When you pass non-empty string as one value then those values will be used on the external docs object.
|
|
||||||
// So when you pass a non-empty description, you should also pass the url and vice versa.
|
|
||||||
func (s *Schema) WithExternalDocs(description, url string) *Schema {
|
|
||||||
if description == "" && url == "" {
|
|
||||||
s.ExternalDocs = nil
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.ExternalDocs == nil {
|
|
||||||
s.ExternalDocs = &ExternalDocumentation{}
|
|
||||||
}
|
|
||||||
s.ExternalDocs.Description = description
|
|
||||||
s.ExternalDocs.URL = url
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithXMLName sets the xml name for the object
|
|
||||||
func (s *Schema) WithXMLName(name string) *Schema {
|
|
||||||
if s.XML == nil {
|
|
||||||
s.XML = new(XMLObject)
|
|
||||||
}
|
|
||||||
s.XML.Name = name
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithXMLNamespace sets the xml namespace for the object
|
|
||||||
func (s *Schema) WithXMLNamespace(namespace string) *Schema {
|
|
||||||
if s.XML == nil {
|
|
||||||
s.XML = new(XMLObject)
|
|
||||||
}
|
|
||||||
s.XML.Namespace = namespace
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithXMLPrefix sets the xml prefix for the object
|
|
||||||
func (s *Schema) WithXMLPrefix(prefix string) *Schema {
|
|
||||||
if s.XML == nil {
|
|
||||||
s.XML = new(XMLObject)
|
|
||||||
}
|
|
||||||
s.XML.Prefix = prefix
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsXMLAttribute flags this object as xml attribute
|
|
||||||
func (s *Schema) AsXMLAttribute() *Schema {
|
|
||||||
if s.XML == nil {
|
|
||||||
s.XML = new(XMLObject)
|
|
||||||
}
|
|
||||||
s.XML.Attribute = true
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsXMLElement flags this object as an xml node
|
|
||||||
func (s *Schema) AsXMLElement() *Schema {
|
|
||||||
if s.XML == nil {
|
|
||||||
s.XML = new(XMLObject)
|
|
||||||
}
|
|
||||||
s.XML.Attribute = false
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsWrappedXML flags this object as wrapped, this is mostly useful for array types
|
|
||||||
func (s *Schema) AsWrappedXML() *Schema {
|
|
||||||
if s.XML == nil {
|
|
||||||
s.XML = new(XMLObject)
|
|
||||||
}
|
|
||||||
s.XML.Wrapped = true
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// AsUnwrappedXML flags this object as an xml node
|
|
||||||
func (s *Schema) AsUnwrappedXML() *Schema {
|
|
||||||
if s.XML == nil {
|
|
||||||
s.XML = new(XMLObject)
|
|
||||||
}
|
|
||||||
s.XML.Wrapped = false
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON marshal this to JSON
|
|
||||||
func (s Schema) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(s.SchemaProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("schema props %v", err)
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(s.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("vendor props %v", err)
|
|
||||||
}
|
|
||||||
b3, err := s.Ref.MarshalJSON()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("ref prop %v", err)
|
|
||||||
}
|
|
||||||
b4, err := s.Schema.MarshalJSON()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("schema prop %v", err)
|
|
||||||
}
|
|
||||||
b5, err := json.Marshal(s.SwaggerSchemaProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("common validations %v", err)
|
|
||||||
}
|
|
||||||
var b6 []byte
|
|
||||||
if s.ExtraProps != nil {
|
|
||||||
jj, err := json.Marshal(s.ExtraProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("extra props %v", err)
|
|
||||||
}
|
|
||||||
b6 = jj
|
|
||||||
}
|
|
||||||
return swag.ConcatJSON(b1, b2, b3, b4, b5, b6), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON marshal this from JSON
|
|
||||||
func (s *Schema) UnmarshalJSON(data []byte) error {
|
|
||||||
var sch Schema
|
|
||||||
if err := json.Unmarshal(data, &sch.SchemaProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &sch.Ref); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &sch.Schema); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &sch.SwaggerSchemaProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var d map[string]interface{}
|
|
||||||
if err := json.Unmarshal(data, &d); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
delete(d, "$ref")
|
|
||||||
delete(d, "$schema")
|
|
||||||
for _, pn := range swag.DefaultJSONNameProvider.GetJSONNames(s) {
|
|
||||||
delete(d, pn)
|
|
||||||
}
|
|
||||||
|
|
||||||
for k, vv := range d {
|
|
||||||
lk := strings.ToLower(k)
|
|
||||||
if strings.HasPrefix(lk, "x-") {
|
|
||||||
if sch.Extensions == nil {
|
|
||||||
sch.Extensions = map[string]interface{}{}
|
|
||||||
}
|
|
||||||
sch.Extensions[k] = vv
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if sch.ExtraProps == nil {
|
|
||||||
sch.ExtraProps = map[string]interface{}{}
|
|
||||||
}
|
|
||||||
sch.ExtraProps[k] = vv
|
|
||||||
}
|
|
||||||
|
|
||||||
*s = sch
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
142
vendor/github.com/go-openapi/spec/security_scheme.go
generated
vendored
142
vendor/github.com/go-openapi/spec/security_scheme.go
generated
vendored
@ -1,142 +0,0 @@
|
|||||||
// Copyright 2015 go-swagger maintainers
|
|
||||||
//
|
|
||||||
// Licensed 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 spec
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/go-openapi/jsonpointer"
|
|
||||||
"github.com/go-openapi/swag"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
basic = "basic"
|
|
||||||
apiKey = "apiKey"
|
|
||||||
oauth2 = "oauth2"
|
|
||||||
implicit = "implicit"
|
|
||||||
password = "password"
|
|
||||||
application = "application"
|
|
||||||
accessCode = "accessCode"
|
|
||||||
)
|
|
||||||
|
|
||||||
// BasicAuth creates a basic auth security scheme
|
|
||||||
func BasicAuth() *SecurityScheme {
|
|
||||||
return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: basic}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// APIKeyAuth creates an api key auth security scheme
|
|
||||||
func APIKeyAuth(fieldName, valueSource string) *SecurityScheme {
|
|
||||||
return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: apiKey, Name: fieldName, In: valueSource}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// OAuth2Implicit creates an implicit flow oauth2 security scheme
|
|
||||||
func OAuth2Implicit(authorizationURL string) *SecurityScheme {
|
|
||||||
return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{
|
|
||||||
Type: oauth2,
|
|
||||||
Flow: implicit,
|
|
||||||
AuthorizationURL: authorizationURL,
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// OAuth2Password creates a password flow oauth2 security scheme
|
|
||||||
func OAuth2Password(tokenURL string) *SecurityScheme {
|
|
||||||
return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{
|
|
||||||
Type: oauth2,
|
|
||||||
Flow: password,
|
|
||||||
TokenURL: tokenURL,
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// OAuth2Application creates an application flow oauth2 security scheme
|
|
||||||
func OAuth2Application(tokenURL string) *SecurityScheme {
|
|
||||||
return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{
|
|
||||||
Type: oauth2,
|
|
||||||
Flow: application,
|
|
||||||
TokenURL: tokenURL,
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
// OAuth2AccessToken creates an access token flow oauth2 security scheme
|
|
||||||
func OAuth2AccessToken(authorizationURL, tokenURL string) *SecurityScheme {
|
|
||||||
return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{
|
|
||||||
Type: oauth2,
|
|
||||||
Flow: accessCode,
|
|
||||||
AuthorizationURL: authorizationURL,
|
|
||||||
TokenURL: tokenURL,
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
type SecuritySchemeProps struct {
|
|
||||||
Description string `json:"description,omitempty"`
|
|
||||||
Type string `json:"type"`
|
|
||||||
Name string `json:"name,omitempty"` // api key
|
|
||||||
In string `json:"in,omitempty"` // api key
|
|
||||||
Flow string `json:"flow,omitempty"` // oauth2
|
|
||||||
AuthorizationURL string `json:"authorizationUrl,omitempty"` // oauth2
|
|
||||||
TokenURL string `json:"tokenUrl,omitempty"` // oauth2
|
|
||||||
Scopes map[string]string `json:"scopes,omitempty"` // oauth2
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddScope adds a scope to this security scheme
|
|
||||||
func (s *SecuritySchemeProps) AddScope(scope, description string) {
|
|
||||||
if s.Scopes == nil {
|
|
||||||
s.Scopes = make(map[string]string)
|
|
||||||
}
|
|
||||||
s.Scopes[scope] = description
|
|
||||||
}
|
|
||||||
|
|
||||||
// SecurityScheme allows the definition of a security scheme that can be used by the operations.
|
|
||||||
// Supported schemes are basic authentication, an API key (either as a header or as a query parameter)
|
|
||||||
// and OAuth2's common flows (implicit, password, application and access code).
|
|
||||||
//
|
|
||||||
// For more information: http://goo.gl/8us55a#securitySchemeObject
|
|
||||||
type SecurityScheme struct {
|
|
||||||
VendorExtensible
|
|
||||||
SecuritySchemeProps
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSONLookup implements an interface to customize json pointer lookup
|
|
||||||
func (s SecurityScheme) JSONLookup(token string) (interface{}, error) {
|
|
||||||
if ex, ok := s.Extensions[token]; ok {
|
|
||||||
return &ex, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
r, _, err := jsonpointer.GetForToken(s.SecuritySchemeProps, token)
|
|
||||||
return r, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON marshal this to JSON
|
|
||||||
func (s SecurityScheme) MarshalJSON() ([]byte, error) {
|
|
||||||
b1, err := json.Marshal(s.SecuritySchemeProps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
b2, err := json.Marshal(s.VendorExtensible)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return swag.ConcatJSON(b1, b2), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON marshal this from JSON
|
|
||||||
func (s *SecurityScheme) UnmarshalJSON(data []byte) error {
|
|
||||||
if err := json.Unmarshal(data, &s.SecuritySchemeProps); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := json.Unmarshal(data, &s.VendorExtensible); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user